【发布时间】:2019-11-02 01:38:33
【问题描述】:
所以我创建了这个自定义容器视图,我正在使用自动布局约束进行布局。
func configureSegmentContainerView() {
segmentContainerView.topAnchor.constraint(equalTo: view.topAnchor, constant: 40).isActive = true
segmentContainerView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 8).isActive = true
segmentContainerView.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -8).isActive = true
segmentContainerView.heightAnchor.constraint(equalToConstant: 3).isActive = true
}
在视图控制器中,viewDidLoad() 是这样的:
setupDataSource()
segmentContainerView = ATCStorySegmentsView()
view.addSubview(segmentContainerView)
configureSegmentContainerView()
segmentContainerView.translatesAutoresizingMaskIntoConstraints = false
segmentContainerView.numberOfSegments = friendStory.count
现在,一旦设置了数据源并且我有 friendStory 计数,我将其分配给 segmentContainerView.numberofSegments
在segmentContainerview 类中发生了这样的事情:
var numberOfSegments: Int? {
didSet {
addSegments()
}
}
在addSegments() 中,我根据 numberOfSegments 添加 UIViews,这是它的代码:
private func addSegments() {
guard let numberOfSegments = numberOfSegments else { return }
layoutIfNeeded()
setNeedsLayout()
for i in 0..<numberOfSegments {
let segment = Segment()
addSubview(segment.bottomSegment)
addSubview(segment.topSegment)
configureSegmentFrame(index: i, segmentView: segment)
segmentsArray.append(segment)
}
}
private func configureSegmentFrame(index: Int, segmentView: Segment) {
guard let numberOfSegments = numberOfSegments else { return }
let widthOfSegment : CGFloat = (self.frame.width - (padding * CGFloat(numberOfSegments - 1))) / CGFloat(numberOfSegments)
let i = CGFloat(index)
let segmentFrame = CGRect(x: i * (widthOfSegment + padding), y: 0, width: widthOfSegment, height: self.frame.height)
segmentView.bottomSegment.frame = segmentFrame
segmentView.topSegment.frame = segmentFrame
segmentView.topSegment.frame.size.width = 0
}
**问题和问题:** 我没有得到 4 个 UIView,而是得到了 3 个,但是第三个没有正确放置并且超出了父容器。我怎样才能让这些 uiviews 正确对齐。我猜在需要调用setNeedsLayout() 和layoutIfNeeded() 的地方存在一些问题。请帮忙。
Segment 是一个具有两个属性的结构 - bottomSegment 和 topSegment。两者都是 UIView
您可以看到只有三个 UIView 段是如何出现的。我需要其中的 4 个(numberOfSegments = 4)。我还为right and leftAnchor 提供了父容器常量 8 和 -8。所以所有 4 个段都需要放在这个视图中。正如您在上图中看到的那样,最后一段超出了父容器。
【问题讨论】:
-
问题在您的 configureSegmentFrame 方法中,使用您的逻辑位置调试器并逐步检查。
-
这看起来像是
UIStackView的理想案例 - 你看过了吗? -
还没有。让我试试 stackview 看看有没有什么改善
-
@AbuUlHassan 在 viewDidLayoutSubviews 中发送数据源可以完美地布置视图。但我不想使用 ViewDidLayoutSubviews 发送数据源信息。现在该做什么。
-
在这种情况下,用户观察者......
标签: ios swift uiview frame subview