Размещение и перемещение видов на поворот (UIView) - PullRequest
16 голосов
/ 24 мая 2011

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

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

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

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

portrait to landscape

Ответы [ 4 ]

9 голосов
/ 24 мая 2011

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

- (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);
    }
}
0 голосов
/ 26 мая 2011

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

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

0 голосов
/ 25 мая 2011

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

#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]; }

Здесь вместо поворота вы можете использовать перевод или масштаб

0 голосов
/ 24 мая 2011

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

- (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];    
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...