我对hidesBarOnSwipe
的{{1}}属性有疑问。
概述:
我有一个名为FirstViewController的控制器,它是UINavigationController
的根视图。
一切都在UINavigationController
。
FirstViewController包含Main.storyboard
操作。在该操作中,我实例化一个SecondViewController并将其推送到导航堆栈。
UIButton
在SecondViewController内部- (IBAction)button:(id)sender {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
[self.navigationController pushViewController:vc animated:YES];
}
上只有hidesBarsOnSwipe
属性设置为YES
:
viewDidLoad
和dealloc获取NSLogged:
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.hidesBarsOnSwipe = YES;
}
问题:
当我们向上滑动以隐藏navigationBar时,dealloc永远不会被调用。 Instruments在这里显示了SecondViewController内存泄漏。
当我们在SecondViewController上时,我们只需按下后退按钮 - 一切都很好。 Dealloc被召唤。
肯定有某种保留周期,但我不知道为什么以及如何避免这种情况。
答案 0 :(得分:2)
一些更新和临时解决方案:
还有另一种执行navigationBar隐藏的方法。 对我有用的是:
[self.navigationController setNavigationBarHidden:hidden animated:YES];
要获得良好的效果,请在班级中添加一个属性以跟踪navigationBar动画的状态:
@property (assign, nonatomic) BOOL statusBarAnimationInProgress;
像这样实施UIScrollViewDelegate
:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat yVelocity = [scrollView.panGestureRecognizer velocityInView:scrollView].y;
if (yVelocity > 0 && !self.statusBarAnimationInProgress) {
[self setNavigationBarHidden:NO];
} else if (yVelocity < 0 && !self.statusBarAnimationInProgress) {
[self setNavigationBarHidden:YES];
}
}
隐藏设置导航栏应如下所示:
- (void)setNavigationBarHidden:(BOOL)hidden {
[CATransaction begin];
self.statusBarAnimationInProgress = YES;
[CATransaction setCompletionBlock:^{
self.statusBarAnimationInProgress = NO;
}];
[self.navigationController setNavigationBarHidden:hidden animated:YES];
[CATransaction commit];
}
我使用CATransaction来检查导航栏的动画是否完成。任何有效的方式。解决方案不是那么容易,但至少没有泄漏:)