菜鸟教程小白 发表于 2022-12-11 17:33:41

ios - 以编程方式快速添加全尺寸 View


                                            <p><p>我正在使用 iMessage 应用程序并以编程方式添加了一个 View 。但是,我似乎无法找出正确的约束来使其始终保持正确的大小。例如,如果我将扩展留给另一个并返回它,则 View 会向下移动几百像素。我认为这与.isActive 有关。我的目标是让 View 自动调整大小以始终保持正确的大小或占用全部可用的高度和宽度。</p>

<pre><code>func createBrowser() {
    let controller = MSStickerBrowserViewController(stickerSize: .small)
    addChildViewController(controller)
    view.addSubview(controller.view)

    controller.view.translatesAutoresizingMaskIntoConstraints = false
    controller.stickerBrowserView.backgroundColor = UIColor.blue
    controller.stickerBrowserView.dataSource = self

    view.topAnchor.constraint(equalTo: controller.view.topAnchor).isActive = true
    view.bottomAnchor.constraint(equalTo: controller.view.bottomAnchor).isActive = true
    view.leftAnchor.constraint(equalTo: controller.view.leftAnchor).isActive = true
    view.rightAnchor.constraint(equalTo: controller.view.rightAnchor).isActive = true
    view.centerXAnchor.constraint(equalTo: controller.view.centerXAnchor).isActive = true
    view.centerYAnchor.constraint(equalTo: controller.view.centerYAnchor).isActive = true
}
</code></pre>

<p>截图:<a href="https://d17oy1vhnax1f7.cloudfront.net/items/1F2B0s3v0s1k3E2L0Z07/Screen%20Shot%202016-09-19%20at%2011.42.51%20AM.png" rel="noreferrer noopener nofollow">https://d17oy1vhnax1f7.cloudfront.net/items/1F2B0s3v0s1k3E2L0Z07/Screen%20Shot%202016-09-19%20at%2011.42.51%20AM.png</a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>为了更好地解释我整理了以下内容。这演示了修复 subview 布局的两种方法。使用约束时,我更喜欢将约束创建为数组并一次性激活它们,正如您将在 createredSquareWithConstraints 的代码中看到的那样。约束只是一个将一个 View 的特征与另一个 View 的特征相关联的线性方程。例如,在“伪代码”中,我的数组中的第一个约束可以写成:</p>

<p>"设置 subview 的前导边距等于容器 View 前导边距的 1 倍加上常数 0。"</p>

<p>(这就是我之前感到困惑的原因,因为在我看来,好像您正在根据其中一个 subview 的特征设置包含 View 的约束。)</p>

<p>虽然使用布局约束仍然完全有效,但我认为这些天的首选方法是覆盖 viewWillTransitionToSize() 委托(delegate)方法,它只是要求您指定,给定包含 View 的大小,a 的框架是什么 ViewController 的 subview 应该是。因此,我也包含了一个实现,创建一个带有初始框架的黄色方 block ,然后在调用 viewWillTransitionToSize 时对其进行修改。我个人觉得这比使用布局约束要简单得多。</p>

<p>如果您使用按钮并旋转屏幕,您应该会看到这两种方法都可以实现相同的效果。 [注意,我将一个正方形标记为受约束,一个为不受约束,但实际上它们当然都是受约束的,只是方式不同。我要补充一点,这显然不是你在实践中会做的事情——你应该选择一种方法并坚持下去,否则你的代码会到处都是!]。</p>

<p>希望有帮助!</p>

<pre><code>import UIKit

class ViewController: UIViewController {

    var constrainedredSquare : UIView!
    var unconstrainedRedSquare : UIView!
    var methodOneButton : UIButton!
    var methodTwoButton : UIButton!

    override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
      self.view.backgroundColor = UIColor.blue

