我尝试将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}]];
答案 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;