Я понимаю ваш вопрос как то, что вы пытаетесь не поворачивать интерфейс целиком, а поворачивать пурпурный и красный квадраты по отдельности.
Я создал 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, которое я создал, чтобы проиллюстрировать это.