从情节提要加载 UILabel,无法更改 cellForRowAtIndexPath 中的框架
Posted
技术标签:
【中文标题】从情节提要加载 UILabel,无法更改 cellForRowAtIndexPath 中的框架【英文标题】:Load a UILabel from Storyboard, cannot change frame in cellForRowAtIndexPath 【发布时间】:2013-03-31 10:44:37 【问题描述】:我为 ios6 开发了一个应用程序。我在情节提要中初始化了动态单元格,其中包含一些UILabels
和一些UIImageViews
。他们的高度可能会即时改变。我的问题是当我像这样更改cellForRowAtIndexPath
中的框架时:
contentText = (UILabel *)[cell viewWithTag:TAG_TOPIC_CONTENT_TEXT];
CGFloat height = [[self.contentHeights objectAtIndex:[indexPath row]] floatValue];
contentText.frame = CGRectMake(CELL_TOPIC_CONTENT_X, CELL_TOPIC_CONTENT_Y, CELL_CONTENT_WIDTH, height);
屏幕上显示的 contentText UILabel
的高度仍然与我在 Storyboard 中初始化的高度相同。看来修改不起作用。如果我刷新我的UITableView
contentText 的高度会变得正确,如何解决这个问题?提前致谢!
【问题讨论】:
为什么不使用 heightForRowAtIndexPath ? @Bhargavi 在我的理解中,这个函数是用来改变cell的高度的,但是我的问题是改变uilabel的高度 【参考方案1】:尝试在tableView:willDisplayCell:forRowAtIndexPath:
方法中执行此操作。这是通常用于 UI 自定义的方法。希望这会有所帮助!
【讨论】:
刚刚尝试在tableView:willDisplayCell:forRowAtIndexPath中设置contentText的框架,然后在cellForRowAtIndexPath中检索contentText uilabel,并记录框架是正确的,但屏幕上显示的位置仍然错误,我错过了什么? 没错,这对解决这个问题没有帮助。【参考方案2】:如果您需要修改任何单元格的框架,那么您应该创建一个 UITableViewCell 的子类并实现 layoutSubviews 方法:
- (void)layoutSubviews
[super layoutSubviews];
// modify frames here
【讨论】:
如果在运行时改变了大小,我如何将它传递给 layoutSubviews?或者有什么方法可以通知 layoutSubviews 实际值? 尝试使用固定框架,启动时似乎无法正常工作,视图刷新后框架将变为我期望的样子【参考方案3】:我知道这很令人沮丧,但我也没有找到解决方案。 相反,我发现自己是一种解决方法,可以按照我期望的方式完成工作。
我删除了“AutoLayout”(情节提要中的复选框)
然后:
[self.label setText:@"Labeltext"];
[self.label setBackgroundColor:[UIColor orangeColor]];// just to make the frame visible
[self.label setNumberOfLines:0];
[self.label sizeToFit];
像魅力一样工作,但也:
self.label.frame = CGRectMake(0, 0, 50, 50);
所以,如果您不需要 AutoLayout(对我来说这是我取消选中的第一件事),请摆脱它。
【讨论】:
如果不勾选自动布局,恐怕我无法适应不同的屏幕尺寸以上是关于从情节提要加载 UILabel,无法更改 cellForRowAtIndexPath 中的框架的主要内容,如果未能解决你的问题,请参考以下文章