iOS 向表格部分标题添加约束

原文 标签 ios objective-c uitableview constraints

我正在处理一个分组表,并使用 tableView: viewForHeaderInSection: 方法自定义部分中的标题,并使用 tableView: heightForHeaderInSection: 设置高度。

我创建了一个 View 并在其中放置了一个标签,如下所示:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {


    // Create a custom title view.
    UIView *ctv;
    UILabel *titleLabel;

    // Set the name.
    {...} // Code not relevant

    // If an iPhone.
    if ([Config isPhone]) {
        ctv = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
        titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 14, 320, 36)];
    }
    // If an iPad
    else {
        ctv = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 768, 75)];
        titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 544, 55)];
    }

    // Config the label.
    {...} // Code not relevant

    // Center the items.
    ctv.center = CGPointMake(tableView.center.x, ctv.center.y);
    titleLabel.center = ctv.center;

    // Add the label to the container view.
    [ctv addSubview:titleLabel];

    // Return the custom title view.
    return ctv;


}

这一切都很好,直到您旋转屏幕。位置已关闭。我意识到这是因为 View 在另一个方向上居中,导致中心的计算不再正确。解决方案应该是添加约束。我尝试添加以下约束:
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(ctv);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|[ctv]|"
                         options:0
                         metrics:nil
                         views:viewsDictionary
                       ];
[tableView addConstraints:constraints];

但是,当我尝试使用下面的方法执行此操作时,我发现没有父 View 与之关联,这完全有道理,因为从技术上讲,它并未添加到返回的 View 中。所以我想我会尝试以这种方式添加约束:
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:ctv
                                     attribute:NSLayoutAttributeCenterX
                                     relatedBy:NSLayoutRelationEqual
                                        toItem:tableView
                                     attribute:NSLayoutAttributeCenterX
                                    multiplier:1.0
                                      constant:0
                                      ];
[tableView addConstraint:constraint];

但是这个也有错误。我试过将 tableView 变量切换到全局表属性,但它给出了相同的结果。我还试图弄清楚如何在 View 中添加约束 did load 方法,但它失败了,因为我无法弄清楚如何从表对象返回到表的部分标题。我的最后一个想法是在约束中设置表格的宽度,并设置一个以将整个表格居中。这个过程有效,但现在我的应用程序中间有一个丑陋的滚动条,当它处于横向时。所以问题是,在加载单个部分标题以添加此约束后,我在哪里/如何访问它们?我对 Objective-C 还是很陌生,所以感谢任何帮助。

***** 基于 rdelmar 建议的新代码 ****
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *ctv = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"groupHeader"];
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 544, 55)];
    [titleLabel setTranslatesAutoresizingMaskIntoConstraints: NO];
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:ctv
                                        attribute:NSLayoutAttributeCenterX
                                        relatedBy:0
                                          toItem:titleLabel
                                        attribute:NSLayoutAttributeCenterX
                                       multiplier:1.0
                                         constant:0
                                      ];
    [ctv addConstraints:@[constraint]];
    titleLabel.text = @"string";
    [ctv addSubview:titleLabel];
    return ctv;
}

但就像我提到的,它给了我一个“约束必须包含第一个布局项”错误。

最佳答案

我在最近的一个项目中这样做是为了添加一个标签和一个 UIActivityIndi​​catorView:

-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *headerView = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Header"];
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0,0, 250, 20)];
    [label setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:headerView attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:label attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:headerView attribute:NSLayoutAttributeLeft relatedBy:0 toItem:label attribute:NSLayoutAttributeLeading multiplier:1 constant:-10];
    [headerView addConstraints:@[con1,con2]];
    label.text = @"Pick an Activity from the List";
    label.backgroundColor = [UIColor clearColor];
    [headerView addSubview:label];
    spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    [spinner setTranslatesAutoresizingMaskIntoConstraints:NO];
    if (activityIndicatorShouldStop == NO) [spinner startAnimating];
    [headerView addSubview:spinner];
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:headerView attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:spinner attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:headerView attribute:NSLayoutAttributeRight relatedBy:0 toItem:spinner attribute:NSLayoutAttributeTrailing multiplier:1 constant:10];
    [headerView addConstraints:@[con3,con4]];
    return headerView;
}

关于iOS 向表格部分标题添加约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14612546/

相关文章:

ios - iOS-iPad Storyboard上的详细 View 未填充

ios - 在Objective-C文件中调用Swift API

ios - 当按钮接收到事件时,UITapGestureRecognizer 到 cellForRowAt

iphone - 如何控制表格 View 的滚动速度?

objective-c - iOS-FMDB使用和内存

html - 是否可以在iOS Safari中同时播放2个在线视频?

ios - 如何在不使用临时文件的情况下在 UIWebview 中打开受密码保护的 PDF/DOC?

ios - 如何从tableview自定义单元格中的url加载两个图像

ios - 当我点击 MapKit 中的图钉时如何执行操作? ios 9,快速 2

ios - 如何更改按钮大小?