【发布时间】:2023-03-31 06:44:01
【问题描述】:
我有一个自定义 UIView,它是 UIScrollView 的子类。在 init(_ frame) 方法中,我添加了一个子视图,如下所示:
contentView = ContentView()
contentView.backgroundColor = UIColor.blue
contentView.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(contentView)
contentView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
contentView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
contentView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
// create contentView's Width and Height constraints
cvWidthConstraint = contentView.widthAnchor.constraint(equalToConstant: 0.0)
cvHeightConstraint = contentView.heightAnchor.constraint(equalToConstant: 0.0)
// activate them
cvWidthConstraint.isActive = true
cvHeightConstraint.isActive = true
cvWidthConstraint.constant = timelineWidth //It's non-zero
cvHeightConstraint.constant = 2.0*frame.height
问题是更新 contentView 框架需要时间。它肯定不会在 init(_ frame) 调用中更新。 contentView 框架何时设置以及如何捕获框架更新事件?
【问题讨论】:
-
首先,您的代码没有显示
contentView被添加为子视图。第二,你是什么意思“更新contentView框架需要时间”?第三,您应该将contentView限制为滚动视图的contentLayoutGuide。但是,您发布的问题缺少解释正在发生的事情并给您答案所需的信息。 -
对不起,我错过了发布 addSubview 行,没有它显然代码会崩溃,现在添加它。此初始化发生在 init(_frame) 中。我在同一个调用中需要 contentView.frame ,但在这个调用中它是 CGRect.zero 。在 layoutSubviews 被调用之前它不会被设置。
-
“我在同一个调用中需要 contentView.frame...” -- 为什么?从您发布的代码和您的描述来看,scrollView 中没有任何内容可以滚动。如果您要向
contentView添加子视图,请给它们适当的约束,以便contentView将保留它们并自动处理可滚动区域。 -
因为在这个 UIScrollView 之外有一个外部视图,它的帧同步到这个 contentView 帧。每当 contentView 框架发生变化时,都需要重新绘制它。
-
使用您显示的代码,您已将
contentView宽度和高度约束设置为零。你预计框架什么时候会改变?这个“外部视图”是什么,它被限制在什么范围内?如果您不告诉我们您要做什么,我们无法猜测如何为您提供帮助。
标签: ios swift uiview uiscrollview uikit