Подтвердить что ты не робот

Размещение и перемещение просмотров по вращению (UIView)

Что означает "правильный" способ размещения и перемещения просмотров при повороте приложения? То есть, как я могу иметь мелкозернистый контроль над положением, размером и отражением моих представлений, когда пользовательский интерфейс поворачивается от портретной ориентации к пейзажной ориентации (или наоборот)? Я думаю, что мои два варианта:

  • Используйте два супервизора (портретный и альбомный). При вращении: переключение между ними.
  • Используйте один просмотр. При вращении: измените каждый кадр, границы и свойства центра подкадров.

Если у вас есть два вида с достаточно четкими макетами и элементами, то первый способ может быть достаточно хорошим. Если ваши две точки зрения по существу одинаковы для разных ориентаций, второй способ, вероятно, лучший способ сделать это, используя только один вид.

Я подозреваю, что первое может быть сделано с IB, а последнее должно быть сделано программно.

portrait to landscape

4b9b3361

Ответ 1

Чтобы иметь мелкозернистый контроль над положением и размером ваших подзонов при повороте iPhone, измените кадр надзоров в методе UIViewController willAnimateRotationToInterfaceOrientation:duration:. Этот метод вызывается внутри блока анимации, поэтому анимируются все изменения в ваших кадрах subviews, которые вы делаете внутри него.

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
        // Portrait frames
        self.subviewA.frame = CGRectMake(x, y, width, height);
        self.subviewB.frame = CGRectMake(x, y, width, height);
        self.subviewC.frame = CGRectMake(x, y, width, height);
    } else {
        // Landscape frames
        self.subviewA.frame = CGRectMake(x, y, width, height);
        self.subviewB.frame = CGRectMake(x, y, width, height);
        self.subviewC.frame = CGRectMake(x, y, width, height);
    }
}

Ответ 2

Вот одна идея. Я волнуюсь, что анимация будет работать смешно, но попробуйте и посмотрите.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toOrientation 
                                duration:(NSTimeInterval)duration {

    if (toOrientation == UIInterfaceOrientationLandscapeLeft ||
        toOrientation == UIInterfaceOrientationLandscapeRight) {
        [UIView beginAnimations:nil context:NULL]; {
            [UIView setAnimationDuration:1.0];
        }
            [UIView setAnimationDelegate:self];
        [viewA setFrame:CGRectMake(?,?,?,?)];
        [viewB setFrame:CGRectMake(?,?,?,?)];
        [viewC setFrame:CGRectMake(?,?,?,?)];
        } [UIView commitAnimations];    
    } else if  (toOrientation == UIInterfaceOrientationPortrait ||
            toOrientation == UIInterfaceOrientationPortraitUpsideDown) {
        [UIView beginAnimations:nil context:NULL]; {
            [UIView setAnimationDuration:1.0];
        }
        [UIView setAnimationDelegate:self];
        [viewA setFrame:CGRectMake(?,?,?,?)];
        [viewB setFrame:CGRectMake(?,?,?,?)];
        [viewC setFrame:CGRectMake(?,?,?,?)];
        } [UIView commitAnimations];    
    }

Ответ 3

У меня есть идея, которая работает правильно для меня, когда я использую небольшой вид в представлении, где он вращается, когда ориентация устройства изменяется. Используйте один уведомитель, затем в методе измените ориентацию.

#define DegreesToRadians(x) (M_PI * x / 180.0)

.......

[[NSNotificationCenter defaultCenter] addObserver:showIndicator
                                         selector:@selector(setProperOreintation)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

.......

-(void)setProperOrientation {

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];


if (orientation == UIDeviceOrientationPortraitUpsideDown)
    self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, DegreesToRadians(180)); 

else if (orientation == UIDeviceOrientationLandscapeLeft)
    self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, DegreesToRadians(90));  

else if (orientation == UIDeviceOrientationLandscapeRight)
    self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, DegreesToRadians(-90));

    [UIView commitAnimations]; }

Здесь вместо вращения u можно использовать перевод или масштабирование

Ответ 4

Для этого существует множество решений. Одна из них - это анимации для элементов управления, которые вы читали ранее. Другой вариант - подготовить 2 UIView для портретного режима, а другой для ландшафтного режима. И по ориентации переключателя - загрузите нужный UIView. Это то, что я использовал в своих приложениях. Потому что иногда различия между пейзажем и портретом огромны.

В простых случаях достаточно установить правильную autoresizingMask для subviews. Читайте об этом. Это работает очень хорошо.