iOS应用程序从非活动状态调用时调用的方法

时间:2014-08-19 07:30:58

标签: ios objective-c uiviewcontroller uinavigationbar lifecycle

我通过此方法将导航栏移动到另一个位置:

- (void)shiftNavigationBar
{
    self.navigationController.navigationBar.layer.zPosition = 0;
    float currentVersion = 7.0;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
        UINavigationBar *navBar = self.navigationController.navigationBar;
        [self.navigationController.navigationBar
         setFrame:CGRectMake(navBar.frame.origin.x, 92, navBar.frame.size.width, navBar.frame.size.height)];
    }
}

我在viewDidAppear执行此操作,当第一次加载控制器时,它没问题。但是,当我点击主页按钮并返回应用程序导航栏消失(好吧,它没有消失,我有另一个通常位于导航栏的栏,所以它"隐藏"在这个栏上方)和我需要再次移动导航栏,但我尝试了不同的方法(Will / DidAppear等),但是看起来从非活动状态返回时没有人执行。我知道在AppDelegate中有这方法,但我可以在控制器中使用什么方法?

修改 我试过的方法,但它没有奏效:

1-将方法shiftNavigationBar添加到AppDelegate并在applicationDidBecomeActive中调用它

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self shiftNavigationBar];
}

- (void)shiftNavigationBar
{
    ((UINavigationController*)self.window.rootViewController).navigationBar.layer.zPosition = 0;
    float currentVersion = 7.0;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
        UINavigationBar *navBar = ((UINavigationController*)self.window.rootViewController).navigationBar;
        [((UINavigationController*)self.window.rootViewController).navigationBar
         setFrame:CGRectMake(navBar.frame.origin.x, 92, navBar.frame.size.width, navBar.frame.size.height)];
    }
}

2-从AppDelegate调用控制器方法

- (void)applicationDidBecomeActive:(UIApplication *)application
{

    UINavigationController *navController = (UINavigationController*)self.window.rootViewController;
    [(MAListRepositoriesVC*)navController.topViewController doMyLayoutStuff:self];
}
// I added shiftNavigationBar to method doMyLayoutStuff

3-控制器中的观察者

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doMyLayoutStuff:) name:UIApplicationDidBecomeActiveNotification object:nil];

每次都调用方法,但每次导航栏都返回顶部。看起来方法过早被调用,然后有下一个更改并返回导航栏返回顶部。

EDIT2: 作为正确答案,我选择使用自定义视图替换导航栏进行回答,因为这是我必须做的。我尝试了很多我能找到的解决方案,但没有任何帮助。所以我创建了一个看起来像我需要的自定义视图,主要是我把它放在哪里。

3 个答案:

答案 0 :(得分:1)

您可以发布UI的屏幕截图或模拟吗?

可能你应该寻找一个自定义视图并完全替换导航栏,因为修改它是笨拙的,并且肯定会在未来的更新中中断。此外,您的应用可能会被拒绝。

答案 1 :(得分:0)

尝试这个...这只是一个临时修复你说的似乎你的方法被提前调用,然后只是使用该方法稍微延迟它们:

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

只需添加probs 0.5-1.0秒,目标显然是self,选择器将是@selector(shiftNavigationBar),userInfo nil,并重复NO。

我不确定你提到的酒吧出现在你想要的酒吧上方。你用方法叫那个酒吧吗?从nib文件加载吗?如果你能澄清一点,我可以帮助你解决这个问题。我有一个使用自定义导航栏的应用程序,它工作正常,但我需要更多的细节来帮助你。

希望此建议可以帮助您解决问题。

答案 2 :(得分:0)

一种可能性是将navBar放入不同的超视图中,然后调整新超视图的帧。例如,在导航控制器viewDidLoad(或awakeFromNib中,如果它是从Storyboard / XIB加载的话):

// Move the current self.view to contentView, create a new self.view,
// and add the contentView to this new view.
self.contentView = self.view; // navBar is a subview of self.view
self.view = [[UIView alloc] initWithFrame:self.contentView.frame];
CGRect contentFrame = CGRectMake(0,92,self.view.frame.size.width, self.view.frame.size.height-92);
self.contentView.frame = contentFrame;
[self.view addSubview:self.contentView];

(您需要向界面添加新属性:@property (strong, nonatomic) UIView *contentView;)。我留给你添加不同设备版本的代码。

这似乎在后台处理/变为活动状态后仍然存在,因此您不需要AppDelegate中的代码。