swift - 在UIScrollView上从xib添加UIView后如何更新约束?
Posted
技术标签:
【中文标题】swift - 在UIScrollView上从xib添加UIView后如何更新约束?【英文标题】:How to update constraints after adding UIView from xib on UIScrollView in swift? 【发布时间】:2017-08-21 15:14:06 【问题描述】:我在视图控制器中有一个UIViewScroll
(背景颜色为蓝色)。我需要来自 Xib 的UIView
(背景颜色为白色)。 Xib 视图有一个带有约束的UILabel
(背景颜色为绿色)。现在,问题是UILabel
约束在添加到scrollView
后未应用。如何在不丢失约束的情况下添加UIView
?请参考以下截图和代码。
注意:
我只需要更新UIView
的子视图的约束,而不使用NSLayoutConstraints
的IBOutlets
。
UIView
在 Xib 上:
代码:
class ViewController: UIViewController
@IBOutlet var scrollView: UIScrollView!
var profileView:UIView!
override func viewDidLoad()
super.viewDidLoad()
self.profileView = UINib.init(nibName: "ProfileView", bundle: nil).instantiate(withOwner: self)[0] as! UIView
self.scrollView.addSubview(self.profileView)
override func viewDidLayoutSubviews()
super.viewDidLayoutSubviews()
self.profileView.layer.frame.size = CGSize(width: self.scrollView.frame.width, height: self.profileView.frame.height)
self.profileView.layer.position = CGPoint(x: self.scrollView.frame.width/2, y: (self.profileView.frame.height/2)+10)
输出:
更新:更多信息
我知道设置滚动视图的contentSize
。我使用UIView
的layer
属性来操作UIView
的高度和宽度。除了改变高度和宽度,我还需要更新UIView
的子视图的约束。
这是一个理解示例。但是,实际上我会添加更多这样的视图。
Github 存储库: https://github.com/RAJAMOHAN-S/ScrollViewTest
所需输出:
【问题讨论】:
为什么不以编程方式在配置文件视图中添加标签?还是违反要求? 尝试在 viewDidLoad() 方法中将 frame 设置为 profile view。 @RAJAMOHAN-S - 你为什么要设置.layer
属性?而且,您需要提供更多信息...您是否希望将 XIB 视图的大小调整为 填充 滚动视图?如果是这样,你打算用什么来控制.contentSize
?如果你不希望它完全填满滚动视图,你希望它有多大,你希望它放在哪里?再说一遍,是什么控制了.contentSize
?
OK - 不操作.layer
属性。这不是你想做的,也不会给你想要的结果。相反,您需要在加载的视图上设置.frame
或.constraints
。您是否仍然无法通过 WsCandy 的回答得到您想要的?
在您的 GitHub 存储库中,您的 XIB 中的标签上没有设置任何约束。
【参考方案1】:
您最好的选择是以编程方式设置self.profileView
的约束,我在下面添加了一个示例来帮助您入门。
class TestVC: UIViewController
@IBOutlet var scrollView: UIScrollView!
private var profileView: UIView!
override func viewDidLoad()
super.viewDidLoad()
self.profileView = UINib.init(nibName: "ProfileView", bundle: nil).instantiate(withOwner: self)[0] as! UIView
self.configureProfileView()
private func configureProfileView() -> Void
self.profileView.translatesAutoresizingMaskIntoConstraints = false
self.scrollView.addSubview(self.profileView)
self.profileView.widthAnchor.constraint(equalTo: self.scrollView.widthAnchor).isActive = true
self.profileView.heightAnchor.constraint(equalToConstant: 50.0).isActive = true
// Pin the profile view to the top of the scrollView
self.profileView.topAnchor.constraint(equalTo: self.scrollView.topAnchor).isActive = true
更多信息也可以在这里找到:https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/ProgrammaticallyCreatingConstraints.html
【讨论】:
我会尽快查看是否可以复制问题并回复您 @RAJAMOHAN-S - 尝试使用该代码...找出问题所在并修复它。这里有一个提示:你必须设置.profileView
的宽度和高度约束
@DonMag 是正确的。在这种情况下,前导锚和尾随锚并不是正确的选择。我已经编辑了答案,改为包含高度和宽度约束。我已经对此进行了测试并确认它可以正常工作。以上是关于swift - 在UIScrollView上从xib添加UIView后如何更新约束?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 4 上从 didFinishLaunchingWithOptions 获取通知中心数据