Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何设置自适应多行UILabel文本?_Ios_Swift - Fatal编程技术网

Ios 如何设置自适应多行UILabel文本?

Ios 如何设置自适应多行UILabel文本?,ios,swift,Ios,Swift,我在我的故事板中有一个名为titleLabel的UILabel设置为默认高度。我想让它在程序上扩展高度,以适应它的内容。以下是我迄今为止所尝试的: // just setting content titleLabel.text = "You don't always know what you are getting with mass-market cloud computing services. But with SimpliCompute, the picture is clear. S

我在我的故事板中有一个名为
titleLabel
UILabel
设置为默认高度。我想让它在程序上扩展高度,以适应它的内容。以下是我迄今为止所尝试的:

// just setting content
titleLabel.text = "You don't always know what you are getting with mass-market cloud computing services. But with SimpliCompute, the picture is clear. SimpliCompute gives you powerful virtual servers you can deploy using just your web browser. That’s enterprise grade technology you can deploy and control on-the-fly."

titleLabel.numberOfLines = 0

titleLabel.preferredMaxLayoutWidth = 700

titleLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

titleLabel.sizeToFit()
在任何组合中,这些都不适用于我!我总是在我的
ui标签中只看到一行文本。我做错了什么


我绝对需要文本内容是可变的。

它应该可以工作。试试这个

var label:UILabel = UILabel(frame: CGRectMake(10
    ,100, 300, 40));
label.textAlignment = NSTextAlignment.Center;
label.numberOfLines = 0;
label.font = UIFont.systemFontOfSize(16.0);
label.text = "First label\nsecond line";
self.view.addSubview(label);

我通过添加自动布局约束实现了一些功能:

但我对此并不满意。经历了大量的尝试和错误,无法理解为什么这样做有效


此外,我还必须添加在我的
ViewController

中使用
titleLabel.numberOfLines=0
,如果您正在寻找多行动态文本标签,这是一种更好的方法,它完全根据文本占用空间

没有sizeToFit,使用了preferredMaxLayoutWidth

下面是它将如何工作

让我们来设置项目。以单视图应用程序为例,在故事板中添加UILabel和UIButton。定义UILabel的约束,如下所示:

如下图所示设置标签属性:

将约束添加到UIButton。确保UILabel和UIButton之间的垂直间距为100

现在将UILabel的尾部约束的优先级设置为749

现在将UILabel的水平内容拥抱和水平内容压缩属性设置为750和748

下面是我的控制器类。您必须将UILabel属性和按钮操作从情节提要连接到viewcontroller类

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var textLabel: UILabel!
var count = 0
let items = ["jackson is not any more in this world", "Jonny jonny yes papa eating sugar no papa", "Ab", "What you do is what will happen to you despite of all measures taken to reverse the phenonmenon of the nature"]


@IBAction func updateLabelText(sender: UIButton) {
    if count > 3 {
        count = 0
    }
    textLabel.text = items[count]
    count = count + 1
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    //self.textLabel.sizeToFit()
    //self.textLabel.preferredMaxLayoutWidth = 500
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

就这样。这将根据UILabel的内容自动调整其大小,您还可以看到UILabel按钮也相应地进行了调整。

我知道它有点旧,但由于我最近查看了它:

let l = UILabel()
l.numberOfLines = 0
l.lineBreakMode = .ByWordWrapping
l.text = "BLAH BLAH BLAH BLAH BLAH"
l.frame.size.width = 300
l.sizeToFit()
首先将numberOfLines属性设置为0,以便设备理解您不关心它需要多少行。 然后指定您最喜欢的中断模式
然后需要在sizeToFit()方法之前设置宽度。然后标签知道它必须适合指定的宽度,使用Xcode中的图形用户界面(GUI),您可以执行以下操作:

  • 转到“
    属性检查器
    ”并将
    值设置为
    0
    。默认情况下,它设置为
    1
  • 点击
    option+return
    ,标签文本可以多行书写

  • 现在,转到“
    Size Inspector
    ”并设置标签的
    宽度
    高度
    X
    Y
    位置


仅此而已。

以编程方式,Swift

label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.titleView.numberOfLines = 2

使用带有Xcode 10.2的Swift 5编程

在@La masse的解决方案之上构建,但使用自动布局支持旋转

label = UILabel()
label.numberOfLines = 0
label.lineBreakMode = .byWordWrapping
self.view.addSubview(label)
// SET AUTOLAYOUT ANCHORS
label.translatesAutoresizingMaskIntoConstraints = false
label.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 20).isActive = true
label.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -20).isActive = true
label.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 20).isActive = true
// OPTIONALLY, YOU CAN USE THIS INSTEAD OF THE WIDTH ANCHOR (OR LEFT/RIGHT)
// label.frame.size = CGSize(width: UIScreen.absoluteWidth() - 40.0, height: 0)
label.text = "YOUR LONG TEXT GOES HERE"
label.sizeToFit()
为视图的位置(左侧、顶部、centerY、centerX等)设置定位。您还可以使用提供的UIScreen扩展动态设置宽度定位或frame.width(以支持旋转)

