addArrangedSubview 与 addSubview

Posted

技术标签:

【中文标题】addArrangedSubview 与 addSubview【英文标题】:addArrangedSubview vs addSubview 【发布时间】:2019-03-18 12:44:37 【问题描述】:

我是新手,我编写了一个继承自 StackView 的 customView,并以编程方式创建了一个带有少量属性的 button,当我将它添加到我的自定义视图时,我遇到了两个问题:

    如果我使用addArrangedSubview(myBtn),我的视图会忽略 我添加并填充了整个宽度。但是如果我使用addSubView(myBtn), 没关系(44x44 的蓝色方块) 如果我使用addArrangedSubview(myBtn)addTarget() 不起作用并且 myBtn 不可点击,但是当我使用 addSubView(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 ????")



这是预览:

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

【问题讨论】:

它工作正常。 addArrangedSubview没有问题 我在我的问题中添加了图片。看看 【参考方案1】:

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

一个UIStackView,可以从它的.addArrangedSubview()方法猜到,排列它的子视图,基于它的.axis.alignment,@987654326 @ 和.spacing 属性,以及它的frame

所以,阅读一下UIStackView 以及如何使用它。最有可能的是,您目前正在限制您的自定义视图:

顶部 领先 尾随(或宽度)

因此,将按钮添加为 arrangedSubView 会导致它拉伸到堆栈视图的宽度,因为这是默认设置。

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

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

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

【讨论】:

感谢@DonMag。检查我最近添加到问题中的图像。在我使用 addView() 的情况下,它是可见的(没有你说的零高度)但没有响应点击。我正在练习this tutorial,它使用 addArrangedSubView 但结果与我的不同! @MahdiMoqadasi - 您是在 Storyboard 中还是通过代码布置自定义 RatingControl? @MahdiMoqadasi - 哦,您正在学习食物追踪器教程。请注意,在第 4 部分的开头 - “实现自定义控件” - 您的垂直堆栈视图设置为 Alignment: Leading... 在第 4 部分中,您被指示将其更改为 Center。此时,您的自定义控件应该只是“星”按钮数量的宽度+间距,并且应该在图像下方居中。如果您将垂直堆栈视图设置为 Alignment: Fill,这就是为什么您的按钮水平拉伸而不是使用您定义的宽度 44 你错过了一点。您的自定义 horizo​​ntal stackView 嵌入在 vertical 堆栈视图中。检查垂直堆栈视图的Alignment,确保it 设置为Center。如果您在自定义堆栈视图中添加了左右约束,那么您已经离开了该教程。

以上是关于addArrangedSubview 与 addSubview的主要内容,如果未能解决你的问题,请参考以下文章

我是不是应该将“addArrangedSubview”附在动画块中?

addSubview 和 addArrangedSubview 不显示内容

addArrangedSubview 是重叠视图

iOS - UIStackView - zorder

UIStackView 的高度和垂直位置不明确

add与add to的用法区别?