在Swift

时间:2017-05-18 03:18:51

标签: ios swift uilabel snapkit

我已尝试过在Swift中自动调整我的UILabel的所有内容。我可以在文本为一行时自动调整文本,但是当它是两行时它不再有效。 UILabel中的文本经常发生变化,大约每10秒发生一次。我试过的代码是:

let direction = UILabel(frame: CGRect(x: 95, y: 10, width: screenWidth - 95, height:100))
direction.numberOfLines = 0
direction.adjustsFontSizeToFitWidth = true
direction.lineBreakMode = .byWordWrapping
direction.textAlignment = .center
direction.minimumScaleFactor = 0.2
direction.font = UIFont.boldSystemFont(ofSize: 40)
view.addSubview(direction)
direction.text = "Ffafdafafdfa fafda  dfafaf afa"

func updateDirection(update: String){
    direction.text = update
} 

原文" Ffafdafafdfa fafda dfafaf afa"将自动调整大小,但是当调用updateDirection时,字体大小不能从40更改。我还尝试将行数设置为2并删除.byWordWrapping。如何让我的UILabel自动调整大小?

5 个答案:

答案 0 :(得分:1)

以下代码会根据frame size保留adjust the font sizedirection label content

let backgroundView = UIView(frame: CGRect(x: 5, y: UINavigationController().navigationBar.frame.height + UIApplication.shared.statusBarFrame.height, width: UIScreen.main.bounds.width - 10, height: UIScreen.main.bounds.width - 100))
let direction = UILabel()

 override func viewDidLoad() {
    super.viewDidLoad()

 direction.backgroundColor = UIColor.green
 direction.numberOfLines = 0
 direction.textAlignment = .center
 direction.font = UIFont.boldSystemFont(ofSize: 40)
 direction.adjustsFontForContentSizeCategory = true
 direction.adjustsFontSizeToFitWidth = true
 direction.text = "This is some multiline label with a background colour" // Set or Initiate random function for your array here.

 backgroundView.backgroundColor = UIColor.red
 view.addSubview(backgroundView)
 backgroundView.addSubview(direction)

 Timer.scheduledTimer(timeInterval: 10.0, target: self, selector: #selector(random), userInfo: nil, repeats: true)  

 direction.translatesAutoresizingMaskIntoConstraints = false

 NSLayoutConstraint(item: direction,
                       attribute: .leading,
                       relatedBy: .equal,
                       toItem: backgroundView,
                       attribute: .leadingMargin,
                       multiplier: 1.0,
                       constant: 0.0).isActive = true

NSLayoutConstraint(item: direction,
                       attribute: .trailing,
                       relatedBy: .equal,
                       toItem: backgroundView,
                       attribute: .trailingMargin,
                       multiplier: 1.0,
                       constant: 0.0).isActive = true


NSLayoutConstraint(item: direction,
                       attribute: .top,
                       relatedBy: .equal,
                       toItem: backgroundView,
                       attribute: .topMargin,
                       multiplier: 1.0,
                       constant: 0.0).isActive = true

NSLayoutConstraint(item: direction,
                       attribute: .bottom,
                       relatedBy: .equal,
                       toItem: backgroundView,
                       attribute: .bottomMargin,
                       multiplier: 1.0,
                       constant: 0.0).isActive = true


}

func random(sender: Timer) {

    //Place your random func code here.     
}

<强>输出:

enter image description here

答案 1 :(得分:0)

在没有约束条件的情况下尝试:

    let direction = UILabel(frame: CGRect(x: 95, y: 10, width: 375 - 95, height:100))
    direction.numberOfLines = 0
    direction.adjustsFontSizeToFitWidth = true
    direction.textAlignment = .center
    direction.minimumScaleFactor = 0.2
    direction.font = UIFont.boldSystemFont(ofSize: 40)
    view.addSubview(direction)

    direction.text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard"

答案 2 :(得分:0)

我会试试这段代码 这是完全使用

首先创建一个函数

func calchight(strin:String) -> CGFloat
   {
       let label =  UILabel(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat.greatestFiniteMagnitude))
       label.numberOfLines = 0
        label.text = strin
       label.sizeToFit()
        return label.frame.height + 2
   }

然后在您想要调整标签

的大小时,在正确的位置调用此函数

/ --------------

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
    { 
        let heit = self.calchight(strin: StringObject)

        return (heit)
    }

/ --------------------------

此代码很有用,不需要自动布局容器

答案 3 :(得分:0)

UILabel 会将其内容大小视为一行文本,即使 numberOfLines 设置为非零值,除非还设置了 preferredMaxLayoutWidth

换句话说,它无法预测没有 preferredMaxLayoutWidth 的文本如何换行,因此它不打算这样做。似乎在自动布局过程中,UILabel 不知道如何平衡其外部布局约束设置的宽度与文本换行之间的优先级。

所以即使它的内容压缩阻力高于其他视图,它也不会在垂直维度上施加任何额外的压力(超过一行的高度),因为它会假设通过在水平轴上施加压力,将显示其内容。

所以解决方案是设置preferredMaxLayoutWidth,这样它就可以在包裹文本后确定内容的高度,然后使用该内容大小与其他人协商布局视图。

您可能希望避免对 UILabel 的宽度进行硬编码。假设它的容器的宽度不会根据自动布局而改变,那么使用它应该是安全的。在这种情况下,我在 UITableViewCellUICollectionViewCell 中,“标题标签”跨越单元格的整个宽度。

override func layoutSubviews() {
    // Tell the label it should wrap text at the same width as this cell's contentView.
    titleLabel.preferredMaxLayoutWidth = contentView.frame.width

    super.layoutSubviews()
}

答案 4 :(得分:-1)

在为标签指定文本后尝试使用函数sizetofit()。 像:

direction.sizeToFit()