【问题标题】:UILabel position in a UITableViewCell fails on the first tryUITableViewCell 中的 UILabel 位置在第一次尝试时失败
【发布时间】:2012-01-12 11:29:59
【问题描述】:

刚刚开始涉足 iOS 开发,所以我希望我在这里得到了正确的细节...

我有一个UILabel,加载到通过 .xib 创建的表格单元格中。实际上有几个标签,其中一个的长度不同(因此包裹的高度也不同)。 heightForRowAtIndexPath等被正确覆盖,两个标签所需的高度被正确计算并分配给每个标签的.frame

设置完两个尺寸后,我将较小(固定长度,始终高一排)标签的 frame.origin.y 设置为与较大标签的匹配。这可以通过cellForRowAtIndexPath 看到,但在新创建的单元格的初始显示中,原点似乎在容器中不是完全垂直居中,而不是卡在顶部。

在单击“通过”单元格到另一个视图并返回到(现在重复使用,并且可能已经适当大小的容器)后,位置设置为与以前一样,它出现在我预期的位置。

似乎cellForRowAtIndexPath 返回后容器正在调整大小,并且在那里的某个地方为我们的标签找到了一个新位置;这可以解释为什么以后重用单元​​格可以解决问题。

我已经尝试了内部和外部模式和基线设置、拉伸设置等的所有明显合理的组合。无法解释和/或解决方法。

更新:

关于Changing the position of custom UIButton in custom UITableViewCell 问题的建议解决了这个问题。解决方案是继承UITableViewCell 并覆盖layoutSubviews,从而在TableView 完成正常定位后有机会重新定位子元素。一旦该人在此处回复,或者赏金到期,我将用代码回答自己。

【问题讨论】:

  • 您是否尝试在viewWillAppear: 中调用[self.tableView reloadData]?这将强制在显示视图之前重新加载和显示所有单元格。不是对问题的解释,但也许是一种解决方法。听起来您只是以错误的顺序发生了一些事情。
  • 我也有类似的问题stackoverflow.com/questions/8352530/…。如果有人能找到任何一个问题的解决方案,那就太好了! @Paul Roub - 你有没有找到任何临时的解决方法?如果有,请分享。
  • 请在您的 heightForRow 和 cellForRow 中包含代码或其相关部分。我感兴趣的是您何时设置高度与何时移动标签。可能还有一些不正确对齐和原始笔尖布局的屏幕截图也会很好

标签: ios uikit uitableview


【解决方案1】:

如果我在 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 );

   }
}

【讨论】:

【解决方案2】:

我也遇到过类似的问题。

在这种方法中放置代码对我有用。

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// here.
}

【讨论】:

  • 我看不出这个答案在很长一段时间后有什么帮助;尤其是这个问题很久以前就解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 2011-01-08
  • 2014-05-27
  • 2017-03-02
  • 1970-01-01
相关资源
最近更新 更多