2

我有一个应用程序必须同时在纵向和横向上工作,并且 UITabBar 应该调整到当前方向(它具有自定义背景和选定项目)。所以,对于其余的视图,我只是重写了该- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation方法,它可以完美地工作。

我该怎么.moreNavigationControllerUITabBarController?我尝试添加一个观察者(选择器是 UITabBarController 的扩展):

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didRotate:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:self.moreNavigationController];

但它永远不会被调用。我是否遗漏了什么或者处理这种情况的最佳方法是什么?

解决方案:为什么UIDeviceOrientation没有正确发射,所以更好用statusBarOrientation,作为一种魅力。

工作的最终代码是这样的:在 mainUITabBarControllerviewDidLoad

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                             name:UIApplicationDidChangeStatusBarOrientationNotification
                                           object:nil];

选择didRotate器方法:

- (void) didRotate:(NSNotification *)notification{
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if(UIInterfaceOrientationIsPortrait(orientation)) {
        // Portrait
    } else {
        // Landscape
    }
}

感谢帮助。

4

3 回答 3

2

您正在注册UITabBarController一个永远不会发布的通知。查看该方法的文档NSNotificationCenter ReferenceaddObserver:selector:name:object

- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender

notificationSender 观察者想要接收其通知的对象;也就是说,只有这个发送者发送的通知才会传递给观察者。如果你传递 nil,通知中心不会使用通知的发送者来决定是否将它传递给观察者。

因此,如果您将 指定. moreNavigationController为发件人,您将不会收到这些通知,因为它从不发布此类通知。而是通过nil忽略发件人并收听状态栏的更改,而不管是谁发送的。

顺便说一句,在这个SO Answer中总结了如何应对方向变化。

最后。如果还是不行,可以试试这个:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil]; 
于 2012-11-06T17:54:07.253 回答
1

是的,您忘记发布通知,这将调用您自己的通知:

[[NSNotificationCenter defaultCenter] postNotificationName: UIApplicationDidChangeStatusBarOrientationNotification object:self];

或者如果你不想发送任何东西,只需将对象设置为 nil:

[[NSNotificationCenter defaultCenter] postNotificationName: UIApplicationDidChangeStatusBarOrientationNotification object:nil];
于 2012-11-04T18:52:54.613 回答
0

实现相同的最佳方法是首先 addObserver 然后删除观察者以避免崩溃:-

-(void)viewDidLoad{
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(didRotate:)
                                                 name:@"UIDeviceOrientationDidChangeNotification" object:nil];
}

//Now Remove Observer
-(void)viewDidDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self @"UIDeviceOrientationDidChangeNotification" object:nil];
}
于 2015-09-19T04:23:55.407 回答