有没有办法让多行文本在UILabel中,UITextView或者我应该使用第二行?
在iOS 7中,sizeWithFont:现已弃用.我现在如何将UIFont对象传递给替换方法sizeWithAttributes:?
我在使用自动布局尝试实现一些非常基本的布局行为时遇到了麻烦.我的视图控制器在IB中看起来像这样:

顶部标签是标题标签,我不知道它会有多少行.我需要标题标签来显示所有文本行.我还需要另外两个标签和小图像放在标题正下方,不管它有多高.我在标签和小图像之间设置了垂直间距约束,在标题标签和超视图之间设置了顶部间距约束,在小图像和超级视图之间设置了底部间距约束.白色UIView没有高度约束,因此它应该垂直拉伸以包含其子视图.我已将标题标签的行数设置为0.
如何调整标题标签以适应字符串所需的行数?我的理解是我不能使用setFrame方法,因为我正在使用自动布局.我必须使用自动布局,因为我需要那些其他视图保持在标题标签下面(因此约束).
我怎样才能做到这一点?
如何从iPhone Developer's Cookbook第6章中的"09a-PrefsTable"配方修改以下片段(在tableView:cellForRowAtIndexPath:UITableViewController方法中):
if (row == 1) {
// Create a big word-wrapped UILabel
cell = [tableView dequeueReusableCellWithIdentifier:@"libertyCell"];
if (!cell) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"libertyCell"] autorelease];
[cell addSubview:[[UILabel alloc] initWithFrame:CGRectMake(20.0f, 10.0f, 280.0f, 330.0f)]];
}
UILabel *sv = [[cell subviews] lastObject];
sv.text = @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and …Run Code Online (Sandbox Code Playgroud) 我有一个UITableView固定高度为100点的细胞.单元格在xib文件中创建,该文件使用3个约束将a固定UILabel到单元格的左,右和上边缘contentView.标签的垂直拥抱优先级设置为1000,因为我希望单元格的高度尽可能小.
当xib文件中单元格的宽度设置为320磅,与iPhone上的tableView宽度相同时,autolayout按预期工作.但是,当我将单元格的宽度设置为小于320点时,我得到了意想不到的结果.(我想在tableViews中使用具有不同宽度的相同单元格,例如在通用应用程序中)
例如:当我将宽度设置为224点并为标签提供一个占据该宽度的2行的文本时,标签的高度将增加以适应2行,但是当单元格调整为320点以适应一个tableView的宽度,文本只占1行,但标签的高度保持2行.
我在GitHub上放了一个示例项目来演示这个问题:https://github.com/bluecrowbar/CellLayout
有没有办法让UILabel总是调整大小以拥抱其文本内容?
我很高兴能够在Xcode中构建我的静态TableView,使用自动布局来支持动态类型,如WWDC2014中提到的表和集合视图中的新功能.
我更喜欢严格使用Xcode/Interface Builder和故事板来处理自动布局.当我这样做时,不知何故TableView单元格没有调整大小,我确信我错过了一些简单的东西.
为了重现这一点,使用Xcode 7 beta 5,我:
添加到ViewDidLoad:
self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 44.0;
在设置中调整并调整动态类型.字体更改时,TableView高度仍然停留在明显的默认值44并截断标签.
这是一个GitHub存储库,它是上面的结果.
为什么Auto Layout不会导致TableView扩展以填充必要的空间以适应新的更大标签文本?
我已经找到了关于这个主题的好帖子,如下所示,并且在这里一直在使用代码来设置约束.
我没有找到任何在纯Interface Builder中执行此操作的示例.当然这很有可能吗?
更新
我已经更新了GitHub源代码,以包含一个带有ImageView而不是UILabel的第二个表行; 它显示了同样的问题:
此外,当我在标签或图像视图上设置显式高度约束时,我生成以下内容.问题似乎是我没有设置的"UIView-Encapsulated-Layout-Height"约束.我猜它是生成的,因为在我的IB静态表视图中,行高被设置为(默认)为44.
Unable to simultaneously satisfy constraints.
...
"<NSLayoutConstraint:0x7fa371f39e30 V:[UILabel:0x7fa371f38d30'Label'(20)]>",
"<NSLayoutConstraint:0x7fa371c39160 UILabel:0x7fa371f38d30'Label'.top == UITableViewCellContentView:0x7fa371e17dc0.topMargin>",
"<NSLayoutConstraint:0x7fa371c393c0 UITableViewCellContentView:0x7fa371e17dc0.bottomMargin == UILabel:0x7fa371f38d30'Label'.bottom>",
"<NSLayoutConstraint:0x7fa371f41a40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fa371e17dc0(43.5)]>"
Run Code Online (Sandbox Code Playgroud)
但是ViewDidLoad中的这个不应该超越这个吗?
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
Run Code Online (Sandbox Code Playgroud)
自行调整表格视图单元格是否不适用于静态表格视图?
更新2
我使用动态原型而不是静态表视图构建了相同的东西,一切正常:
它确实似乎是静态的与动态原型表.静态表视图单元格未正确展开.
我在WWDC视频中没有看到动态与静态的关系,所以在这一点上我将这个问题搞砸了.如果我学到新东西,我会更新.
我已经更新了上面的GitHub存储库,以显示静态(损坏)和动态(工作)表视图的示例.
根据文档,CTFramesetterSuggestFrameSizeWithConstraints ()"确定字符串范围所需的帧大小".
不幸的是,这个函数返回的大小永远不准确.这是我在做的事情:
NSAttributedString *string = [[[NSAttributedString alloc] initWithString:@"lorem ipsum" attributes:nil] autorelease];
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef) string);
CGSize textSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(rect.size.width, CGFLOAT_MAX), NULL);
Run Code Online (Sandbox Code Playgroud)
返回的大小始终具有正确的宽度计算,但高度始终略短于预期.
这是使用此方法的正确方法吗?
有没有其他方法来布局核心文本?
似乎我不是唯一遇到此方法问题的人.请参阅https://devforums.apple.com/message/181450.
编辑:我使用Quartz测量相同的字符串sizeWithFont:,为属性字符串和Quartz提供相同的字体.以下是我收到的测量数据:
核心文字:133.569336 x 16.592285
石英:135.000000 x 31.000000
我已经看到了涉及自动布局的垂直大小调整的答案,但UILabel我正在创建的s仅在运行时需要.(我可能需要零到多个这些标签.)
示例(忽略颜色)
如果文本可以适合固定宽度的一行,则标签不需要垂直调整大小.但是如果有更多字符,标签应该保持垂直扩展以适应这些附加字符.文本应该一行一行地包裹.文本应从标签的左上角开始.
更具体:
let marker = GMSMarker(position: myLatLng)
// see http://stackoverflow.com/a/40211383/1168364 for imageWithView
marker.icon = imageWithView(label) // **how do i create this label?**
marker.map = map // map is a GMSMapView
Run Code Online (Sandbox Code Playgroud)
这些标签可以在屏幕上的任何位置.这适用于地图应用程序,其中每个标签将放置在随机位置.标签的位置彼此没有关系.
我试图通过UILabel显示可变高度的文本量.
我通过将Xcode的故事板和编码直接组合到实现文件中来设置所有内容.
这是代码:
CGRect labelFrame = CGRectMake(20, 20, 280, 800);
descriptionLabel.frame = labelFrame;
NSString *description = self.spell[@"description"];
descriptionLabel.text = description;
[descriptionLabel setNumberOfLines:0];
[descriptionLabel sizeToFit];
Run Code Online (Sandbox Code Playgroud)
我试过改变wordwrap功能,尝试使用很多不同的设置,但无济于事.
故事板中是否需要特定的内容?
我的视图 - >标签的结构是否重要?
我有它,以便标签在视图中(占据整个屏幕).
我已经创建了一个带有UILabel的自定义视图单元格,我已设置:
cell.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.titleLabel.numberOfLines = 0;
Run Code Online (Sandbox Code Playgroud)
这不是多行,为什么会这样?
在layoutSubviews我有:
- (void)layoutSubviews {
[super layoutSubviews];
CGRect frame = titleLabel.frame;
frame.origin.y = 5;
titleLabel.frame = frame;
}
Run Code Online (Sandbox Code Playgroud)
这就是我所有的设置,但是对于放在单元格标签中的长文本,它不会自动换行:

ios ×5
uilabel ×4
autolayout ×3
cocoa-touch ×3
iphone ×3
objective-c ×2
uitableview ×2
xcode ×2
autoresize ×1
cocoa ×1
core-text ×1
deprecated ×1
ios7 ×1
ios8 ×1
line-breaks ×1
multiline ×1
storyboard ×1
swift ×1
uitextview ×1