如果使用UIScreen动态设置frame.width:

extension UIScreen {   // OPTIONAL IF USING A DYNAMIC FRAME WIDTH
    class func absoluteWidth() -> CGFloat {
        var width: CGFloat
        if UIScreen.main.bounds.width > UIScreen.main.bounds.height {
            width = self.main.bounds.height // Landscape
        } else {
            width = self.main.bounds.width // Portrait
        }
        return width
    }
}

sizeToFit()最终会将标签的宽度缩小到断字后的最宽线条

这对我来说很有效:

  • UILabel
    numberOfLines
    属性设置为0
  • 将文本分配给
    UILabel后,添加此行:
    yourLabel.sizeToFit()


您是否尝试过将高度设置为非常高的值?比如数千?是否使用自动布局?因为你应该调用updateconstraints方法。如果它被打开,就意味着你正在使用它,你应该在interface builder中添加正确的contsrains。与任何IBOutlet或IBAction一样,您只需将一条线从故事板中的约束拖动到控制器。此连接将为NSLayoutConstraint类型,然后您可以设置
constraint.constant=500
以设置新高度。但我不想设置显式框架,因为文本内容将是可变的。您可以获取字符串的大小,并将该大小应用于标签。必须有更好的方法否?这听起来是个糟糕的解决方案。IOS8的布局应该是自适应和灵活的是的,我同意。但需要探索。如果你发现了什么,请回答它,这样它也会帮助其他人。你应该能够使用just.Center。在swift中,存在类型推断,并且由于属性的类型为NSTEXTALIGNING,因此无需将其放在那里。@MarcMosby您能解释一下为什么这样做吗?此外,我没有向控制器添加任何插座等。为什么您对您的解决方案不满意
numberofLines=0
表示numberofLines为无穷大。至于约束,您有固定的宽度和动态的高度。如果您想根据文本的数量动态设置标签的高度,我可以给您一段代码,说明如何设置标签的高度。我想我很不高兴,因为我不太了解自动布局。但我现在正在补救。谢谢你的快速解释,并为我指出了正确的方向。你能给我那个代码片段作为参考吗?哇,这个想法让我很开心!!我想2年后,你已经知道为什么了,但它是有效的,因为在顶部约束下,你给出了它必须开始的点,如果它需要额外的线,它会增长到底部,因为标签或底部约束没有固定的高度。极好的解决方案兄弟。。!!帽子很有用。。你能解释一下为什么你把优先级改为749吗?阿伦,我在尝试实现同样的结果时遇到了类似的问题,但到目前为止,我收到的所有建议都不起作用。你能看看我在这里的帖子吗:帮我解决我的约束问题?你在这里的帖子太棒了!!这不是一个好的解决方案。想想所有不同的屏幕尺寸,包括纵向和横向。斯达
extension UILabel {

    var textSize: CGSize { text?.size(withAttributes: [.font: font!]) ?? .zero }

    func setSizeForText(_ str: String, maxWidth: CGFloat) {
        text = str
        let dividedByMaxWidth = Int(textSize.width / maxWidth)
        if dividedByMaxWidth == 0 {
            frame.size = textSize
        } else {
            numberOfLines = dividedByMaxWidth + 1
            frame.size = CGSize(width: maxWidth, height: frame.size.height * CGFloat(numberOfLines))
            sizeToFit()
        }
    }
}