UITableViewController表头添加带有Autolayout约束的UIButton

时间:2016-07-09 11:20:32

标签: ios objective-c iphone xcode uitableview

我尝试将UIButton添加到UITableHeaderFooterView。

似乎我只能使用特定的CGRect框架来固定其在代码中的位置和大小(< - 在StackOverFlow上进行了大量搜索)。而且这个位置很难控制,总是飞来飞去。

UIButton *scanQRCodeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
scanQRCodeButton.frame = CGRectMake(0.0f, 5.0f, 320.0f, 44.0f);
scanQRCodeButton.backgroundColor = [UIColor redColor];
[scanQRCodeButton setTitle:@"Hello" forState:UIControlStateNormal];    
[cell addSubview:scanQRCodeButton];

但我真正想要的是使用像centerX,centerY和比例宽度这样的“约束”来使其适应不同的屏幕尺寸。然后问题出现在“constraintWithItems”部分:

从UITableView获取headerView:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    static NSString *headerReuseIdentifier = @"TableViewSectionHeaderViewIdentifier";

    // Reuse the instance that was created in viewDidLoad, or make a new one if not enough.
    UITableViewHeaderFooterView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:headerReuseIdentifier];
    if (headerView == nil) {
        [tableView registerClass:[UITableViewHeaderFooterView class] forHeaderFooterViewReuseIdentifier:@"TableViewSectionHeaderViewIdentifier"];
        headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"TableViewSectionHeaderViewIdentifier"];
    }

    headerView.textLabel.text = @"MISSION";
    headerView.contentView.backgroundColor = [UIColor blackColor];

在与上面相同的块中的headerView顶部创建UIButton:

UIButton *goBack = [[UIButton alloc] init];
    [goBack setImage:[UIImage imageNamed:@"Back"] forState:UIControlStateNormal];
    [goBack addTarget:self
           action:@selector(back:)
 forControlEvents:UIControlEventTouchUpInside];

    [headerView addSubview:goBack];

然后设置约束并返回headerView:

NSLayoutConstraint *constraint = [NSLayoutConstraint
                                  constraintWithItem:headerView.goBack
                                  attribute:NSLayoutAttributeWidth
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:self.view
                                  attribute:NSLayoutAttributeCenterX
                                  multiplier:0.5
                                  constant:0];
    [headerView addConstraint:constraint];
    return headerView;

问题:当我在“constraintWithItem”中说“headerView.goBack”时,编译器警告我“在UITableHeaderFooterView类型的对象上找不到属性goBack”。

更新1

根据Natarajan的回答,我现在尝试这样做:

    headerView.translatesAutoresizingMaskIntoConstraints = false;
    goBack.translatesAutoresizingMaskIntoConstraints = false;
    NSDictionary *metrics   = @{ @"width"           :   @(CGRectGetWidth(self.view.frame) / 10) };
    [headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[goBack]|" options:0 metrics:metrics   views:@{@"goBack":goBack}]];
    [headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[goBack]|" options:0 metrics:metrics views:@{@"goBack":goBack}]];

当前问题:“指标”部分不起作用。我希望与headerView或tableView具有比例宽度而不是固定数字。我应该使用“self.view.frame”(也试过self.tableView.frame)?

更新2

现在headerView也存在问题。如果我使用“headerView.translatesAutoresizingMaskIntoConstraints = false;”,我还需要手动设置headerView的位置。但是,使用以下代码,仍然无法正确设置headerView。我试图先将它添加到tableView中,然后将其设置为与UIButton相同的方式,但它的工作方式不同。

[headerView addSubview:goBack];
[tableView addSubview:headerView];

headerView.translatesAutoresizingMaskIntoConstraints = false;
goBack.translatesAutoresizingMaskIntoConstraints = false;

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[goBack(40.0)]|" options:0 metrics:nil views:@{@"goBack":goBack}]];
[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[goBack(40.0)]|" options:0 metrics:nil views:@{@"goBack":goBack}]];
[tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[headerView]|" options:0 metrics:nil views:@{@"headerView":headerView}]];
[tableView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[headerView]|" options:0 metrics:nil views:@{@"headerView":headerView}]];

2 个答案:

答案 0 :(得分:0)

我认为“goBack”无法作为headerView属性访问。试着找到它。

    for (UIView *view in headerView.contentView.subviews) {
        if ([view isKindOfClass:[UIButton class]]) {
            //found button
        }
    }

答案 1 :(得分:0)

编译器警告是正确的,因为UITableViewHeaderFooterView没有名为" goBack"您刚刚添加为UITableViewHeaderFooterView的子视图。所以试着通过" goBack"约束代码中的按钮如下所示。

设置在HeaderView上完全占用的goBack按钮:

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[goBack]|" options:0 metrics:nil views:@{@"goBack":goBack}]];

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[goBack]|" options:0 metrics:nil views:@{@"goBack":goBack}]];

设置特定宽度和高度的goBack按钮:

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[goBack(40.0)]" options:0 metrics:nil views:@{@"goBack":goBack}]];

[headerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[goBack(30.0)]" options:0 metrics:nil views:@{@"goBack":goBack}]];

注意:在添加约束之前,请不要忘记设置headerView.translatesAutoresizingMaskIntoConstraints = false;goBack.translatesAutoresizingMaskIntoConstraints = false;