代码之家  ›  专栏  ›  技术社区  ›  Mahdi Moqadasi

addArrangedSubview与addSubview

  •  0
  • Mahdi Moqadasi  · 技术社区  · 7 年前

    我是新手,我写了一个从 StackView 我创造了一个 button 以编程方式使用很少的属性,当我将其添加到自定义视图时,我有两个问题:

    1. 如果我用 addArrangedSubview(myBtn) ,我的视图忽略 我添加并填充整个宽度。但如果我用 addSubView(myBtn) , 没关系(44x44的蓝色正方形)
    2. 如果我用 addArrangedSubview(myBtn) , addTarget() 不起作用 myBtn 不可点击,但当我使用 添加子视图(myBtn) ,它起作用 完美。

    这是我的自定义视图类:

    import UIKit
    
    class RatingControl: UIStackView {
    
    //MARK: Initialization
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupButtons()
    }
    
    required init(coder: NSCoder) {
        super.init(coder:coder)
        setupButtons()
    }
    
    //MARK: Private Methods
    private func setupButtons() {
    
        // Create the button
        let button = UIButton()
        button.backgroundColor = UIColor.blue
    
        // Add constraints
        button.translatesAutoresizingMaskIntoConstraints = false
        button.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
        button.widthAnchor.constraint(equalToConstant: 44.0).isActive = true
    
        // Setup the button action
        button.addTarget(self, action: #selector(ratingButtonTapped(_:)), for: .touchUpInside)
    
        // Add the button to the stack
        addArrangedSubview(button)
    
    }
    //MARK: Button Action
    @objc func ratingButtonTapped(_ sender: Any) {
        print("Button pressed 👍")
    }
    
    }
    

    以下是预览:

    enter image description here enter image description here

    有什么区别 addSubView() addArrangedSubview() ? 为什么会出现这些问题?

    0 回复  |  直到 7 年前
        1
  •  3
  •   DonMag    7 年前

    我假设您想要水平添加几个按钮(例如使用典型的“stars”分级控件)。

    一个 UIStackView ,从它的 .addArrangedSubview() 方法, 安排 它的子视图,基于 .axis , .alignment , .distribution .spacing 财产,以及 frame .

    所以,读一些关于 UIStackView公司 以及如何使用。最有可能的是,您当前正在使用以下内容限制自定义视图:

    • 顶部
    • 主要的
    • 尾随(或宽度)

    所以添加按钮作为 arrangedSubView 导致它拉伸到堆栈视图的宽度,因为这是默认值。

    添加为 subview 只需将按钮覆盖在堆栈视图上,而不允许堆栈视图对其进行排列,然后堆栈视图的高度可能为零,因此无法点击该按钮。

    尝试设置 只有 添加自定义堆栈视图时的顶部和前导约束。这应该给你一个 44 x 44 可点击的按钮。

    当您使用 .addArrangedSubview() ,这些按钮将水平排列,这可能是您想要的。