2013-04-26 4 views
1

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

Обратите внимание на последней строке?

Here's a screen shot

Как вы можете видеть уведомление вращения действительно посланный ... но не имеет никакого эффекта? Что дает?

озадачен!

ответ

1

Попробуйте реальное устройство вместо симулятора.

+0

Он работает на устройстве! Я знал о некоторых ограничениях для Симулятора ... Я думаю, вы только что узнали новый. Благодаря! – verec