Наложение выбора даты не корректируется при повороте экрана - PullRequest
0 голосов
/ 13 января 2020

У меня есть вид с двумя инструментами выбора даты, которые покрывают всю высоту вида и половину ширины каждый, так что они заполняют весь вид.

Затем я добавил наложение для каждого средство выбора, чтобы сделать выделение более видимым, например:

-(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, и наоборот.

Что не так с моим кодом?

1 Ответ

1 голос
/ 13 января 2020

Вам будет гораздо лучше использовать ограничения и позволить авторазметке обрабатывать изменение размера:

-(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 (или там, где вы можете найти это уместным). ). Нет необходимости, чтобы он был - и на самом деле он должен , а не - вызываться из viewDidLayoutSubviews или viewWillTransitionToSize.

В качестве примечания - если вы Если вы используете удаление и повторное добавление, чтобы показать и скрыть их, вы также получите немного лучшую оптимизацию, если добавите их один раз, а затем установите для свойства .hidden значение YES или NO.

...