【问题标题】:How to update constraints after adding UIView from xib on UIScrollView in swift?swift - 在UIScrollView上从xib添加UIView后如何更新约束?
【发布时间】: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 中的标签上没有设置任何约束。

标签: ios swift uiview uiscrollview


【解决方案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 是正确的。在这种情况下,前导锚和尾随锚并不是正确的选择。我已经编辑了答案,改为包含高度和宽度约束。我已经对此进行了测试并确认它可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2013-01-13
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 2015-05-06
  • 2021-04-10
相关资源
最近更新 更多