EIDT: исправлено. Похоже, это проблема симулятора. Благодаря GabrieliPhone startup orientation (снова!)
Один имитатор я только это:
--- UIDeviceOrientationDidChangeNotification -> [<UIDevice: 0x7577d30>] {
Но на устройстве я получаю целую массу новых уведомлений ...
--- UIDeviceOrientationDidChangeNotification -> [<UIDevice: 0x1dd5a0c0>] {
--- UIApplicationDidEndResumeAnimationNotification -> [<UIApplication: 0x1dd63500>] (null)
--- UIDeviceOrientationDidChangeNotification -> [<UIDevice: 0x1dd5a0c0>] {
--- _UIApplicationDidBeginIgnoringInteractionEventsNotification -> [<UIApplication: 0x1dd63500>] (null)
--- UIWindowWillRotateNotification -> [<UIWindow: 0x1e866b40; frame = (0 0; 320 568); layer = <UIWindowLayer: 0x1e866ad0>>] {
--- UIApplicationWillChangeStatusBarOrientationNotification -> [<UIApplication: 0x1dd63500>] {
--- UIApplicationWillChangeStatusBarFrameNotification -> [<UIApplication: 0x1dd63500>] {
--- UIViewAnimationDidCommitNotification -> [UIViewAnimationState] {
--- UIApplicationDidChangeStatusBarOrientationNotification -> [<UIApplication: 0x1dd63500>] {
--- UIApplicationDidChangeStatusBarFrameNotification -> [<UIApplication: 0x1dd63500>] {
--- UIWindowWillAnimateRotationNotification -> [<UIWindow: 0x1e866b40; frame = (0 0; 320 568); layer = <UIWindowLayer: 0x1e866ad0>>] {
--- UIViewAnimationDidCommitNotification -> [UIViewAnimationState] {
--- UIViewAnimationDidStopNotification -> [<UIViewAnimationState: 0x1e8692f0>] {
--- _UIApplicationDidEndIgnoringInteractionEventsNotification -> [<UIApplication: 0x1dd63500>] (null)
--- UIWindowDidRotateNotification -> [<UIWindow: 0x1e866b40; frame = (0 0; 320 568); layer = <UIWindowLayer: 0x1e866ad0>>] {
--- UIViewAnimationDidStopNotification -> [<UIViewAnimationState: 0x1e867ea0>] {
О хорошо ...
Я действительно потягиваю волосы на этом. Я видел много связанных вопросов здесь на S.O. но не смог найти тот, который работал для меня.
Я использую простейший возможный пример: Xcode 4.6.2, New Project, Empty Application.
В результате, если приложение запущено в режиме «Портрет», оно может поворачиваться на любую из четырех поддерживаемых ориентаций.
Однако, если он запущен в Пейзаж, это не выполнить начальную вращаться, несмотря на то, вращая устройство после запуска делает честь четырех возможных поворотов.
Пожалуйста, обратите внимание, что я реализовал все, что требуется для прошивки 5 и IOS 6, и что приложение работает во всех версиях IOS кроме для начальной ориентации, которая терпит неудачу во всем мире.
Кроме того, обратите внимание, что я только после «простой ванили» ситуации когда устройство поддерживает все ориентации и должен работать «из коробки» (кроме того, что это не так!)
#import "AppDelegate.h"
@interface TestUIVIew: UIView
@end
@implementation TestUIVIew
- (void) drawRect: (CGRect) rect {
CGContextRef context = ::UIGraphicsGetCurrentContext() ;
CGRect bounds = self.bounds ;
CGMutablePathRef p = ::CGPathCreateMutable() ;
CGFloat minx = ::CGRectGetMinX(bounds) ;
CGFloat miny = ::CGRectGetMinY(bounds) ;
CGFloat maxx = ::CGRectGetMaxX(bounds) ;
CGFloat maxy = ::CGRectGetMaxY(bounds) ;
CGPoint TL = (CGPoint) {minx, miny} ;
CGPoint BL = (CGPoint) {minx, maxy} ;
CGPoint TR = (CGPoint) {maxx, miny} ;
CGPoint BR = (CGPoint) {maxx, maxy} ;
::CGPathMoveToPoint (p, 0, TL.x, TL.y) ;
::CGPathAddLineToPoint (p, 0, BR.x, BR.y) ;
::CGPathMoveToPoint (p, 0, TR.x, TR.y) ;
::CGPathAddLineToPoint (p, 0, BL.x, BL.y) ;
::CGContextSetLineWidth(context, 5.0f) ;
::CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor) ;
::CGContextAddPath(context, p) ;
::CGContextStrokePath(context) ;
::CGPathRelease(p) ;
}
@end
@interface SimplestViewController : UIViewController
@end
@implementation SimplestViewController
- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {
return YES ;
}
- (NSUInteger) supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll ;
}
- (BOOL) shouldAutorotate {
return YES ;
}
@end
@implementation AppDelegate
- (BOOL) application: (UIApplication *) application
didFinishLaunchingWithOptions: (NSDictionary *) launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIViewController * vc = [SimplestViewController new] ;
vc.view = [TestUIVIew new] ;
self.window.rootViewController = vc ;
self.window.backgroundColor = [UIColor greenColor];
[self.window makeKeyAndVisible];
return YES;
}
@end
Я пробовал с каждым вариантом симулятора 5.0, 5.1, 6.0 & 6.1 с точно таким же результатом: Кажется, что я просто не получаю никакого сообщения о ротации, или если я это делаю, это не выполняется.
Итак, я добавил это в основной:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#define S(x) #x
#define str(x) case x: return @S(x)
static NSString * devO(UIDeviceOrientation o) {
switch (o) {
str(UIDeviceOrientationUnknown) ;
str(UIDeviceOrientationPortrait) ;
str(UIDeviceOrientationPortraitUpsideDown) ;
str(UIDeviceOrientationLandscapeLeft) ;
str(UIDeviceOrientationLandscapeRight) ;
str(UIDeviceOrientationFaceUp) ;
str(UIDeviceOrientationFaceDown) ;
default:
return [NSString stringWithFormat:@"??? UIDeviceOrientation<%08.8x> ???", o] ;
}
}
static NSString * intfO(UIInterfaceOrientation o) {
switch (o) {
str(UIInterfaceOrientationPortrait) ;
str(UIInterfaceOrientationPortraitUpsideDown) ;
str(UIInterfaceOrientationLandscapeLeft) ;
str(UIInterfaceOrientationLandscapeRight) ;
default:
return [NSString stringWithFormat:@"??? UIInterfaceOrientation<%08.8x> ???", o] ;
}
}
static void (^notifHandler)(NSNotification *) = ^(NSNotification *note) {
UIDeviceOrientation orientO = [UIDevice currentDevice].orientation ;
UIInterfaceOrientation orientI = [[UIApplication sharedApplication] statusBarOrientation];
::NSLog(@"! NOTE ! [device:%@--app:%@]\n--- %@ -> [%@] %@"
, devO(orientO)
, intfO(orientI)
, note.name
, note.object
, note.userInfo) ;
} ;
int main(int argc, char *argv[]) {
@autoreleasepool {
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications] ;
[[NSNotificationCenter defaultCenter] addObserverForName: nil
object: nil
queue: nil
usingBlock: notifHandler] ;
return UIApplicationMain(argc, argv, nil, ::NSStringFromClass([AppDelegate class]));
}
}
А вот журнал:
2013-04-26 17:43:06.429 AutoRotate[82160:1a03] ! NOTE ! [device:UIDeviceOrientationUnknown--app:??? UIInterfaceOrientation<00000000> ???]
--- kBKSDisplayServerDiedNotification -> [(null)] (null)
2013-04-26 17:43:06.489 AutoRotate[82160:2b03] ! NOTE ! [device:UIDeviceOrientationUnknown--app:??? UIInterfaceOrientation<00000000> ???]
--- NSWillBecomeMultiThreadedNotification -> [(null)] (null)
2013-04-26 17:43:06.523 AutoRotate[82160:c07] ! NOTE ! [device:UIDeviceOrientationUnknown--app:??? UIInterfaceOrientation<00000000> ???]
--- _UIWindowDidCreateWindowContextNotification -> [<UIStatusBarWindow: 0x9667540; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x96674a0>>] {
"_UIWindowContextIDKey" = "-1367435195";
}
[...]
2013-04-26 17:43:06.659 AutoRotate[82160:1a03] ! NOTE ! [device:UIDeviceOrientationPortrait--app:UIInterfaceOrientationPortrait]
--- kBKSHIDServerDiedNotification -> [(null)] (null)
2013-04-26 17:43:06.662 AutoRotate[82160:c07] ! NOTE ! [device:UIDeviceOrientationPortrait--app:UIInterfaceOrientationPortrait]
--- UIApplicationDidEndResumeAnimationNotification -> [<UIApplication: 0x7580b80>] (null)
2013-04-26 17:43:06.663 AutoRotate[82160:c07] ! NOTE ! [device:UIDeviceOrientationUnknown--app:UIInterfaceOrientationPortrait]
--- UIDeviceOrientationDidChangeNotification -> [<UIDevice: 0x7577d30>] {
UIDeviceOrientationRotateAnimatedUserInfoKey = 1;
}
Обратите внимание на последней строке?
Как вы можете видеть уведомление вращения действительно посланный ... но не имеет никакого эффекта? Что дает?
озадачен!
Он работает на устройстве! Я знал о некоторых ограничениях для Симулятора ... Я думаю, вы только что узнали новый. Благодаря! – verec