代码之家  ›  专栏  ›  技术社区  ›  Emre Önder

UIStackView中的UITextField宽度约束的间距问题

  •  0
  • Emre Önder  · 技术社区  · 7 年前

    我有一个垂直的 UIStackView UITextFields (现在只有4)在里面。当我给UIStackView设置间距时,我给出了下面的错误;

    "<NSLayoutConstraint:0x1c4286720 H:|-(0)-[UIStackView:0x104d3e6f0](LTR)   (active, names: '|':Hello.OtpInputView:0x104d3c5b0 )>",
    "<NSLayoutConstraint:0x1c4286770 UIStackView:0x104d3e6f0.right == Hello.OtpInputView:0x104d3c5b0.right   (active)>",
    "<NSLayoutConstraint:0x1c4286860 '_UITemporaryLayoutWidth' Hello.OtpInputView:0x104d3c5b0.width == 0   (active)>",
    "<NSLayoutConstraint:0x1c4286e50 'UISV-canvas-connection' UIStackView:0x104d3e6f0.leading == Hello.CustomOtpTextField:0x10588d600.leading   (active)>",
    "<NSLayoutConstraint:0x1c4286ea0 'UISV-canvas-connection' H:[Hello.CustomOtpTextField:0x105082600]-(0)-|   (active, names: '|':UIStackView:0x104d3e6f0 )>",
    "<NSLayoutConstraint:0x1c4286f40 'UISV-fill-equally' Hello.CustomOtpTextField:0x105024600.width == Hello.CustomOtpTextField:0x10588d600.width   (active)>",
    "<NSLayoutConstraint:0x1c4287030 'UISV-fill-equally' Hello.CustomOtpTextField:0x105077a00.width == Hello.CustomOtpTextField:0x10588d600.width   (active)>",
    "<NSLayoutConstraint:0x1c42871c0 'UISV-fill-equally' Hello.CustomOtpTextField:0x105082600.width == Hello.CustomOtpTextField:0x10588d600.width   (active)>",
    "<NSLayoutConstraint:0x1c4286ef0 'UISV-spacing' H:[Hello.CustomOtpTextField:0x10588d600]-(10)-[Hello.CustomOtpTextField:0x105024600]   (active)>",
    "<NSLayoutConstraint:0x1c4286fe0 'UISV-spacing' H:[Hello.CustomOtpTextField:0x105024600]-(10)-[Hello.CustomOtpTextField:0x105077a00]   (active)>",
    "<NSLayoutConstraint:0x1c42870d0 'UISV-spacing' H:[Hello.CustomOtpTextField:0x105077a00]-(10)-[Hello.CustomOtpTextField:0x105082600]   (active)>"
    

    )

    将尝试通过破坏约束来恢复

    如何声明StackView:

    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .horizontal
    stackView.distribution = .fillEqually
    stackView.spacing = 10
    
    //textFields is just an array of UITextFields
    textFields.enumerated().forEach { (index,field) in
        field.textColor = UIColor.darkGray
        field.font = Font.sourceSansRegular?.withSize(46)
        field.keyboardType = .numberPad
        field.delegate = self
        field.translatesAutoresizingMaskIntoConstraints = false
        field.tag = index
        field.textAlignment = .center
        field.myDelegate = self
        field.sizeToFit()
        stackView.addArrangedSubview(field)
        field.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: (CGFloat(0 / textFields.count)),constant: CGFloat(10 * (textFields.count - 1))).isActive = true
    }
    
    self.addSubview(stackView)
    stackView.anchor(self.topAnchor, left: self.leftAnchor, bottom: self.bottomAnchor, right: self.rightAnchor, topConstant: 0, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: 0, heightConstant: 0)
    

    UIStackView公司 UITextFields公司 应该有20pt((20*4)+(3*10),即110)。因此,所有 应具有相同宽度(相等填充)

    我怎样才能做到这一点?

    编辑: 我想我需要为一个文本字段指定至少一个宽度,所以我添加了

     field.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: (CGFloat(0 / textFields.count)),constant: CGFloat(10 * (textFields.count - 1))).isActive = true
    

    不过,这也会导致中断错误。

    编辑2: 这个堆栈视图在一个自定义的UIView中,我在里面设置了锚

     override init(frame: CGRect) {
        super.init(frame: frame)
        //Where I gave all anchors
        setupUI()
    }
    

    以及如何初始化此自定义UIView

        override func viewDidLoad() {
        super.viewDidLoad()
    
        // Do any additional setup after loading the view.
        self.view.backgroundColor = UIColor.white
        self.view.addSubview(otpField)
        otpField.anchor(self.view.topAnchor, left: self.view.leftAnchor, bottom: nil, right: self.view.rightAnchor, topConstant: 40, leftConstant: 40, bottomConstant: 0, rightConstant: 40, widthConstant: 0, heightConstant: 60)
    }
    

    我想在照片中实现的目标:

    Image

    1 回复  |  直到 7 年前
        1
  •  0
  •   Kuldeep Tanwar    7 年前

    如果您已经设置了 stackView.distribution = .fillEqually 向您的任何文本文件添加这样的约束

    let height = NSLayoutConstraint(item: textField1, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1.0, constant: 40.0)
    textField1.addConstraint = height
    

    Height = 40 , Space = 10 (Height * Number of textfields) + (Space * (number of textfield - 1))

    注意:垂直和水平stackview的概念是相同的,您需要使用高度和宽度。