自定义视图不适合 UItableview 中的标题

Posted

技术标签:

【中文标题】自定义视图不适合 UItableview 中的标题【英文标题】:Custom view is not fit to header in UItableview 【发布时间】:2016-07-21 06:15:57 【问题描述】:

您好,我尝试在 tableview 标题上设置自定义视图,但自定义视图不适合标题。

自定义视图如下图所示,在此图像中,自定义视图为橙色,标题视图为灰色。但我希望自定义视图充满标题视图。

请帮忙。

我的代码:

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

        UIView *sectionView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, _TableList.frame.size.width, 80)];
        header = [[HeaderView alloc] initWithFrame:CGRectMake(sectionView.frame.origin.x, sectionView.frame.origin.y, sectionView.frame.size.width, sectionView.frame.size.height)];
        [sectionView addSubview:header];
        sectionView.tag=section;
        sectionView.backgroundColor = [UIColor grayColor];

        UITapGestureRecognizer  *headerTapped   = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sectionHeaderTapped:)];
        [sectionView addGestureRecognizer:headerTapped];

        return  sectionView;
    

【问题讨论】:

我认为您需要为此使用自动布局 你能用一些代码解释一下吗 你为什么使用两个视图?只需保留 headerView 并像这样设置它的框架 - UIView *sectionView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, _TableList.bounds.size.width, 80)]; 嗨 Bharat Modi,我正在采用自定义视图以避免在此应用字段时在标题上进行编程编码 我的代码有用吗? 【参考方案1】:

如果您使用 Xib 将自定义视图加载为节标题,则执行如下代码:

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

    HeaderView *headerview = [[[NSBundle mainBundle] loadNibNamed:@"SecHeader"
                                                            owner:self
                                                          options:nil] objectAtIndex:0];
    headerview.frame = CGRectMake(0, 0, tableView.frame.size.width, 80);

    UITapGestureRecognizer  *headerTapped   = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sectionHeaderTapped:)];
    [headerview addGestureRecognizer:headerTapped];

    return headerview;

【讨论】:

很高兴为您提供帮助! @Anilkumar @Anilkumar 如果故事板解决方案对您有帮助,那么您也可以投票...谢谢【参考方案2】:

您可以使用 UITableViewHeaderFooterView. 将您的自定义视图创建为 UITableViewHeaderFooterView 的子类。 使用适当的约束。现在将此视图用作标题视图。

YourHeaderView *YourHeaderView = [self.tableView dequeueReusableHeaderFooterViewWithIdentifier:@"YourHeaderViewIdentifier"];

【讨论】:

我有同样的错误,当我在 iPhone 5 上启动它时,我的 customHeaderView 宽度不在屏幕上,但是如何在我的 customHeaderView: UITableViewHeaderFooterView 和 tableView 宽度之间进行约束?我应该在 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView 中执行吗? ... @Konstantin 您的 customHeaderView 只不过是 UITableViewHeaderFooterView。因此,当您将约束应用于其子视图时,它们应该可以正常工作。 我想我知道是什么导致了这个问题,我的 customHeaderView 有 xib,它是 UITableViewCell 而不是 UIView,但我还没有尝试过。在 5 或 5s 等上使用时,仍然 Header 宽度大于 iPhone 屏幕宽度。【参考方案3】:

尝试使用自动布局

[header setTranslatesAutoresizingMaskIntoConstraints:NO];
NSDictionary *views = NSDictionaryOfVariableBindings(header);
NSArray *horizontalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[header]-|" options:0 metrics:nil views:views];
NSArray *verticalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[header]-|" options:0 metrics:nil views:views];
[sectionView addConstraints:horizontalConstraints];
[sectionView addConstraints: verticalConstraints];

您的代码将如下所示

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

        UIView *sectionView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, _TableList.frame.size.width, 80)];
        [header setTranslatesAutoresizingMaskIntoConstraints:NO];
        header = [[HeaderView alloc] init];
        [sectionView addSubview:header];

        NSDictionary *views = NSDictionaryOfVariableBindings(header);
        NSArray *horizontalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[header]-|" options:0 metrics:nil views:views];
        NSArray *verticalConstraints =[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[header]-|" options:0 metrics:nil views:views];

        [sectionView addConstraints:horizontalConstraints];
        [sectionView addConstraints: verticalConstraints];

        sectionView.tag=section;
        sectionView.backgroundColor = [UIColor grayColor];

        UITapGestureRecognizer  *headerTapped   = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sectionHeaderTapped:)];
        [sectionView addGestureRecognizer:headerTapped];

        return  sectionView;
    

【讨论】:

感谢回复,我应用了这个代码,但同样的问题来了。 会出现什么问题? 相同的自定义视图不适用于我上面提到的标题【参考方案4】:

在viewForHeaderInSection中

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

UILabel *labelSection;
UIView  *viewSection = [[UIView alloc]init];
viewSection.frame = CGRectMake(0, 0, tableview.frame.size.width, 20);
labelSection = [[UILabel alloc]init];
labelSection.textAlignment = NSTextAlignmentLeft;
labelSection.frame = CGRectMake(10, 5, tableview.frame.size.width, 20);

[labelSection setBackgroundColor:[UIColor clearColor]];
[labelSection setFont:[UIFont boldSystemFontOfSize:15]];
NSString *name = @"section title";
labelSection.text = name;
[viewSection setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"imageName"]]];
[labelSection setTextColor:[UIColor whiteColor]];
[viewSection addSubview:labelSection];
return viewSection;

【讨论】:

【参考方案5】:

如果您使用故事板,则将视图创建为 tableview 单元格

    拖放2个tableview单元格 将一个单元格设计为标题视图,其他单元格将用作表格视图列表单元格。并为每个单元格的子视图自动布局。

现在从如下界面为每个单元格提供不同的单元格标识符

现在在 tableview 的标题视图委托中使用视图中的此单元格。

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

    static NSString *identifier = @"SectionHeader";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    return cell;

希望对你有帮助!

【讨论】:

以上是关于自定义视图不适合 UItableview 中的标题的主要内容,如果未能解决你的问题,请参考以下文章

一个 UIViewController 中的自定义单元格 tableview 和默认 UITableView

从 UITableView 中删除自定义视图

UITableView中的自定义单元类与静态单元格

UITableview 单元格保留自定义图像视图过滤器

从自定义单元格访问父视图

UITableView 中的自定义绘图在 5 个单元格后失败