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
。
你错过了一点。您的自定义 horizontal stackView 嵌入在 vertical 堆栈视图中。检查垂直堆栈视图的Alignment
,确保it 设置为Center
。如果您在自定义堆栈视图中添加了左右约束,那么您已经离开了该教程。以上是关于addArrangedSubview 与 addSubview的主要内容,如果未能解决你的问题,请参考以下文章
我是不是应该将“addArrangedSubview”附在动画块中?