配置单元格时更改视图位置。奇怪的行为

时间:2014-01-28 16:35:49

标签: ios iphone uitableview

我有一个标准的UINavigationController,它的根目录是UITableViewController。在IB中,我绘制了一个带有标签和UIView的原型单元格。 UIView包含一个按钮。我希望UIView在标签后与x对齐,作为标签中文本长度的函数。

在IB中,视图的左侧最初与标签的左侧对齐。 IB中没有布局限制。

这是我的cellForRowAtIndexPath ...

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 5;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    NSArray *labels = @[@"SOME STRING", @"SHORTER", @"A VERY MUCH LONGER ONE", @"REGULAR ONE", @"TINY"];
    UILabel *label = (UILabel *)[cell viewWithTag:32];
    label.text = labels[indexPath.row];

    UIView *view = [cell viewWithTag:33];
    CGSize size = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];
    view.frame = CGRectOffset(label.frame, size.width, 0);

    return cell;
}

两个问题:我设置了断点并在第一次显示视图时观察此代码运行。我看到每行都更改了view.frame,但视图不会改变位置。我仍然在它的IB位置,就在标签的顶部。如果我向下滚动表格,下部单元格(可能是重复使用的)上的视图处于所需位置。如果我向上滚动,上面的行也很好。它只是无法处理上层单元的初始表示。

第二个问题是,仅第一行中包含的按钮具有应用于其文本的微妙奇怪效果,如模糊。见附件......

第一行按钮(放大mac预览...看到字母左边缘的额外模糊?)

enter image description here

其他行按钮

enter image description here

我试过的东西: 我尝试了一些变体,包括使用添加了表视图的常规视图控制器(而不是UITableViewController)。我发现如果我在viewDidAppear上重新加载数据,那就解决了放置问题,而不是模糊按钮。 (另外,我不喜欢需要在viewDidAppear上重新加载的想法)。在viewWillAppear上这样做根本没有效果。我也试过慢慢动画标签的变化。它发生了,但同样,仅在第二次配置单元时发生。我尝试更改UIView颜色以证明代码正在运行。每次都会发生颜色变化,包括第一次,但不包括视图位置。我疯了吗?

1 个答案:

答案 0 :(得分:1)

问题1:

在返回单元格之前尝试调用[cell layoutIfNeeded],在不需要重新布局时不应该有性能损失。

问题2: 在设置框架之前尝试调用CGRectIntegral。即

view.frame = CGRectIntegral( CGRectOffset(label.frame, size.width, 0) );