Позиция UIview при изменении ориентации - PullRequest
3 голосов
/ 08 июля 2011

У меня есть пользовательский UIView videoView в UIViewController в InterfaceBuilder.

Когда я загружаю его, он выглядит хорошо, но когда я поворачиваю его, чтобы сказать «пейзаж из портрета», он не идет туда, где говорят координаты.А потом, когда я возвращаюсь назад, это снова неправильно.

У меня есть следующий код:

-(void)viewWillAppear:(BOOL)animated
{
    [self processRotation:self.interfaceOrientation];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}    
-(void)processRotation:(UIInterfaceOrientation)_interfaceOrientation
{
    if (_interfaceOrientation == UIInterfaceOrientationLandscapeLeft || _interfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        videoView.frame = CGRectMake(20.0f, 77.0f, 984.0f, 595.0f);
    }   

else if (_interfaceOrientation == UIInterfaceOrientationPortrait || _interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        videoView.frame = CGRectMake(20.0f, 297.0f, 728.0f, 453.0f);
    }
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [self processRotation:toInterfaceOrientation];
}

Ответы [ 2 ]

5 голосов
/ 08 июля 2011

Когда вид вращается, убедитесь, что вы переходите от портрета к ландшафту:

if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation) && UIInterfaceOrientationIsLandscape(interfaceOrientation)

Поскольку ориентация еще не изменилась, вместо

videoView.frame = CGRectMake(20.0f, 77.0f, 984.0f, 595.0f);

запись:

videoView.frame = CGRectMake(77.0f, 22.0f, 595.0f, 984.0f);

Кроме того, вы можете зайти в Интерфейсный Разработчик и изменить там маски авторазмера и ничего не делать в коде. Чтобы изменить маски авторазмера, перейдите в инспектор размера на правой панели (значок линейки). Вы увидите квадрат с вертикальной и горизонтальной стрелками внутри, и буква в форме линии, выходящая с каждой стороны. Стрелки внутри, когда они красные (включены, нажмите, чтобы включить), заставят объект автоматически растягиваться в этом направлении при изменении размера представления. Включение линии в форме буквы I, по существу, закрепляет вид на эту сторону, а это означает, что расстояние между стороной вида и этой стороной всегда будет одинаковым. например Если у вас вверху панель инструментов, которая становится тоньше в альбомной ориентации, , а не , выберите верхнюю линию, или ваш вид в конечном итоге окажется за много миль от верхней панели инструментов.

Или вы можете вернуть no для авторотации и реализовать его самостоятельно, позвонив по номеру

self.interfaceOrientation = toInterfaceOrientation;

, а затем вручную измените координаты, как в исходном коде.

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

0 голосов
/ 08 июля 2011

Вы используете willRotateToInterfaceOrientation:, который вызывается до того, как произойдет вращение. Если у videoView установлена ​​маска autoresizingMask, то авторазмер будет активирован позже и изменит позицию вашего просмотра.

Обычно вы должны делать это в - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration и убедиться, что маска autoresizingMask вашего videoView установлена ​​на UIViewAutoresizingNone

...