自动布局子视图在 Swift 4 中添加问题

Posted

技术标签:

【中文标题】自动布局子视图在 Swift 4 中添加问题【英文标题】:Autolayout subview add issue in Swift 4 【发布时间】:2017-12-11 07:20:49 【问题描述】:

我正在尝试将子视图添加到全屏父视图中,但它没有显示在全屏父视图中。如果我不初始化或不将其设置在框架内,则不会显示

【问题讨论】:

【参考方案1】:

试试这个 你会发现一些有用的东西 只需添加此 UIView 扩展程序

extension UIView 
    func fillInSuperView(inset:UIEdgeInsets = UIEdgeInsets.zero)  
            self.translatesAutoresizingMaskIntoConstraints = false
            self.leadingAnchor.constraint(equalTo: (self.superview?.leadingAnchor)!, constant: inset.left).isActive = true;
            self.trailingAnchor.constraint(equalTo: (self.superview?.trailingAnchor)!, constant: -inset.right).isActive = true
            self.topAnchor.constraint(equalTo: (self.superview?.topAnchor)!, constant: inset.top).isActive = true
            self.bottomAnchor.constraint(equalTo: (self.superview?.bottomAnchor)!, constant: -inset.bottom).isActive = true
        

调用这个函数

YourView.fillInSuperView(inset: UIEdgeInsets.zero)

您可以通过设置 insets 从 superView 设置填充

【讨论】:

【参考方案2】:

将 v1 框架布局更改为全屏布局。高度和宽度将是全屏高度和宽度。您可以使用此更新帧大小

let v1 = UIView(frame: CGRect(x:0, y:0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))

通过使用它不需要使用Autolayout 约束。

【讨论】:

你不明白我的问题,对不起。我的问题是为什么子视图不显示带有约束的全屏父视图【参考方案3】:

改变 v1 宽度和高度 到父宽度和高度 喜欢

let v1 = UIView(frame: CGRect(x:0, y:0, width: view.bounds.size.width, height: view.bounds.size.height))

这可能有效

【讨论】:

我认为自动布局应该使用约束自动更新宽度高度,如果我需要设置宽度、高度,那么这里的自动布局是什么意思?【参考方案4】:

您的错误是您为 v1 指定了固定宽度和高度

 i.e. let v1 = UIView(frame: CGRect(x:0, y:0, width: 100, height: 50))

试试这个

let v1 = UIView()
// this will take frame(x, y, width, height) from superview
v1.frame = view.frame 

【讨论】:

没有这个,与视图无关,无论你设置什么尺寸,自动布局仍然应用约束 嗯,但是这个新的 v1 视图将像它的父视图一样抓取相同的帧,并且会适合。 试试这个 v1.frame = view.bounds (这里的视图是你的超级视图) 想要的是当超级视图发生变化时,子视图也会自动布局约束,你为 v1 设置的框架并不重要【参考方案5】:

使用此功能将 v1 帧大小更改为全视图

let v1 = UIView(frame: UIScreen.main.bounds)

这会起作用。

【讨论】:

我不想要,只是想要 v1 全屏 superview 当 superview 调整大小,而不是全屏【参考方案6】:

试试这个,

let v1 = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
    v1.backgroundColor = UIColor.gray
    v1.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(v1)

    view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v1]|", options: [], metrics: nil, views: ["v1" : v1]))
    view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v1]|", options: [], metrics: nil, views: ["v1" : v1]))

【讨论】:

这个产品在操场上效果一样。 你在操场上工作吗?我为 ios 添加了这段代码,你可以在模拟器和设备的 UI 中看到这段代码的效果。 我只是告诉你你添加的约束和新的锚约束效果相同,是的,我在操场上测试过, 那么您还有其他问题。因为我已经在 iOS 模拟器中测试过了,它运行良好。

以上是关于自动布局子视图在 Swift 4 中添加问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 使用自动布局时获取视图框架

页面应用程序 + 自动布局 + 子视图在滚动时缩放

我的带有自动布局约束的 Swift 4 UIScrollView 没有滚动

Swift - 如何对 ScrollView 中的项目使用自动布局?

使用 Masonry 向视图的子视图添加自动布局约束

自动布局 swift 在标签上无法正常工作