UIScrollView内容偏移的问题

问题:

今天想作UITextView的自适应高度,写了个小demo,发现内容偏移了内容偏移图示编程

能够看到上方有64的偏移,光标是没法到达的。 
textView的实现代码:spa

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.view.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:self.textView];
    [self makeContraints];
}

- (UITextView *)textView
{
    if (!_textView) {
        _textView = [[UITextView alloc] init];
        _textView.backgroundColor = [UIColor grayColor];
        _textView.scrollEnabled = NO;
        _textView.font = [UIFont systemFontOfSize:20];
    }
    return _textView;
}

- (void)makeContraints
{
    __weak typeof(self) weakSelf = self;
    [self.textView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.equalTo(weakSelf.view);
        make.top.mas_equalTo(100);
        make.height.greaterThanOrEqualTo(@100);
    }];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

缘由:

翻了很久的资料找到了问题。.net

下面说的UIScrollView包含其子类,UITableView,UICollectionView等3d

主要是demo中用的导航是透明的,起始坐标是(0, 0),系统会自动偏移UIScrollView让其初始状态从(0,64)显示,可是又可以滑到导航来显示蒙层效果效果如图代码规范

  • 初始状态由于被偏移了(0,64)因此可以贴导航显示 
    初始状态
  • 导航透明,UIScrollView的起始点在(0,0),因此能够滑动到导航栏显示蒙层效果(应该是iOS7时苹果以为这样好看,因此至今默认效果仍是这样的) 
    蒙层效果

UITextView中的内容就是在一个UIScrollView上,因此系统对最底层对UIScrollView作了偏移。code

为何说是最底层的UIScrollView呢,由于若是在一个UIScrollView中嵌套其余UIScrollView,被嵌套的UIScrollView是再也不偏移的,只会偏移最底层那个UIScrollView。blog

解决方案:

1. 设置ScrollView不自动偏移

[self setAutomaticallyAdjustsScrollViewInsets:NO]
//self.automaticallyAdjustsScrollViewInsets = NO;//同上

iOS11: 
在iOS11中UIViewController的automaticallyAdjustsScrollViewInsets属性被废弃,再也不起做用, 
取而代之的是UIScrollView中新增的属性contentInsetAdjustmentBehavior继承

//UITextView继承自UIScrollView,因此也是设置contentInsetAdjustmentBehavior
//效果同iOS11前的self.automaticallyAdjustsScrollViewInsets = NO;

scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  •  

2. 设置导航不透明

self.navigationController.navigationBar.translucent = NO;

3. 边界延伸设置为None

self.edgesForExtendedLayout = UIRectEdgeNone;   //默认为UIRectEdgeAll,会向上下左右偏移,偏移到(0,0)
//setf.extendedLayoutIncludesOpaqueBars = NO;//这里系统默认就是NO,若是单设EdgesForExtendedLayout无效能够试试加上这句

4. 手动更改偏移

不建议使用,先不说代码多,由系统设置引发的问题仍是由更改设置来解决比较好。这样解决就好像一我的引发的问题,让另外一个去解决,不符合代码规范。并且当须要手动设置UIScrollView的contentOffset的时候也会产生冲突。get

//循环出UIScrollView手动设置偏移的y为0
for (UIScrollView *view in self.subviews) {
        if ([view isKindOfClass:[UIScrollView class]]) {
            CGPoint offset = view.contentOffset;
            if (offset.y != 0) {
                offset.y = 0;
                view.contentOffset = offset;
            }
            break;
        }
    }

瞎扯

  1. 这个问题不是太常见,由于咱们如今的导航基本都是不透明的,或者咱们的UITextView都在其余UIScrollView上(须要UITextView的通常都是比较长的视图,好比意见反馈什么的),因此不会被偏移(前面提到了,只会偏移最底层的UIScrollView
  2. 得找到问题的本质。这里就是由于iOS7引入的导航透明,计算坐标为(0,0)引发的系统自动偏移UIScrollView
  3. 问题解决了固然得写篇博客,给别人参考了。减小别人再次翻找的麻烦,编程须要的就是共享精神,咱们在编程时遇到问题还不是大部分靠前人的经验处理吗!!!因此但愿你们能贡献本身的力量。予人方便就是予己方便,由于咱们也须要从共享中获益。
相关文章
相关标签/搜索