使用IB,我在Container View的相关UIViewController中设置了一个UIVPicker。 Container的高度由两个自动布局约束控制,一个将高度设置为零,一个将其设置为与其超视图的高度相同。我将其中一个约束的优先级更改为切换活动/非活动。在IB中,优先级设置为选择器的初始高度为零(全高约束优先级750;零高度约束优先级751)。
当我使全高度约束激活时,我可以看到它生效:UIPickerView有彩色背景。我可以看到背景扩展到superview的高度。这是奇怪的部分:UIPickerView自己的子视图(选择器标题,选择栏等)没有随着选择器自己的背景一起调整大小。我可以看到它们都聚集在前30个像素左右的拾取器显示屏的顶部。我已经验证了当我使用XCode在调试时显示图层的能力来切换约束时,我看到的是拾取器的背景。
如果我在IB中将零高度约束优先级设置为749以允许全高度约束处于活动状态,然后通过将以下内容放入viewDidAppear中来“隐藏”pickerView ...
self.pickerContainerViewHeightConstraintZeroHeight.priority = 751;
[self.pickerContainerView layoutIfNeeded];
...然后选择器内容正确显示。 (这是一个仅限诊断的解决方案,因为用户看到选择器闪烁然后消失。)然后我可以随意隐藏和显示选择器并继续看起来应该如此。如果我在viewDidLayoutSubviews或viewWillAppear中放入相同的代码以尝试将其转换为“真正的”解决方案,那么当我显示它时,拾取器会搞砸。
以下实际上确实有效,但实际上很难看......在IB中将零高度约束优先级设置为749以允许全高度约束处于活动状态然后...
- (void )viewWillAppear:
{
self.pickerContainerView.hidden = YES;
}
- (void )viewDidAppear:
{
self.pickerContainerViewHeightConstraintZeroHeight.priority = 751;
[self.pickerContainerView layoutIfNeeded];
self.pickerView.hidden = NO;
}
...相当于视图在构建时是全高,使用隐藏属性隐藏它,因此用户最初看不到它,将其高度更改为零,“显示”它(用户)将不会看到因为高度现在为零)所以当我接下来将高度更改为全高时,选择器会正确显示。
但必须有更好的方法。如何从拾取器高度= 0开始,并通过更改约束显示它时仍然具有正确的外观?