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 的子视图的约束,而不使用NSLayoutConstraintsIBOutlets

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。我使用UIViewlayer 属性来操作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 上从 URL 加载/下载图像

如何在 swift 4 上从 didFinishLaunchingWithOptions 获取通知中心数据

为啥我在 iOS 上从 Swift 调用服务时收到 SSL 错误?

如何在 swift4 上从服务器播放 mp3 声音?

如何在 Swift 上从最后一个 VC 更改为中间 VC

我可以在Swift上从Web服务器获取3D模型吗?