繁体   English   中英

无法在Swift中的自定义UIView上布置子视图

[英]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个段。 正如您在上面的图片中看到的那样,最后一个段位于父容器之外。

尝试致电addSegmentsonViewDidAppear 如果它有效,则意味着在您的代码中视图仍然没有正确的框架。

为此,当视图控制器的视图发生更改时,您需要调整视图的框架:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM