在我的自定义表视图单元子类中,其中一个textlabel的位置取决于ivar(NSString)的内容。 (即:如果NSString是空字符串,则textlabel框架的位置不同)。
如果更新的位置如下:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
customOverlayCell *myCell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomOverlayCell"];
if ([buildingFName isEqual:@""])
{
CGRect titleLabelFrame = myCell.titleLabel.frame;
titleLabelFrame.origin.y = 45;
[myCell.titleLabel setFrame:titleLabelFrame];
}
return myCell;
}
我删除了不相关的部分代码。
结果是屏幕上显示的第一个单元格的布局已正确更新,但向下滚动后显示的视图布局不会更新。
我没有正确使用dequeueReusableCellWithIdentifier吗?或者还有什么不对吗?
编辑:
EJV的解决方案:
CGRect titleLabelFrame = myCell.titleLabel.frame;
if ([buildingFName isEqual:@""])
{
titleLabelFrame.origin.y = 45;
} else {
titleLabelFrame.origin.y = 37;
}
[myCell.titleLabel setFrame:titleLabelFrame];
答案 0 :(得分:1)
我担心,它需要对单元格进行子类化并实现[UITableViewCell layoutSubviews]以正确布置单元格的子视图。这就是我为切换表视图单元做类似的事情:
- (void)layoutSubviews
{
CGFloat const ESCFieldPadding = 10.0f;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
// call super layout
[super layoutSubviews];
// obtain widths of elements
CGFloat contentWidth = self.contentView.frame.size.width;
CGFloat contentHeight = self.contentView.frame.size.height;
CGFloat switchWidth = self.switchView.frame.size.width;
CGFloat switchHeight = self.switchView.frame.size.height;
CGFloat labelWidth = contentWidth - (4 * ESCFieldPadding) - switchWidth;
// correctly position both views
self.textLabel.frame = CGRectMake(ESCFieldPadding, 0.0f,
labelWidth, contentHeight);
// it is needed to explicitly resize font as for some strange reason,
// uikit will upsize the font after relayout
self.textLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]];
CGRect switchFrame = self.switchView.frame;
switchFrame.origin = CGPointMake(contentWidth - ESCFieldPadding - switchWidth,
(contentHeight / 2) - (switchHeight / 2));
self.switchView.frame = CGRectIntegral(switchFrame);
[UIView commitAnimations];
}
答案 1 :(得分:1)
如果标题标签的框架是动态的,那么当您从表格视图中取出单元格时,该框架可能处于两种状态中的任何一种状态(当buildingFName为空且具有字符时)。您需要确保在buildingFName不为空时设置框架。这样,标题标签的框架将始终正确设置。所以,你需要这样的代码:
CGRect titleLabelFrame = myCell.titleLabel.frame;
if ([buildingFName isEqual:@""])
{
titleLabelFrame.origin.y = 45;
} else {
// Change titleLabelFrame
}
[myCell.titleLabel setFrame:titleLabelFrame];
答案 2 :(得分:0)
尝试从您的手机中禁用自动布局