我有一个标准的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预览...看到字母左边缘的额外模糊?)
其他行按钮
我试过的东西: 我尝试了一些变体,包括使用添加了表视图的常规视图控制器(而不是UITableViewController)。我发现如果我在viewDidAppear上重新加载数据,那就解决了放置问题,而不是模糊按钮。 (另外,我不喜欢需要在viewDidAppear上重新加载的想法)。在viewWillAppear上这样做根本没有效果。我也试过慢慢动画标签的变化。它发生了,但同样,仅在第二次配置单元时发生。我尝试更改UIView颜色以证明代码正在运行。每次都会发生颜色变化,包括第一次,但不包括视图位置。我疯了吗?
答案 0 :(得分:1)
问题1:
在返回单元格之前尝试调用[cell layoutIfNeeded]
,在不需要重新布局时不应该有性能损失。
问题2: 在设置框架之前尝试调用CGRectIntegral。即
view.frame = CGRectIntegral( CGRectOffset(label.frame, size.width, 0) );