[英]Not able to lay out Subviews on a custom UIView in Swift
所以我创建了这个自定义容器视图,我使用autolayout约束进行布局。
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()
,我根据n umberOfSegments
添加umberOfSegments
这是代码:
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个UIViews,我得到3,但第三个没有正确放置并且超出了父容器。 如何才能正确对齐这些uiviews。 我猜测需要调用setNeedsLayout()
和layoutIfNeeded()
地方存在一些问题。 请帮忙。
Segment
是一个具有两个属性的结构 - bottomSegment和topSegment。 两者都是UIView
您可以看到只有三个UIView段出现。 我需要4( numberOfSegments
= 4)这些。 另外,我给父容器常量8和-8适用于right and leftAnchor
。 所以需要在这个视图中放置所有4个段。 正如您在上面的图片中看到的那样,最后一个段位于父容器之外。
尝试致电addSegments
在onViewDidAppear
。 如果它有效,则意味着在您的代码中视图仍然没有正确的框架。
为此,当视图控制器的视图发生更改时,您需要调整视图的框架:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
guard let numberOfSegments = numberOfSegments else { return }
for i in 0..<numberOfSegments {
configureSegmentFrame(index: i, segmentView: segment)
}
}
您可能必须更清洁,但它应该工作。
问题是
let widthOfSegment : CGFloat = (self.frame.width ...
正在被召唤太快 。 你不能做任何事情,这取决于self
有它的框架,直到它有它的真实框架。
对于UIView,那个时刻是在第一次调用layoutSubviews
之后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.