gpt4 book ai didi

iphone - 使用动态大小的 subview 调整 UIView 子类的大小

转载 作者:行者123 更新时间:2023-12-03 19:14:54 26 4
gpt4 key购买 nike

我目前有一个 UIView 子类,它充当 UITableViewController 的标题 View 。所有 subview 的大小都会有所不同,具体取决于为特定项目检索的数据。

在我确定每个标签的大小之前,UIView 会调用layoutSubViews。这会导致问题,因为我在layoutSubViews方法中设置了 View 的大小。由于它在我设置标签之前被调用,因此 View 高度始终为 0。即使在设置标签之后我调用 setNeedsLayout 但 TableView 标题大小也不会改变。

这将创建我的 TableHeaderView 并设置标签的文本。

    TableHeaderView *tableHeaderView = [[TableHeaderView alloc] initWithFrame:CGRectZero];
tableHeaderView.headerTitle.text = title;
tableHeaderView.headerOption1.text = headerOption1
tableHeaderView.headerOption2.text = headerOption2
tableHeaderView.headerOption3.text = headerOption3

[[self tableView] setTableHeaderView:tableHeaderView];

[tableHeaderView setNeedsLayout];
[tableHeaderView release];

这是我的 UIView 子类

- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {

UIView *headerView = self;

self.headerTitle = [[UILabel alloc] initWithFrame:CGRectZero];
self.headerTitle.numberOfLines = 3;
self.headerTitle.lineBreakMode = UILineBreakModeWordWrap;
[headerView addSubview:self.headerTitle];
[self.headerTitle release];

self.headerOption1 = [[UILabel alloc] initWithFrame:CGRectZero];
self.headerOption1.numberOfLines = 2;
self.headerOption1.lineBreakMode = UILineBreakModeWordWrap;
[headerView addSubview:self.headerOption1];
[self.headerOption1 release];
}
return self;
}

- (void)layoutSubviews {

[super layoutSubviews];

CGSize maxLabelSize;

/*...*/

[self.headerTitle setFrame:CGRectMake(10.0f, 10.0f, titleWidth, titleHeight)];

/*...*/

[self.headerOption1 setFrame:CGRectMake(10.0f, (self.headerTitle.frame.origin.y + self.headerTitle.bounds.size.height + 2.5f), pubWidth, pubHeight)];

/*...*/
[self setFrame:CGRectMake(0.0f, 0.0f, 320.0f, tableHeaderHeight)];
}

第二次调用layoutSubViews时,除了 View 本身之外,所有 subview 的大小都正确(tableHeaderHeight具有正确的高度)。我不应该通过这种方法调整 View 大小吗?有更好的方法吗?

最佳答案

您可能需要覆盖 sizeThatFits:在您的 UIView 子类上,根据您的布局返回适当的大小。

像这样使用它:

TableHeaderView *tableHeaderView = [[TableHeaderView alloc] initWithFrame:CGRectZero];
tableHeaderView.headerTitle.text = title;
tableHeaderView.headerOption1.text = headerOption1
tableHeaderView.headerOption2.text = headerOption2
tableHeaderView.headerOption3.text = headerOption3

tableHeaderView.frame = (CGRect){
.origin = tableHeaderView.frame.origin,
.size = [tableHeaderView sizeThatFits:CGSizeZero],
};

[[self tableView] setTableHeaderView:tableHeaderView];

[tableHeaderView setNeedsLayout]; // I don't think you need this anymore.
[tableHeaderView release];

关于iphone - 使用动态大小的 subview 调整 UIView 子类的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3974951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com