gpt4 book ai didi

swift - 我在 swift playgrounds 上添加了 uiview 约束,但约束不起作用,为什么?

转载 作者:行者123 更新时间:2023-11-28 05:51:58 25 4
gpt4 key购买 nike

为什么 uiview 约束不起作用?我添加了 uiview 高度和宽度的约束以及位置关系,但是它们不起作用,为什么?

import UIKit
import Foundation

class myview : UIView{
override init(frame:CGRect)
{
super.init(frame: frame)
}
required init(coder: NSCoder)
{
super.init(coder: coder)!
}
func setcolor(color : UIColor){
self.backgroundColor=UIColor.green
}

}
let my1:myview = myview(frame: CGRect(x: 99 , y: 99, width: 99, height: 99))
let my2:myview = myview(frame:CGRect(x:50,y:50,width:50,height:50))
my2.setcolor(color: #colorLiteral(red: 0.952941179275513, green: 0.686274528503418, blue: 0.133333340287209, alpha: 1.0))
my1.backgroundColor = UIColor.orange
my1.translatesAutoresizingMaskIntoConstraints=false
my2.translatesAutoresizingMaskIntoConstraints=false
let leadingheight=NSLayoutConstraint.init(item: my2, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 120)
let leadingwidth=NSLayoutConstraint.init(item: my2, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 60)
my1
my2.addConstraints([leadingheight,leadingwidth])

my1.addSubview(my2)

let cons2:NSLayoutConstraint = NSLayoutConstraint.init(item: my2, attribute: .left , relatedBy: .equal, toItem: my1, attribute: .left , multiplier: 1.0, constant: 20)

my2.addConstraints([cons2])
my2.updateConstraints()
my1.updateConstraints()

my1

enter image description here

最佳答案

我让你的例子成功了。请参阅内联注释以获取解释:

// Note: This frame will be ignored once translatesAutoresizingMaskIntoConstraint is set to false
let my1 = myview(frame: CGRect(x: 99, y: 99, width: 99, height: 99))
let my2 = myview(frame:CGRect(x: 50, y: 50, width: 50, height: 50))
my2.setcolor(color: #colorLiteral(red: 0.952941179275513, green: 0.686274528503418, blue: 0.133333340287209, alpha: 1.0))
my1.backgroundColor = UIColor.orange

// Use constraints, not frame for size of my1 and my2
my1.translatesAutoresizingMaskIntoConstraints = false
my2.translatesAutoresizingMaskIntoConstraints = false

// Frame not used, so set constraints for width and height of my1
let my1height = NSLayoutConstraint(item: my1, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 200)
let my1width = NSLayoutConstraint(item: my1, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 200)

// Frame not used, so set constraints for width and height of my2
let leadingheight = NSLayoutConstraint(item: my2, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 120)
let leadingwidth = NSLayoutConstraint(item: my2, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 60)

// Activate the constraints instead of adding them to a view
NSLayoutConstraint.activate([my1width, my1height, leadingheight, leadingwidth])

my1.addSubview(my2)

let cons2 = NSLayoutConstraint(item: my2, attribute: .left , relatedBy: .equal, toItem: my1, attribute: .left , multiplier: 1.0, constant: 20)

// This is how to activate a single constraint
cons2.isActive = true

my1

注意事项:

  1. 从 iOS 8 开始,启用约束的正确方法是激活它们而不是将它们添加到 View 中。激活它们会告诉 iOS 将它们添加到正确的 View 中;如果您自己将它们添加到 View 中,则必须小心地将它们添加到正确 View 中。你的cons2应该添加到 my1不是my2因为约束涉及 my1它是 my2 的父级.
  2. 一旦你设置了translatesAutoresizingMaskIntoConstraintsfalse , frame被忽略,因此您需要确保您有约束条件来完全指定 View 的大小。
  3. 不要调用 updateConstraints .如果需要任何东西让 Auto Layout 在 Playground 中发挥作用,您可以调用 layoutIfNeeded()在你看来。
  4. 风格注释:尽可能让 Swift 解释变量的类型。
  5. 不要使用 .init . Swift 方法是只使用类/结构名称。 (例如 NSLayoutConstraint(item:...) 而不是 NSLayoutConstraint.init(item...) )

关于swift - 我在 swift playgrounds 上添加了 uiview 约束,但约束不起作用,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52604576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com