Размещение и перемещение просмотров по вращению (UIView)
Что означает "правильный" способ размещения и перемещения просмотров при повороте приложения? То есть, как я могу иметь мелкозернистый контроль над положением, размером и отражением моих представлений, когда пользовательский интерфейс поворачивается от портретной ориентации к пейзажной ориентации (или наоборот)? Я думаю, что мои два варианта:
- Используйте два супервизора (портретный и альбомный). При вращении: переключение между ними.
- Используйте один просмотр. При вращении: измените каждый кадр, границы и свойства центра подкадров.
Если у вас есть два вида с достаточно четкими макетами и элементами, то первый способ может быть достаточно хорошим. Если ваши две точки зрения по существу одинаковы для разных ориентаций, второй способ, вероятно, лучший способ сделать это, используя только один вид.
Я подозреваю, что первое может быть сделано с IB, а последнее должно быть сделано программно.
![portrait to landscape]()
Ответы
Ответ 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. Читайте об этом. Это работает очень хорошо.