【问题标题】:How can I dynamically set the height of custom UIView class with XIB added to a vertical stackview?如何动态设置自定义 UIView 类的高度,并将 XIB 添加到垂直堆栈视图?
【发布时间】:2021-03-21 16:41:09
【问题描述】:

背景信息 我正在创建一个同意/问题表应用程序。此表格将有几个不同的问题,文本长度不同。 1 行最多 5 行,具体取决于设备。

这是我到目前为止所做的 我创建了一个带有 XIB 文件的自定义 UIView 类,我在其中添加了一个锚定到顶部的标签(行设置为 0 = 该标签的多行)。此标签将添加一个短文本或长文本。

在标签下面我有一个是/否按钮,就像单选组一样,在下面我将有一个默认隐藏的 UIText 字段,该字段仅在某些问题上可见,并且只有在用户选择“是”时才可见

问题将被添加到位于 UIScrollView 顶部的垂直 UIStackview

myQuestionView = MyQuestionView(preDefinedAnswer: false, preDefinedAnswerText: nil)
myQuestionView?.questionLabel.text = "Lorem ipsum dolor sit amet, consectetur adipiscing  ?"
myQuestionView?.shouldShowAnswerTextfield = true
myQuestionView?.heightAnchor.constraint(equalToConstant: 120).isActive = true
 myStackView.addArrangedSubview(myQuestionView!)

问题 正如您在上面的代码中看到的,我将高度约束设置为 120,如果问题只有一行并且用户不选择是(那么视图应该增长并显示 answertextfield),这看起来没问题。通常我可能会创建一个高度约束插座并尝试计算 UIView 类中的高度,但我无法做到。

问题 如何根据内容动态设置自定义 UIView 类的高度并让 stackview 相应增长?我希望当我实例化它时高度是正确的,并且如果用户单击是(以显示 UITextfield)则增长。

感谢您的帮助。

UIView 类

import UIKit

class MyQuestionView: UIView {

    @IBOutlet weak var questionLabel: UILabel!
    @IBOutlet weak var answerTextfield: UITextField!
    @IBOutlet weak var jaButton: UIButton!
    @IBOutlet weak var neiButton: UIButton!
    
    @IBInspectable var height: CGFloat = 300.0
    
    @IBOutlet weak var viewHeight: NSLayoutConstraint!
    
    var shouldShowAnswerTextfield : Bool?
    var answerText : String?
    
    var didAnswerYes : Bool?
    
    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */
    
    init(preDefinedAnswer:Bool?, preDefinedAnswerText:String?)
    {
        super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 200) )
        didAnswerYes = preDefinedAnswer
        answerText = preDefinedAnswerText
        commonInit()
        setup()
        
        
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
        setup()
        print("init")
        
        
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
        setup()
        print("Init?")
        
    }
    
    func commonInit(){
        let viewFromXib = Bundle.main.loadNibNamed("MyQuestionView", owner: self, options: nil)![0] as! UIView
        viewFromXib.frame = self.bounds
        addSubview(viewFromXib)
        

        
    }
    
 
    func setup()
    {
        answerTextfield.isHidden = true
        
        if(didAnswerYes != nil)
        {
            print("Setup \(didAnswerYes)")
            setAnswer(didAnswerYes!)
            
            if(answerText != nil)
            {
                answerTextfield.text = answerText
                if(didAnswerYes!)
                {
                    answerTextfield.isHidden = false

                }
            }
            
        }
        
        
        //sett constraints
        //self.heightAnchor.constraint(equalToConstant: 320).isActive = true
        //self.sizeToFit()
        
        
        
        
        //self.layoutIfNeeded()
        
    }
    

【问题讨论】:

    标签: ios swift uiview uistackview


    【解决方案1】:

    可能的方法:

    1. 为每个问题视图/单元格使用带有动态单元格的表格视图,因此无需管理更多内容。
    2. 找到标签/问题/字符串高度 (https://stackoverflow.com/a/30450559/14733292) 并计算最终高度,例如标签高度 + 文本字段高度(如果文本字段被隐藏则传递零)+ 其他空间和组件高度并将此高度分配给XIB 高度。
    3. 不要限制高度。正确地为所有 XIB 子视图提供顶部、底部、前导、尾随约束。 更多信息请查看:https://stackoverflow.com/a/47216020/14733292

    【讨论】:

    • 感谢您提供帮助 :) 关于替代 2:在我的情况下,您将在哪里设置 xib 的高度替代 3:我已经这样做了,但它没有帮助。 xib 上的所有子视图都具有自动布局工作的所有适当约束。即使我将子视图设置为 statick heigt,当它添加到 stackview 时,它也会全部塞满。
    • 对于第二个替代设置,在您的代码中的第一个 init 中计算高度,您设置了 200。对于第三个替代设置,需要堆栈视图的代码并需要检查堆栈视图属性。
    • 谢谢。 init 成功了。我在 .zero 拥有它
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    相关资源
    最近更新 更多