67

私はそれを持っUITabbarControllerUINavigationControllerいます。UIViewのとして割り当てたviewのサブクラスがUIViewControllerありnavControllerます。これはかなり標準的なものですよね?これが私のやり方です

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

これにviewUITableViewsubView

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

デバッグのためself.backgroundColor = [UIColor blueColor]に、ビューを設定しています。

上記の初期化から、ビューとテーブルは同じtableViewであると考えるかもしれません。frameただし、 を実行するiOS 7と、ビューの原点が の後ろに設定されますUINavigationBarself.navigationBar.translucent = YES;のサブクラスで設定しているので、これは理解できUINavigationControllerます。しかし、私が理解していないのは、テーブルが のすぐ下にある理由navBarです。(0, 0)後ろのどちらからでも始めるべきではないnavBarですか?以下のスクリーンショットを参照してくださいScenario 1。背後の青い色合いに注意してくださいnavBar

シナリオ 1

さてpushviewController単に[self.navigationController pushViewController.....]. 繰り返しますが、私にはその中にある習慣UIViewがありtableViewます。ただし、この表の上にも があり、UILabelデバッグ用に を付けましたredColor。今回は、ラベルoriginをビューとほぼ同じになるように設定しています

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);

上のロジックからすると、ラベルは見えるはずですよね?しかし、今回はそうではありません。今回はラベルが の後ろにありnavBarます。

シナリオ - 2

navBar の背後にある赤い色合いに注目してください。

subView を 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?

4

3 に答える 3

140

デフォルトでは、UITableViewController のビューは iOS7 で自動的に挿入されるため、ナビゲーション バー/ステータス バーの下から開始することはありません。Interface BuilderのUITableViewControllerのAttributes Inspectorタブの「Adjust scroll view insets」設定、またはsetAutomaticallyAdjustsScrollViewInsets:UIViewControllerのメソッドによるコントローラーです。

UIViewController のコンテンツについて、そのビューのコンテンツを上部/下部バーの下に拡張したくない場合は、Interface Builder で [上部バーの下/下部バーの下にエッジを拡張] 設定を使用できます。宿泊施設からアクセスできedgesForExtendedLayoutます。

于 2013-10-02T18:03:01.477 に答える
120

目的 C:

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

スウィフト 2:

self.edgesForExtendedLayout = UIRectEdge.None

スウィフト 3+:

self.edgesForExtendedLayout = []
于 2014-12-18T07:36:12.487 に答える
10

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

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    viewController.edgesForExtendedLayout = UIRectEdge.None
}
于 2016-03-04T17:15:27.780 に答える