【问题标题】:Swift - Dynamically resize view after label in it resizes dynamicallySwift - 在标签中动态调整大小后动态调整视图大小
【发布时间】:2020-04-09 03:36:48
【问题描述】:

我创建了一个包含图像和标签的自定义视图。我在上面添加了一个点击手势,所以当用户点击视图时,标签和自定义视图都会展开以在标签上显示详细信息/更多文本。

我添加了代码来展开工作正常的标签,但 UIView/自定义视图没有得到展开。下面是我扩展标签的代码。

如何以编程方式或通过添加任何约束来扩展自定义视图?

@objc func bannerTapped(_ sender:UITapGestureRecognizer){
        self.bannerMessageLabel.numberOfLines = 0
        self.bannerMessageLabel.text = "Unicode characters take up multiple GSM characters. When a Unicode symbol appears in a text, it is usually segmented at the 70-character mark, thus making it even harder for the recipient to decipher the message."
        self.bannerMessageLabel.sizeToFit()
        self.bannerView.setNeedsLayout()
        self.bannerView.layoutIfNeeded()
    }

附加图片。我对它们没有任何限制,因为我将它留在 Stack 视图上来处理它。

【问题讨论】:

  • 您能分享添加到您的横幅视图中的约束吗

标签: ios swift


【解决方案1】:

我创建了一个示例 ViewController 来满足您的需求。我认为您缺少的是以下锚:

bannerView.bottomAnchor.constraint(lessThanOrEqualTo: view.bottomAnchor).isActive = true

示例视图控制器:

class TestViewController: UIViewController {

    // MARK: - UIObjects
    private let bannerView: UIView = {
        let bannerView = UIView()
        bannerView.translatesAutoresizingMaskIntoConstraints = false
        bannerView.backgroundColor = .white
        return bannerView
    }()

    private let stackView: UIStackView = {
        let stackView = UIStackView()
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .vertical // Works for both horizontal and vertical axis
        return stackView
    }()

    private let bannerWarningImage: UIImageView = {
        let imageView = UIImageView()
        imageView.image = UIImage(named: "arrow-right")
        imageView.backgroundColor = .orange
        return imageView
    }()
    private let bannerMessageLabel: UILabel = {
        let label = UILabel()
        label.text = "Unicode characters take up multiple GSM characters. When a Unicode symbol appears in a text"
        label.numberOfLines = 0
        label.backgroundColor = .green
        return label
    }()

    // MARK: - Overrides
    override func viewDidLoad() {
        super.viewDidLoad()

        bannerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(bannerTapped)))
        addUIElements()
        addConstrains()
    }

    // MARK: - UISetup
    private func addUIElements() {
        view.backgroundColor = .purple
        view.addSubview(bannerView)
        bannerView.addSubview(stackView)

        stackView.addArrangedSubview(bannerWarningImage)
        stackView.addArrangedSubview(bannerMessageLabel)
    }

    private func addConstrains() {
        bannerView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        bannerView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        bannerView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        bannerView.bottomAnchor.constraint(lessThanOrEqualTo: view.bottomAnchor).isActive = true

        stackView.topAnchor.constraint(equalTo: bannerView.topAnchor).isActive = true
        // The -10 for you to see that the bannerView height is actually chaning
        stackView.bottomAnchor.constraint(equalTo: bannerView.bottomAnchor, constant: -10).isActive = true
        stackView.leadingAnchor.constraint(equalTo: bannerView.leadingAnchor).isActive = true
        stackView.trailingAnchor.constraint(equalTo: bannerView.trailingAnchor).isActive = true
    }

    // MARK: - Actions
    @objc private func bannerTapped() {
        self.bannerMessageLabel.text = "Unicode characters take up multiple GSM characters. When a Unicode symbol appears in a text, it is usually segmented at the 70-character mark, thus making it even harder for the recipient to decipher the message."
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2021-04-03
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多