Ios 将UILabel高度调整为文本
我有一些标签,我想调整它们的高度,以适应文本,这是我现在为此编写的代码Ios 将UILabel高度调整为文本,ios,swift,height,uilabel,frame,Ios,Swift,Height,Uilabel,Frame,我有一些标签,我想调整它们的高度,以适应文本,这是我现在为此编写的代码 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{ let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max)) label.numberOfLines = 0 label.lineBreakMode = NSLineBr
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
编辑:
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
问题不在这段代码中,所以我的解决方法是问题本身。它可能对其他人仍然有用 我刚把它放在操场上,它对我很管用 为Swift 4.0更新
import UIKit
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
let font = UIFont(name: "Helvetica", size: 20.0)
var height = heightForView("This is just a load of text", font: font, width: 100.0)
Swift 3:
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
我有很强的工作解决方案 在布局子视图中:
_title.frame = CGRect(x: 0, y: 0, width: bounds.width, height: 0)
_title.sizeToFit()
_title.frame.size = _title.bounds.size
在文本设置器中:
_title.text = newValue
setNeedsLayout()
UPD.
当然,使用此UILabel设置:
_title.lineBreakMode = .ByWordWrapping
_title.numberOfLines = 0
仅通过设置:
label.numberOfLines = 0
标签将根据输入的文本量自动调整其高度 如果您需要,我将创建此扩展
extension UILabel {
func setSizeFont (sizeFont: CGFloat) {
self.font = UIFont(name: self.font.fontName, size: sizeFont)!
self.sizeToFit()
}
}
Anorak建议的解决方案是UILabel扩展中的计算属性:
extension UILabel
{
var optimalHeight : CGFloat
{
get
{
let label = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = self.lineBreakMode
label.font = self.font
label.text = self.text
label.sizeToFit()
return label.frame.height
}
}
}
用法:
self.brandModelLabel.frame.size.height = self.brandModelLabel.optimalHeight
以下是如何在Swift中计算文字高度。然后可以从rect获取高度,并设置标签或文本视图的约束高度等
let font = UIFont(name: "HelveticaNeue", size: 25)!
let text = "This is some really long text just to test how it works for calculating heights in swift of string sizes. What if I add a couple lines of text?"
let textString = text as NSString
let textAttributes = [NSFontAttributeName: font]
let textRect = textString.boundingRectWithSize(CGSizeMake(320, 2000), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)
在@Anorak answer之后,我将这个扩展名添加到String中,并发送了一个inset作为参数,因为很多时候,文本都需要填充。 不管怎样,也许有些人会觉得这很有用
extension String {
func heightForWithFont(font: UIFont, width: CGFloat, insets: UIEdgeInsets) -> CGFloat {
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width + insets.left + insets.right, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
label.font = font
label.text = self
label.sizeToFit()
return label.frame.height + insets.top + insets.bottom
}
}
只要在需要标签的动态高度时调用此方法即可
func getHeightforController(view: AnyObject) -> CGFloat {
let tempView: UILabel = view as! UILabel
var context: NSStringDrawingContext = NSStringDrawingContext()
context.minimumScaleFactor = 0.8
var width: CGFloat = tempView.frame.size.width
width = ((UIScreen.mainScreen().bounds.width)/320)*width
let size: CGSize = tempView.text!.boundingRectWithSize(CGSizeMake(width, 2000), options:NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: tempView.font], context: context).size as CGSize
return size.height
}
如果您使用的是AutoLayout,则只能通过配置UI来调整
UILabel
高度
对于iOS8或更高版本
- 为
UILabel
- 并将
的行从1更改为0UILabel
- 首先,您需要为
UILabel
- 然后,将关系从
修改为Equal
大于或等于
- 最后,将
的行从1更改为0UILabel
根据Anorak的回答,您的
UILabel
将根据文本自动增加高度,我也同意Zorayr的担心,因此我添加了几行代码来删除UILabel并仅返回CGFloat,我不知道这是否有帮助,因为原始代码没有添加UIabel,但它不会抛出错误,所以我使用下面的代码:
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
var currHeight:CGFloat!
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.ByWordWrapping
label.font = font
label.text = text
label.sizeToFit()
currHeight = label.frame.height
label.removeFromSuperview()
return currHeight
}
Swift 4.0
import UIKit
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
let font = UIFont(name: "Helvetica", size: 20.0)
var height = heightForView("This is just a load of text", font: font, width: 100.0)
self.messageLabel=UILabel(帧:CGRect(x:70,y:60,宽度:UIScreen.main.bounds.width-80,高度:30)
Blockquote NSParagraphStyle.LineBreakMode,应用于整个段落,而不是段落中的文字。此属性在正常绘图期间以及必须减小字体大小以适应其边界框中标签文本的情况下均有效。默认情况下,此属性设置为ByTruncingTail
Swift 4.0
import UIKit
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
let font = UIFont(name: "Helvetica", size: 20.0)
var height = heightForView("This is just a load of text", font: font, width: 100.0)
我没有计算文本/标签高度,而是在插入(动态)文本后调整标签的大小
假设myLabel是有问题的UILabel:
let myLabel = UILabel(frame: CGRect(x: 0, y: 0, width: *somewidth*, height: *placeholder, e.g. 20*))
myLabel.numberOfLines = 0
myLabel.lineBreakMode = .byWordWrapping
...
现在是有趣的部分:
var myLabelText: String = "" {
didSet {
myLabel.text = myLabelText
myLabel.sizeToFit()
}
}
Swift 4.1计算标签高度的扩展方法:
extension UILabel {
func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat {
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
}
}
在swift 4.1和Xcode 9.4.1中 仅3个步骤 步骤1) 步骤2) 步骤3)
要在swift中使标签动态,请不要指定高度常量,在情节提要中,使标签行数0也指定底部约束,这是我根据内容大小处理动态标签的最佳方式。swift 5,XCode 11情节提要方式。我认为这适用于iOS 9及更高版本。例如,如果希望“描述”标签获得动态高度,请执行以下步骤: 1) 选择描述标签->转到属性检查器(铅笔图标),设置: 行数:0 换行:换行 2) 从情节提要中选择UILabel,然后转到尺寸检查器(标尺图标), 3) 对于与标签交互的所有其他UIView(标签、按钮、图像视图等)组件,请转至“内容压缩阻力优先级为1”
例如,我在视图中垂直放置UIImageView、Title Label和Description Label。我将内容压缩阻力优先级设置为UIImageView,将Title Label设置为1,将Description Label设置为750。这将使描述标签具有所需的高度。您还可以使用
sizeThatFits
功能
例如:
label.sizeThatFits(superView.frame.size).height
看看NSString UIKit的添加,有一些方法可以根据需要计算大小,而无需创建UILabel。@VladimirGritsenko“sizeWithFont”方法在Swift中不可用:(我承认我不是Swift方面的专家,但我相信你可以添加自己的桥接方法。与创建UILabel来计算大小相比,这仍然是值得的。@BurgershotsizeWithFont
可能不适用于SwiftString
,但它可以在NSString
上使用,你应该仍然能够调用它。最后e错误与此不同,与此方法无关。虽然这可能对其他人仍有帮助。这对游乐场上的mee也适用,错误似乎不会发生在这个特定的地方,当我删除此方法的用法时,它会抱怨一些println或只是一行注释(然后显示EXC_BAD_访问代码=2)它在操场上工作,但在XCode 6.1I中的视图控制器内部不会按需要进行大小调整。我对每次大小调整创建一个新的UILabel
有点犹豫;如果在LayoutSubview
内部使用此方法,并且每个完整布局都会被多次调用,那么额外的对象创建可能会引入明显的de放置,尤其是在滚动期间。let textRect=textString.boundingRectWithSize(CGSizeMake(3202000),选项:。使用linefragmentorigin,attributes:texttributes,context:nil)我无法在我的视图控制器中调用此函数…你能建议我什么是pos吗
//This is your label
let proNameLbl = UILabel(frame: CGRect(x: 0, y: 20, width: 300, height: height))
proNameLbl.text = "This is your text"
proNameLbl.font = UIFont.systemFont(ofSize: 17)
proNameLbl.numberOfLines = 0
proNameLbl.lineBreakMode = .byWordWrapping
infoView.addSubview(proNameLbl)