我通过此方法将导航栏移动到另一个位置:
- (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: 作为正确答案,我选择使用自定义视图替换导航栏进行回答,因为这是我必须做的。我尝试了很多我能找到的解决方案,但没有任何帮助。所以我创建了一个看起来像我需要的自定义视图,主要是我把它放在哪里。
答案 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中的代码。