2013-10-02 15 views
54

UITabbarControllerUINavigationControllerです。私はUIViewのサブクラスを持っていて、navControllerUIViewControllerviewとして割り当てます。これはかなり標準的なものですよね?これは私がそれを行う方法なぜUITableViewControllerはUINavigationBarの下でUIViewControllerを拡張しますか?

_productCategoryView = [[ProductCategoryView alloc] initWithFrame:self.view.frame]; 
self.view = _productCategoryView; 

あるこのviewは私がビューにself.backgroundColor = [UIColor blueColor]を設定していますデバッグのためにUITableView

subViewとして
_productCategoryTableView = [[UITableView alloc] initWithFrame:self.frame style:UITableViewStylePlain]; 
_productCategoryTableView.separatorStyle = UITableViewCellSeparatorStyleNone; 
_productCategoryTableView.backgroundColor = [UIColor clearColor]; 
[self addSubview:_productCategoryTableView]; 

を持っています。

tableViewの上記の初期化から、ビューとテーブルのframeは同じだと思うかもしれません。しかし、iOS 7で実行すると、ビューの起点はUINavigationBarの後ろに設定されます。これは私のサブクラスでをUINavigationControllerに設定しているために理解できます。しかし、私が理解していないのは、テーブルがnavBarのすぐ下に座っていることです。 navBarの後ろにある(0, 0)から始めるべきではありませんか?以下のスクリーンショットScenario 1を参照してください。私は単に[self.navigationController pushViewController.....]を使用することにより、ナビゲーションスタック上の別のviewControllerpush、今navBar

Scenario 1

の背後にある青の色相に注目してください。繰り返しますが、UIViewにはtableViewのカスタムがあります。しかし、私もUILabelがこのテーブルの上にあり、デバッグのために、私はredColorを与えました。私は、ビューの

CGRect boundsInset = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(10, 10, 10, 10)); 

CGSize textSize = [_titleLabel.text sizeWithFont:_titleLabel.font 
           constrainedToSize:CGSizeMake(boundsInset.size.width, MAXFLOAT) 
            lineBreakMode:NSLineBreakByWordWrapping]; 
printSize(textSize); 
_titleLabel.frame = CGRectMake(boundsInset.origin.x, 
           boundsInset.origin.y, 
           boundsInset.size.width, 
           textSize.height); 

とほぼ同じになるように、ラベルのoriginを設定しています。この時間は、上記の論理で行く、ラベルが右に、目に見えるすべきですか?しかし今回はそうではありません。今回はラベルがnavBarの背後にあります。

Scenario - 2

お知らせ、ナビゲーションバーの背後にある赤の色相。

私は実際にnavBarの下のサブビューを一貫して整列させたいと思います。私の質問は、彼らがナビゲーションバー/ステータスバーの下に起動しないように、デフォルトで

1. How is the tableView offset by 64pixels (height of nav + status bar in iOS 7) automatically, even though it's frame is same as the view's?

2. Why does that not happen in the second view?

+0

Xcode 5とiOS7 SDKでビルドしていますか? –

答えて

128

は、のUITableViewControllerのビューは自動的iOS7にはめ込まれています。これは、Interface BuilderのUITableViewControllerのAttributes InspectorタブまたはUIViewControllerのsetAutomaticallyAdjustsScrollViewInsets:メソッドの "Adjust scroll view insets"設定によるコントローラです。

UIViewControllerの内容については、ビューの内容を上/下のバーの下に広げたくない場合は、Interface Builderの上のバー/下のバーの下にあるエッジを拡張設定を使用できます。これはedgesForExtendedLayoutプロパティからアクセスできます。

+48

ありがとう@Greg。 'self.edgesForExtendedLayout = UIRectEdgeNone;を設定すると、そのトリックを行いました。 – unspokenblabber

+0

ありがとうございます。 edgesForExtendedLayoutのアドレッシングが完了しました。私のために、サブビューオブナビゲーターレイアウトの問題を解決しました。過去8ヶ月間にこれに無限の時間を費やしていました。 – ObjectiveTC

+1

navigationControllerでプッシュトランジションを実行すると、ナビゲーションバーに「遅延」色処理が適用されていることがわかりました。これを引き起こす原因とそれを取り除く方法は? – ArdenDev

89
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 

スウィフト2:

self.edgesForExtendedLayout = UIRectEdge.None 

スウィフト3:

self.edgesForExtendedLayout = [] 
+0

、ありがとうございます! –

+1

最も有用な答え。 – yujean

+0

'self.edgesForExtendedLayout = []'を設定すると、 'UINavigationBar'色が変更されます。 – Hemang

9

Gankの答えは正しいのですが、これを実行するのに最適な場所はUINavigationControllerDelegateにある@(お持ちの場合) :

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
    viewController.edgesForExtendedLayout = UIRectEdge.None 
} 
+2

これは、カスタムスーパービューコントローラを回避します。とてもクール。 – Jaybo

+0

@Jayboありがとう、はい、コードを置く場所は大きな意味を持っています。 –

関連する問題