UITableViewController:在iOS 7上以编程方式自动布局错误

时间:2015-03-21 12:05:29

标签: ios uitableview ios7 autolayout

我希望以编程方式将UIView添加到使用自动布局的UITableViewController ...

我在viewDidLoad的{​​{1}}内有以下代码:

UITableViewController

如果我现在在iOS 8上运行应用程序 一切正常:

running on iOS 8


如果我在iOS 7上运行 ,应用程序崩溃并出现以下错误:

UIView *centerView = [[UIView alloc] init]; [centerView setTranslatesAutoresizingMaskIntoConstraints:NO]; centerView.backgroundColor = [UIColor greenColor]; [self.view addSubview:centerView]; // Width constraint, half of parent view width [self.view addConstraint:[NSLayoutConstraint constraintWithItem:centerView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0]]; // Height constraint, half of parent view height [self.view addConstraint:[NSLayoutConstraint constraintWithItem:centerView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:0.5 constant:0]]; // Center horizontally [self.view addConstraint:[NSLayoutConstraint constraintWithItem:centerView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; // Center vertically [self.view addConstraint:[NSLayoutConstraint constraintWithItem:centerView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]];

如果我将*** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8794设置为setTranslatesAutoresizingMaskIntoConstraints,该应用也会因此通知而崩溃:YES

2 个答案:

答案 0 :(得分:4)

好的,看起来UITableView在iOS 7上不支持Autolayout。所以我们必须使用自动调整掩码。我的想法是将带有自动调整功能掩码的containerView作为tableview的子视图,并将centerView

放在其中

代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setupBackgroundView];
}

- (void)setupBackgroundView
{
    UIView *backgroundContainerView = [[UIView alloc] initWithFrame:CGRectZero];
    backgroundContainerView.backgroundColor = [UIColor cyanColor];
    backgroundContainerView.frame = self.tableView.bounds;
    backgroundContainerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [self.view addSubview:backgroundContainerView];


    UIView *centerView = [[UIView alloc] initWithFrame:CGRectZero];
    centerView.translatesAutoresizingMaskIntoConstraints = NO;
    centerView.backgroundColor = [UIColor greenColor];

    [backgroundContainerView addSubview:centerView];

    [backgroundContainerView addConstraint:[NSLayoutConstraint constraintWithItem:centerView
                                                                        attribute:NSLayoutAttributeWidth
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:backgroundContainerView
                                                                        attribute:NSLayoutAttributeWidth
                                                                       multiplier:0.5
                                                                         constant:0]];

    // Height constraint, half of parent view height
    [backgroundContainerView addConstraint:[NSLayoutConstraint constraintWithItem:centerView
                                                                        attribute:NSLayoutAttributeHeight
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:backgroundContainerView
                                                                        attribute:NSLayoutAttributeHeight
                                                                       multiplier:0.5
                                                                         constant:0]];

    // Center horizontally
    [backgroundContainerView addConstraint:[NSLayoutConstraint constraintWithItem:centerView
                                                                        attribute:NSLayoutAttributeCenterX
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:backgroundContainerView
                                                                        attribute:NSLayoutAttributeCenterX
                                                                       multiplier:1.0
                                                                         constant:0.0]];

    // Center vertically
    [backgroundContainerView addConstraint:[NSLayoutConstraint constraintWithItem:centerView
                                                                        attribute:NSLayoutAttributeCenterY
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:backgroundContainerView
                                                                        attribute:NSLayoutAttributeCenterY
                                                                       multiplier:1.0
                                                                         constant:0.0]];

}

现在centerView在表格视图滚动时移动。如果您想修复内容并将内容悬停在上方,则应使用backgroundView上的UITableView

- (void)setupBackgroundView
{
    UIView *backgroundContainerView = [[UIView alloc] initWithFrame:CGRectZero];
    backgroundContainerView.backgroundColor = [UIColor cyanColor];

    UIView *centerView = [[UIView alloc] initWithFrame:CGRectZero];
    centerView.translatesAutoresizingMaskIntoConstraints = NO;
    centerView.backgroundColor = [UIColor greenColor];

    [backgroundContainerView addSubview:centerView];

    [backgroundContainerView addConstraint:[NSLayoutConstraint constraintWithItem:centerView
                                                                        attribute:NSLayoutAttributeWidth
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:backgroundContainerView
                                                                        attribute:NSLayoutAttributeWidth
                                                                       multiplier:0.5
                                                                         constant:0]];

    // Height constraint, half of parent view height
    [backgroundContainerView addConstraint:[NSLayoutConstraint constraintWithItem:centerView
                                                                        attribute:NSLayoutAttributeHeight
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:backgroundContainerView
                                                                        attribute:NSLayoutAttributeHeight
                                                                       multiplier:0.5
                                                                         constant:0]];

    // Center horizontally
    [backgroundContainerView addConstraint:[NSLayoutConstraint constraintWithItem:centerView
                                                                        attribute:NSLayoutAttributeCenterX
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:backgroundContainerView
                                                                        attribute:NSLayoutAttributeCenterX
                                                                       multiplier:1.0
                                                                         constant:0.0]];

    // Center vertically
    [backgroundContainerView addConstraint:[NSLayoutConstraint constraintWithItem:centerView
                                                                        attribute:NSLayoutAttributeCenterY
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:backgroundContainerView
                                                                        attribute:NSLayoutAttributeCenterY
                                                                       multiplier:1.0
                                                                         constant:0.0]];

    self.tableView.backgroundView = backgroundContainerView;

}

答案 1 :(得分:0)

尝试从代码中删除此行一次,然后构建。

[centerView setTranslatesAutoresizingMaskIntoConstraints:NO];