Ответ 1
Я понимаю ваш вопрос как то, что вы пытаетесь не вращать интерфейс целиком, а поочередно поворачивать фиолетовый и красный квадраты.
Я создал UIViewController
, который похож на ваш макет.
Черный квадрат - UIView, и белый квадрат есть только для того, чтобы я мог сказать, когда черный вид вращается. Это представление подключено к свойству view1
на контроллере.
Есть 4 кнопки, которые подключены к btnx
(x работает от 1 до 4).
Поскольку я больше не хочу автоматически поворачивать интерфейс, я поддерживаю только портретную ориентацию.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
Чтобы сделать поворот вручную, я добавил метод ViewController. Он определяет угол, необходимый для поворота компонентов от портретной до текущей ориентации, создает преобразование вращения и применяет его ко всем выходам.
- (void)deviceDidRotate:(NSNotification *)notification
{
UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation];
double rotation = 0;
UIInterfaceOrientation statusBarOrientation;
switch (currentOrientation) {
case UIDeviceOrientationFaceDown:
case UIDeviceOrientationFaceUp:
case UIDeviceOrientationUnknown:
return;
case UIDeviceOrientationPortrait:
rotation = 0;
statusBarOrientation = UIInterfaceOrientationPortrait;
break;
case UIDeviceOrientationPortraitUpsideDown:
rotation = -M_PI;
statusBarOrientation = UIInterfaceOrientationPortraitUpsideDown;
break;
case UIDeviceOrientationLandscapeLeft:
rotation = M_PI_2;
statusBarOrientation = UIInterfaceOrientationLandscapeRight;
break;
case UIDeviceOrientationLandscapeRight:
rotation = -M_PI_2;
statusBarOrientation = UIInterfaceOrientationLandscapeLeft;
break;
}
CGAffineTransform transform = CGAffineTransformMakeRotation(rotation);
[UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
[self.btn1 setTransform:transform];
[self.btn2 setTransform:transform];
[self.btn3 setTransform:transform];
[self.btn4 setTransform:transform];
[self.view1 setTransform:transform];
[[UIApplication sharedApplication] setStatusBarOrientation:statusBarOrientation];
} completion:nil];
}
Последнее, что нужно сделать, - заставить ОС вызывать мой метод. Для этого я добавил следующий код в application:didFinishLaunchingWithOptions:
в AppDelegate.
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self.viewController selector:@selector(deviceDidRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];
Я не уверен, что это именно то, что вы хотели, но я считаю, что это по крайней мере похоже, чтобы вы могли получить от него какие-то идеи, как решить вашу проблему. Я могу предоставить исходный код для рабочего приложения iPad, которое я создал, чтобы проиллюстрировать это.