从情节提要加载 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 中的框架的主要内容,如果未能解决你的问题,请参考以下文章

使用情节提要的tableview自定义单元格标签不起作用

无法从情节提要显式加载视图控制器

如何在情节提要中为uilabel设置大于300的字体大小?

如何使用情节提要设置包装文本 UILabel Xcode

更新 UILabel Text 会重置情节提要?

如何更改情节提要中 tableHeaderView 的高度?