zoukankan      html  css  js  c++  java
  • 隐藏导航栏,偏移20PX

    1:让ViewController在NavigationBar下面开始布局。

    automaticallyAdjustsScrollViewInsets作用

    当Controller上存在唯一一个UIScrollview及其子类时,会自动设置内边距,让scrollview占据整个视图,又不会让导航栏覆盖。当Controller上的第一个子视图不是UIScrollview及其子类时,不会自动设置内边距,原点会从状态栏开始,而不是导航栏下面,造成64px的偏移。解决方案有两种

        /// 取消系统自动布局内边距
        if ([nav respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
            nav.automaticallyAdjustsScrollViewInsets = NO;
        }
    
        /// 取消扩展的边距
        if ([nav respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
            nav.edgesForExtendedLayout = UIRectEdgeNone;
        }
        /// 在iOS11取消内边距要使用新方法
        UIScrollView *sv = nil;
        sv.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

    也许你已经发现了,当你隐藏了页面中的导航栏,并且在self.view上添加了一个tableview/scrollView时,你的tableview的位置会向下偏20个单位,并且你怎么找都找不到问题所在。。。因为这就不是你的问题。

    你会发现在ios7.1及以上的系统下都会存在这个bug(7.1版本以下我没有试过,可以自己试试),解决办法就是不要直接把你的tableview加在self.view上,而是先要在self.view上放上一个任意的子视图,再将tableview添加在self.view上,这样tableview就不是self.view的第一子视图了。归结为一句话就是滚动视图不能作为父视图的第一子视图。

    问题代码

    self.navigationController.navigationBar.hidden = YES;

    解决方法,就是不让滚动视图作为父视图的第一子视图。

    // 添加占位视图
    [self.view addSubview:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]];

    解决键盘遮挡问题。一个思路就是:

    在BaseViewController页面添加ScrollView。通过监听键盘事件来处理偏移。

    UIScrollView 三个属性解析

    一: scrollToTop

      是否允许点击状态栏滚动到顶部。默认允许。

    二:trancking(readOnly)

         用于表示用户是否已经解除scrollView但可能还没有开始滚动。

         在手指接触到scrollView的一瞬间发生三件事:

       1 tracking属性变为yes。 

         2 触发拦截事件。

         3 一个内置的计时器开始生效,用来检测在极短的时间内手指是否发生了移动

         如果在时间间隔内没有发生明显的滚动。会将事件传递给subView。沿着正常的响应链传递。如果发生了比较大的移动,scrollView会处理这次的触摸事件。

    三:delaysContentTouches:

         默认的延迟处理手势是打开的。如果在极短的时间里能确定移动就自己处理。否则就传递给子视图进行处理。如果设置为"NO", scrollView立马触发- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view方法 ,交给用户自己判断

    四:canCancelContentTouches:

       默认值为YES,如果为YES,当用户触摸手势已经被确定交给subview响应的时候 ,会立即调用- (BOOL)touchesShouldCancelInContentView:(UIView *)view ,交给此方法处理接下来的动作,如果此方法返回NO,则继续传递给subview,scrollView不会滚动,返回YES,则scrollView会滚动 ,subview 会取消处理这个事件 如果返回NO ,则scrollView不会滚动, subview响应这个触摸事件

    参考链接: http://www.jianshu.com/p/9436c9a2cd1e

  • 相关阅读:
    wait/sleep/yield的区别
    54点提高PHP编程效率(转)
    ftp 使用
    转义 html 里特殊含义字符
    查看端口是否被占用
    webservice 获取调用者IP
    字符编码
    你有读过软件的协议或是网站的服务条款吗?
    使用TSQL的Rand函数生成随机数的艰苦历程
    几个.NET方面的问题——参考答案
  • 原文地址:https://www.cnblogs.com/jisa/p/6972128.html
Copyright © 2011-2022 走看看