有没有办法更新故事板中大量约束的常量值?
Is there a way to update the constant value of a large number of constraints in a storyboard?
假设在我的情节提要中,我有一堆控制器视图,这些视图将它们的内容与具有特定插图的左边缘和右边缘对齐(例如:6pts 的填充)。如果我以后想更改该填充值,我如何才能快速在整个项目中进行更改?有没有办法在 Storyboard 中使用某个标记更改所有约束的常量,或者我是否必须创建一种 "contentView" class 并将其放在每个 [=14 的基础视图中=] 在我的项目中?
如果固定子视图的超级视图处于自动布局下,则在超级视图的大小检查器中它有一个布局边距部分。因此,如果这些子视图被固定到布局边距(这是在 Interface Builder 中创建约束时的默认设置),您所要做的就是更改父视图的布局边距。
这很简单,但是没有神奇的方法可以一步完成故事板中的所有超级视图(除非你想变得非常大胆并将故事板编辑为文本 - 它只是 [=毕竟 14=]。
您可以使用 NSLayoutConstraint
的自定义子 class 获得您想要的效果:
class AdjustableConstraint: NSLayoutConstraint {
@IBInspectable var name: String = ""
class func setConstant(ofConstraintsNamed name: String, to value: CGFloat) {
constantForName[name] = value
NSNotificationCenter.defaultCenter().postNotificationName(notificationName,
object: self, userInfo: [nameKey: name])
}
override func awakeFromNib() {
super.awakeFromNib()
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(AdjustableConstraint.observeAdjustmentNotification(_:)),
name: AdjustableConstraint.notificationName, object: AdjustableConstraint.self)
updateConstant()
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self,
name: AdjustableConstraint.notificationName, object: AdjustableConstraint.self)
}
@objc private func observeAdjustmentNotification(note: NSNotification) {
guard
let userInfo = note.userInfo
where userInfo[AdjustableConstraint.nameKey] as? String == name
else { return }
updateConstant()
}
private func updateConstant() {
if let newConstant = AdjustableConstraint.constantForName[name] {
self.constant = newConstant
}
}
private static var constantForName = [String: CGFloat]()
private static let notificationName = "UpdateAdjustableConstraintConstant"
private static let nameKey = "name"
}
这是使用方法。对于情节提要中要一起调整的所有约束,将它们的自定义 class 设置为 AdjustableConstraint
。 (您可以 select 文档大纲中的多个约束以同时设置所有约束的自定义 class。)
这样做将使 Xcode 在属性检查器中为这些约束显示一个新字段“名称”。将名称设置为一些字符串,例如“customMargin”:
在您的代码中,您可以为每个 AdjustableConstraint
设置一个特定名称的常量,如下所示:
AdjustableConstraint.setConstant(ofConstraintsNamed: "customMargin", to: 10)
当从情节提要中加载 AdjustableConstraint
时,如果您之前为其名称设置了常量,它将应用该常量。所以这也适用于新加载的约束。您可能希望在加载任何约束之前初始化常量,方法是在启动时在您的应用程序委托中设置它:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
AdjustableConstraint.setConstant(ofConstraintsNamed: "customMargin", to: 30)
return true
}
假设在我的情节提要中,我有一堆控制器视图,这些视图将它们的内容与具有特定插图的左边缘和右边缘对齐(例如:6pts 的填充)。如果我以后想更改该填充值,我如何才能快速在整个项目中进行更改?有没有办法在 Storyboard 中使用某个标记更改所有约束的常量,或者我是否必须创建一种 "contentView" class 并将其放在每个 [=14 的基础视图中=] 在我的项目中?
如果固定子视图的超级视图处于自动布局下,则在超级视图的大小检查器中它有一个布局边距部分。因此,如果这些子视图被固定到布局边距(这是在 Interface Builder 中创建约束时的默认设置),您所要做的就是更改父视图的布局边距。
这很简单,但是没有神奇的方法可以一步完成故事板中的所有超级视图(除非你想变得非常大胆并将故事板编辑为文本 - 它只是 [=毕竟 14=]。
您可以使用 NSLayoutConstraint
的自定义子 class 获得您想要的效果:
class AdjustableConstraint: NSLayoutConstraint {
@IBInspectable var name: String = ""
class func setConstant(ofConstraintsNamed name: String, to value: CGFloat) {
constantForName[name] = value
NSNotificationCenter.defaultCenter().postNotificationName(notificationName,
object: self, userInfo: [nameKey: name])
}
override func awakeFromNib() {
super.awakeFromNib()
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(AdjustableConstraint.observeAdjustmentNotification(_:)),
name: AdjustableConstraint.notificationName, object: AdjustableConstraint.self)
updateConstant()
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self,
name: AdjustableConstraint.notificationName, object: AdjustableConstraint.self)
}
@objc private func observeAdjustmentNotification(note: NSNotification) {
guard
let userInfo = note.userInfo
where userInfo[AdjustableConstraint.nameKey] as? String == name
else { return }
updateConstant()
}
private func updateConstant() {
if let newConstant = AdjustableConstraint.constantForName[name] {
self.constant = newConstant
}
}
private static var constantForName = [String: CGFloat]()
private static let notificationName = "UpdateAdjustableConstraintConstant"
private static let nameKey = "name"
}
这是使用方法。对于情节提要中要一起调整的所有约束,将它们的自定义 class 设置为 AdjustableConstraint
。 (您可以 select 文档大纲中的多个约束以同时设置所有约束的自定义 class。)
这样做将使 Xcode 在属性检查器中为这些约束显示一个新字段“名称”。将名称设置为一些字符串,例如“customMargin”:
在您的代码中,您可以为每个 AdjustableConstraint
设置一个特定名称的常量,如下所示:
AdjustableConstraint.setConstant(ofConstraintsNamed: "customMargin", to: 10)
当从情节提要中加载 AdjustableConstraint
时,如果您之前为其名称设置了常量,它将应用该常量。所以这也适用于新加载的约束。您可能希望在加载任何约束之前初始化常量,方法是在启动时在您的应用程序委托中设置它:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
AdjustableConstraint.setConstant(ofConstraintsNamed: "customMargin", to: 30)
return true
}