      func getButton(name: String) -&gt; UIButton {
            let button : UIButton = UIButton()
            button.backgroundColor = UIColor.white
            button.layer.cornerRadius = 3
            button.clipsToBounds = true
            button.setTitle(name, for: UIControlState.normal)
            button.setTitleColor(UIColor.black, for: UIControlState.normal)
            return button
      }

      self.methodOneButton = getButton(name: &#34;Red - Constraints&#34;)
      self.methodTwoButton = getButton(name: &#34;Yellow - viewWillTransitionToSize&#34;)

      self.methodOneButton.addTarget(self, action: #selector(self.createRedSquareWithConstraints), for: .touchUpInside)
      self.methodTwoButton.addTarget(self, action: #selector(self.createYellowSquareWithoutConstraints), for: .touchUpInside)
      self.methodOneButton.frame = CGRect(origin: CGPoint(x: 200, y: 100), size: CGSize(width: 300, height: 300))
      self.methodTwoButton.frame = CGRect(origin: CGPoint(x: self.view.frame.width - 500, y: 100), size: CGSize(width: 300, height: 300))
      self.view.addSubview(self.methodOneButton)
      self.view.addSubview(self.methodTwoButton)

    }

    override func didReceiveMemoryWarning() {
      super.didReceiveMemoryWarning()
      // Dispose of any resources that can be recreated.
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
      if let _ = self.unconstrainedRedSquare {
            self.unconstrainedRedSquare.frame = CGRect(origin: CGPoint.zero, size: size)
      }
      self.methodOneButton.frame = CGRect(origin: CGPoint(x: 200, y: 100), size: CGSize(width: 300, height: 300))
      self.methodTwoButton.frame = CGRect(origin: CGPoint(x: size.width - 500, y: 100), size: CGSize(width: 300, height: 300))
    }


    func createYellowSquareWithoutConstraints() {
      if let _ = self.unconstrainedRedSquare {
            self.unconstrainedRedSquare.removeFromSuperview()
      }
      else
      {
            if let _ = constrainedredSquare {
                self.constrainedredSquare.removeFromSuperview()
            }
            self.unconstrainedRedSquare = UIView()
            self.unconstrainedRedSquare.backgroundColor = UIColor.yellow
            self.unconstrainedRedSquare.frame = CGRect(origin: CGPoint.zero, size: self.view.frame.size)
            self.view.addSubview(self.unconstrainedRedSquare)

            self.view.bringSubview(toFront: self.methodOneButton)
            self.view.bringSubview(toFront: self.methodTwoButton)
      }

    }

    func createRedSquareWithConstraints() {
      if let _ = self.constrainedredSquare {
            self.constrainedredSquare.removeFromSuperview()
      }
      else
      {
            if let _ = self.unconstrainedRedSquare {
                self.unconstrainedRedSquare.removeFromSuperview()
            }
            let redSquare : UIView = UIView()
            redSquare.backgroundColor = UIColor.red

            self.view.addSubview(redSquare)

            self.view.bringSubview(toFront: self.methodOneButton)
            self.view.bringSubview(toFront: self.methodTwoButton)

            let rsConstraints : = [NSLayoutConstraint(item: redSquare, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.leading, multiplier: 1.0, constant: 0),
                                                 NSLayoutConstraint(item: redSquare, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.trailing, multiplier: 1.0, constant: 0),
                                                 NSLayoutConstraint(item: redSquare, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.top, multiplier: 1.0, constant: 0),
                                                 NSLayoutConstraint(item: redSquare, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.bottom, multiplier: 1.0, constant: 0),
                                                 NSLayoutConstraint(item: redSquare, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.width, multiplier: 1.0, constant: 0),
                                                 NSLayoutConstraint(item: redSquare, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: self.view, attribute: NSLayoutAttribute.height, multiplier: 1.0, constant: 0)]
            redSquare.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate(rsConstraints)
      }
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 以编程方式快速添加全尺寸 View ,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39577079/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39577079/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 以编程方式快速添加全尺寸 View