iOS 自定义视图 - 使用 CGRect.zero 初始化 - 约束警告
iOS Custom View - init with CGRect.zero - Constraint warning
我有一个自定义视图,两个标签位于彼此下方。视图初始化方法如下所示
self.locationView = LocationView(frame: CGRect.zero)
为了在主视图中定位子视图,我使用了以下约束:
self.gMapsView.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|-[locationView]-|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: nil,
views: views
)
)
self.gMapsView.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "V:[locationView]-(paddingBottom)-|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: [
"paddingBottom": LOCATION_VIEW_CONFIG.paddingBottom
],
views: views
)
)
为了在位置视图中定位标签,我使用以下约束:
self.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|[streetLabel]|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: nil,
views: views
)
)
self.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|[cityLabel]|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: nil,
views: views
)
)
self.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "V:|-[streetLabel]-[cityLabel]-|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: nil,
views: views
)
)
不幸的是,我收到了约束警告:
(
"<NSAutoresizingMaskLayoutConstraint:0x608000280820 h=--& v=--& Test.LocationView:0x7fdc40f0c780.height == 0 (active)>",
"<NSLayoutConstraint:0x608000280190 UILabel:0x7fdc40f0cb40.top == Test.LocationView:0x7fdc40f0c780.topMargin (active)>",
"<NSLayoutConstraint:0x608000280320 V:[UILabel:0x7fdc40f0cb40]-(NSSpace(8))-[UILabel:0x7fdc40d155e0] (active)>",
"<NSLayoutConstraint:0x6080002802d0 Test.LocationView:0x7fdc40f0c780.bottomMargin == UILabel:0x7fdc40d155e0.bottom (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x608000280320 V:[UILabel:0x7fdc40f0cb40]-(NSSpace(8))-[UILabel:0x7fdc40d155e0] (active)>
我该如何修复它们?非常感谢:)
您需要关闭 Autoresizing Mask,这是此处列出的第一个约束 (NSAutoresizingMaskLayoutConstraint),它与您稍后创建的约束冲突。您可以看到它正在将高度设置为 0。添加:
self.locationView.translatesAutoresizingMaskIntoConstraints = 否;
您的布局可能还有其他问题,但这应该可以解决冲突。
我有一个自定义视图,两个标签位于彼此下方。视图初始化方法如下所示
self.locationView = LocationView(frame: CGRect.zero)
为了在主视图中定位子视图,我使用了以下约束:
self.gMapsView.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|-[locationView]-|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: nil,
views: views
)
)
self.gMapsView.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "V:[locationView]-(paddingBottom)-|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: [
"paddingBottom": LOCATION_VIEW_CONFIG.paddingBottom
],
views: views
)
)
为了在位置视图中定位标签,我使用以下约束:
self.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|[streetLabel]|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: nil,
views: views
)
)
self.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|[cityLabel]|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: nil,
views: views
)
)
self.addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "V:|-[streetLabel]-[cityLabel]-|",
options: NSLayoutFormatOptions(rawValue: UInt(0)),
metrics: nil,
views: views
)
)
不幸的是,我收到了约束警告:
(
"<NSAutoresizingMaskLayoutConstraint:0x608000280820 h=--& v=--& Test.LocationView:0x7fdc40f0c780.height == 0 (active)>",
"<NSLayoutConstraint:0x608000280190 UILabel:0x7fdc40f0cb40.top == Test.LocationView:0x7fdc40f0c780.topMargin (active)>",
"<NSLayoutConstraint:0x608000280320 V:[UILabel:0x7fdc40f0cb40]-(NSSpace(8))-[UILabel:0x7fdc40d155e0] (active)>",
"<NSLayoutConstraint:0x6080002802d0 Test.LocationView:0x7fdc40f0c780.bottomMargin == UILabel:0x7fdc40d155e0.bottom (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x608000280320 V:[UILabel:0x7fdc40f0cb40]-(NSSpace(8))-[UILabel:0x7fdc40d155e0] (active)>
我该如何修复它们?非常感谢:)
您需要关闭 Autoresizing Mask,这是此处列出的第一个约束 (NSAutoresizingMaskLayoutConstraint),它与您稍后创建的约束冲突。您可以看到它正在将高度设置为 0。添加:
self.locationView.translatesAutoresizingMaskIntoConstraints = 否;
您的布局可能还有其他问题,但这应该可以解决冲突。