日期选择器选择的覆盖在屏幕旋转时不调整

Date pickers selection's overlay not adjusting when screen rotates

我有一个视图,其中两个日期选择器设置为覆盖整个视图的高度和宽度的一半,因此它们会填满整个视图。

然后我为每个选择器添加了一个叠加层以使选择更加可见,如下所示:

-(void)drawOverlays {
    if (_overlay1 != nil) {
        [_overlay1 removeFromSuperview];
    }
    if (_overlay2 != nil) {
        [_overlay2 removeFromSuperview];
    }
    _overlay1 = [[UIView alloc] initWithFrame:CGRectMake(_startPicker.bounds.origin.x, (_startPicker.frame.size.height/2)-19, _startPicker.bounds.size.width, 38)];
    _overlay1.backgroundColor = [UIColor redColor];
    _overlay1.alpha = 0.5f;
    [_startPicker addSubview:_overlay1];
    _overlay2 = [[UIView alloc] initWithFrame:CGRectMake(_endPicker.bounds.origin.x, (_endPicker.frame.size.height/2)-19, _endPicker.bounds.size.width, 38)];
    _overlay2.backgroundColor = [UIColor redColor];
    _overlay2.alpha = 0.5f;
    [_endPicker addSubview:_overlay2];
}

我从 -viewDidLayoutSubviews 方法和 -viewWillTransitionToSize:withTransitionCoordinator 方法调用这个方法,第一次出现视图时一切正常。

然后我旋转我的 iPad 并且重叠显示倒置,这意味着当在 landscape 中时,重叠是我想要的 portrait 的大小,反之亦然。

我的代码有什么问题?

使用约束并让自动布局处理调整大小会更好:

-(void)drawOverlays {

    if (_overlay1 != nil) {
        [_overlay1 removeFromSuperview];
    }
    if (_overlay2 != nil) {
        [_overlay2 removeFromSuperview];
    }

    //_overlay1 = [[UIView alloc] initWithFrame:CGRectMake(_startPicker.bounds.origin.x, (_startPicker.frame.size.height/2)-19, _startPicker.bounds.size.width, 38)];

    // instantiate overlay1
    _overlay1 = [UIView new];
    _overlay1.backgroundColor = [UIColor redColor];
    _overlay1.alpha = 0.5f;

    // add as subview of startPicker
    [_startPicker addSubview:_overlay1];

    //_overlay2 = [[UIView alloc] initWithFrame:CGRectMake(_endPicker.bounds.origin.x, (_endPicker.frame.size.height/2)-19, _endPicker.bounds.size.width, 38)];

    // instantiate overlay2
    _overlay2 = [UIView new];
    _overlay2.backgroundColor = [UIColor redColor];
    _overlay2.alpha = 0.5f;

    // add as subview of endPicker
    [_endPicker addSubview:_overlay2];

    // we want to use auto-layout / constraints
    _overlay1.translatesAutoresizingMaskIntoConstraints = NO;
    _overlay2.translatesAutoresizingMaskIntoConstraints = NO;

    [NSLayoutConstraint activateConstraints:@[

        // constrain overlay1 to startPicker
        //  centerY
        //  leading / trailing = 0
        //  height = 38
        [_overlay1.centerYAnchor constraintEqualToAnchor:_startPicker.centerYAnchor],
        [_overlay1.leadingAnchor constraintEqualToAnchor:_startPicker.leadingAnchor constant:0.0],
        [_overlay1.trailingAnchor constraintEqualToAnchor:_startPicker.trailingAnchor constant:0.0],
        [_overlay1.heightAnchor constraintEqualToConstant:38.0],

        // constrain overlay2 to startPicker
        //  centerY
        //  leading / trailing = 0
        //  height = 38
        [_overlay2.centerYAnchor constraintEqualToAnchor:_endPicker.centerYAnchor],
        [_overlay2.leadingAnchor constraintEqualToAnchor:_endPicker.leadingAnchor constant:0.0],
        [_overlay2.trailingAnchor constraintEqualToAnchor:_endPicker.trailingAnchor constant:0.0],
        [_overlay2.heightAnchor constraintEqualToConstant:38.0],

        ]

     ];

}

而且,这只需要从 viewDidLoad(或您认为合适的其他任何地方)调用。没有必要 - 事实上,它应该 而不是 - 从 viewDidLayoutSubviewsviewWillTransitionToSize.

调用

附带说明——如果您使用删除和重新添加来显示和隐藏它们,如果您添加一次它们,然后设置 .hidden,您也会得到更好的优化属性 到 YESNO