Позиционируйте вид относительно нижней части безопасной зоны программно - PullRequest
0 голосов
/ 01 октября 2018

У меня есть представление, которое выскакивает из нижней части экрана и загружается в мой делегат приложения.Проблема, с которой я столкнулся, заключается в том, что я не могу установить координату y вида, поэтому он будет отображаться в одинаковом положении на всех размерах экрана.В моем случае я пытаюсь, чтобы это всплывающее окно отображалось прямо над панелью вкладок в нижней части экрана.

Это мой код, в который я помещаю представление относительно [[UIScreen mainScreen]границы], но это не является одинаковым для всех размеров экрана.Как я могу получить нужную мне координату, чтобы я мог расположить этот вид в одном и том же месте вертикально на всех экранах?

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    float y = [UIScreen mainScreen].bounds.size.height;

    UIInterfaceOrientation deviceOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIInterfaceOrientationIsLandscape(deviceOrientation))
    {
        [UIView animateWithDuration:0.5
                              delay:.25
                            options: UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             self->popcontroller.frame = CGRectMake(0,y -90, screenWidth, 40);
                         }
                         completion:^(BOOL finished){
                         }];
    }
    else{
        [UIView animateWithDuration:0.5
                              delay:.25
                            options: UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             self->popcontroller.frame = CGRectMake(0,y -120, screenWidth, 40);
                         }
                         completion:^(BOOL finished){
                         }];
    }

    brsAppDelegate *appDelegate = (brsAppDelegate *)[[UIApplication sharedApplication] delegate];
    if (![[appDelegate window].subviews containsObject:popcontroller])
    {  [[appDelegate window] addSubview:popcontroller];

    [popcontroller setNeedsDisplay];
    }
});

}

1 Ответ

0 голосов
/ 01 октября 2018

Таким образом, чтобы определить дополнительный интервал для краевых вставок, на всех видах есть свойство, называемое safeAreaInsets.Это можно использовать для определения необходимости добавления дополнительных значений к параметрам макета (сверху / снизу или слева / справа).

Таким образом, чтобы получить «дополнительные поля», вы можете проверить верхнюю /нижнее значение этой вставки, если приложение находится в портретной ориентации, или значение «влево / вправо» для вставок, если приложение находится в альбомной ориентации.

С одной вещью, с которой следует быть осторожным, эта safeAreaInset устанавливаетсяпо умолчанию в корневом представлении контроллера, поэтому если в качестве подпредставления добавлено настраиваемое представление, то в этом настраиваемом представлении, скорее всего, не будет правильно установлено это свойство.

И, если быть более точным, в вашем случае«рамочный» код будет выглядеть примерно так:

if deviceIsInPortrait {
   let frame = CGRect(x:thisX,
                      y: -90 - self.view.safeAreaInsets.top // this will be 0 for non "notch" phones
                      width: myWidth
                      height: myHeight
}
else {
  let frame = CGRect(x:thisX,
                      y: -90 - self.view.safeAreaInsets.left // this will be 0 for non "notch" phones
                      width: myWidth
                      height: myHeight
}

Также еще один совет: используйте авторазметку как можно чаще.

...