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

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

【问题讨论】:

    标签: ios swift swift4 nslayoutconstraint ios-autolayout


    【解决方案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 模拟器中测试过了,它运行良好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2014-02-25
      • 2018-09-15
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多