一句话笔记(16)(NavigationBarHidden)

一句话笔记,某段时间内遇到或看到的某个可记录的点。 2016-12-27

  • NavigationBar 隐藏的两个小细节
  • 超出父视图的子视图响应事件
  • objc-class-ref in 的BUG

一、 NavigationBar 隐藏的两个小细节

  • self.navigationController.navigationBar.hidden &self.navigationController.navigationBarHidden 区别
    // 对一个属性隐藏
    self.navigationController.navigationBarHidden = YES;
    // 对一个对象隐藏 (下一层次的页面 NavigationBar 直接不显示)
    self.navigationController.navigationBar.hidden = YES;

一般建议还是用 .navigationBarHidden, 因为用 .navigationBar.hidden 会导致下一层次的NavigaitionBar 直接隐藏了,需要再重新设置,没必要。

  • ** self.navigationController setNavigationBarHidden: & self.navigationController setNavigationBarHidden: animated: 的不同点**
    //  Set 方法
    [self.navigationController setNavigationBarHidden:YES];
    // 可以解决隐藏后,下一阶滑动返回头部消失的丑陋情况
    [self.navigationController setNavigationBarHidden:YES animated:YES];

有时我们在隐藏某个一个界面的导航栏,子界面 向右滑动 pop 回来时,会呈现上面缺失的丑的情况,用self.navigationController setNavigationBarHidden: animated:则直接解决了这个问题。

二、超出父视图的子视图响应事件

有时我们设置视图时,会将其子视图移到在父视图外面,但这样外部的视图就不能响应点击事件,为此需要处理一下。其思路是遍历父视图的所有子视图,并判断触发事件的点是否在子视图的bounds内如果在就返回这个子视图

// 此处的目的是让超出父视图的点击同样可以被响应到
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *view = [super hitTest:point withEvent:event];
    if (!view) {
        for (UIView *subView in self.subviews) {
            CGPoint subPoint = [subView convertPoint:point fromView:self];
            if (CGRectContainsPoint(subView.bounds, subPoint)) {
                view = subView;
            }
        }
    }
    return view;
}

三、objc-class-ref in 的BUG

错误显示

这个错误是我在切换模拟器时遇到的,平常第一反应以为是:

  • 缺失了什么文件导致的
  • 或者什么文件重叠了导致的。

具体症状:在 6,6P, 7,7P 上是好好的,跑到4s,5 上的模拟器就直接出现了这种情况,甚至 5s 都是好的。

同时问了一下其他小伙伴,发现他们是正常的,其中一个小伙伴用了 Command+Shift +K 之后也是可以正常编译的,我之前是用了很多遍的 Clear, 之后也试了很多遍Clear 还是没用的...

然后换了一种清理方式,直接去清理掉 DerivedData ,然后就好啦...

所以出现 objc-class-ref 的原因多了一个:缓存的影响,不单单是用 Command+Shift +K 而且要清理掉 DerivedData。

你可能感兴趣的:(一句话笔记(16)(NavigationBarHidden))