【问题标题】:Swift: AutoLayout acting weird斯威夫特:自动布局表现怪异
【发布时间】:2021-04-06 11:24:12
【问题描述】:

以下是我的困境以及我为达到我的处境而采取的步骤。

我的第一步

我创建了一个名为BubbleView的类:

import UIKit
import SnapKit


class BubbleView : UIView {
    
    var label:UILabel!
    
    var text:String = "" {
        didSet {
            guard label != nil else {return}
            label.text = text
        }
    }
            
    init() {
        super.init(frame: .zero)
        setupUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setupUI() {
        self.clipsToBounds = true
        self.backgroundColor = .systemBlue
        self.layer.cornerRadius = 15
        
        label = UILabel()
        label.textColor = .white
        label.numberOfLines = 0
        addSubview(label)
        
        label.snp.makeConstraints { (make) in
            make.edges.equalToSuperview().inset(10)
        }
    }
}

第 2 步

我创建一个视图控制器并添加我的BubbleView

import UIKit
import SnapKit


class ViewController: UIViewController {
    
    var bubble: BubbleView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            self.bubble.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
        }
    }
                        
    func setupUI() {
        bubble = BubbleView()
        bubble.text = "Hello"
        view.addSubview(bubble)
        
        bubble.snp.makeConstraints { (make) in
            make.width.equalToSuperview().multipliedBy(0.7).priority(.low)
            make.width.lessThanOrEqualToSuperview().multipliedBy(0.7)
            make.top.right.equalTo(self.view.safeAreaLayoutGuide).inset(20)
        }
    }
}

我的问题

我的问题是,当我做bubble.text = "Hello"时,右边有大量的尾随空格,如下图:

我正在尝试去掉这个尾随空格,以便图像看起来更像:

我需要什么

当设备旋转到横向模式时,我需要 BubbleView 调整大小以占据屏幕的 70%,所以它看起来像这样:

到目前为止,气泡视图确实做到了这一点,但它总是有令人讨厌的尾随空格,如第一张图片所示。通过删除BubbleView 上的以下约束:

make.width.equalToSuperview().multipliedBy(0.7).priority(.low)

它修复了尾随空格的问题,但是,当我旋转设备时,宽度不会更新为 0.7 * 设备的宽度,如下所示:

帮助

所以,我想知道是否有人知道如何在只有少量文本时删除BubbleView 上的尾随空格,但仍然保持设备旋转时的行为,它会填满0.7 * screen width 如果必要,而不是保持相同的宽度。

非常感谢您的宝贵时间!

【问题讨论】:

  • 我注意到你没有按照我在之前讨论中所说的去做。您正在使用 priority(.low) 进行等式约束。那不是我说的。我说100。你试过吗?我选择这个号码是有原因的。当然我可能是错的,我无意冒犯,但你至少可以在声称我的建议不起作用之前尝试一下,因为你所做的不是我的建议。谢谢。 (抱歉,我现在不能自己测试。)
  • 我的错!非常感谢您的评论。我已经尝试了 100 优先级,它解决了额外尾随空间的问题,但是当我将设备旋转到横向模式时,视图的宽度不会扩大,它保持与纵向模式相同的宽度(即,垂直方向),当我希望它调整以占用更多可用空间时。在这一点上,我认为SnapKit DSL 可能存在错误..?任何想法都非常感谢!
  • 不知道,抱歉,无法测试。

标签: ios swift autolayout snapkit


【解决方案1】:

最终通过像这样实现我的UICollectionViewCell 类来解决:

import UIKit
import SnapKit


class BubbleCell : UICollectionViewCell {
    
    var label:UILabel!
    var background:UIView!
    
    var text:String = "" {
        didSet {
            guard label != nil else {return}
            label.text = text
        }
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func setupUI(spacing:CGFloat=2) {
                    
        label = UILabel()
        label.textColor = .white
        label.numberOfLines = 0
        contentView.addSubview(label)
        
        background = UIView()
        background.backgroundColor = .systemBlue
        background.layer.cornerRadius = 17
        background.clipsToBounds = true
        contentView.addSubview(background)
        contentView.sendSubviewToBack(background)
                
        label.snp.makeConstraints { (make) in
            make.top.bottom.equalToSuperview().inset(10 + spacing)
            make.right.equalToSuperview().inset(20)
            make.width.lessThanOrEqualToSuperview().multipliedBy(0.7)
        }
        
        background.snp.makeConstraints { (make) in
            make.top.equalTo(self.label).inset(-10)
            make.bottom.equalTo(self.label).offset(10)
            make.left.equalTo(self.label).inset(-15)
            make.right.equalTo(self.label).offset(15)
        }
    }
}

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2017-11-13
    相关资源
    最近更新 更多