刚刚开始使用iOS开发,所以我希望我能在这里获得正确的详细信息......
我有一个UILabel
,加载到通过.xib创建的表格单元格中。实际上是几个标签,其中一个标签长度不同(因此包装高度不同)。已正确覆盖heightForRowAtIndexPath
等,并且正确计算了两个标签所需的高度,并将其分配给每个.frame
一旦设置了两个尺寸,我设置较小(固定长度,总是一行高)标签的frame.origin.y以匹配较大标签的尺寸。这可以看作逐步通过cellForRowAtIndexPath
,但是在新创建的单元格的初始显示中,原点似乎在容器中不是完全垂直居中,而不是顶部向上。
单击“穿过”单元格到另一个视图,然后返回到(现在重用,并且可能已经是正确大小的容器),位置设置为之前,它出现在我预期的位置。< / p>
似乎就像在cellForRowAtIndexPath
返回后容器正在调整大小一样,并且在那里的某处找到了我们标签的新位置;这可以解释为什么以后重复使用单元格可以解决问题。
我已经尝试了内外模式和基线设置,拉伸设置等各种明显合理的组合。无法解释和/或解决方法。
更新
关于Changing the position of custom UIButton in custom UITableViewCell问题的建议解决了这个问题。解决方案是继承UITableViewCell
并覆盖layoutSubviews
,从而有机会在TableView完成正常定位后重新定位子元素。一旦这个人在这里做出回应,或者赏金到期,我会用代码回答自己。
答案 0 :(得分:6)
如果我在UITableViewCell中进行任何复杂的布局,我会尝试将其保留在cellForRowAtIndexPath之外。一个选项是在- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
中进行布局,但我更喜欢将布局封装在自定义的UITableViewCell类中。
创建自己的UITableViewCell子类。在init方法中创建自定义按钮/标签/视图并将其添加到单元格的contentView中,或者通过访问者属性懒惰地创建和添加它。覆盖layoutSubviews并根据需要设置按钮。
这样的事情:
@implementation MyCustomCell
- (void) init
{
self = [super initWithStyle: UITableViewCellStyleDefault reuseIdentifier: nil];
if ( self != nil )
{
_myButton = [[UIButton buttonWithType: UIButtonTypeRoundedRect] retain];
[self.contentView addSubview: _myButton];
}
return self;
}
- (void) layoutSubviews
{
[super layoutSubviews];
// dynamic layout logic:
if ( ... )
{
_myButton.frame = CGRectMake( 10, 10, 100, 30 );
}
else
{
_myButton.frame = CGRectMake( 20, 10, 50, 30 );
}
}
答案 1 :(得分:0)
我也遇到过类似的问题。
将代码放在此方法中对我有用。
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// here.
}