今天想作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); }]; }
翻了很久的资料找到了问题。.net
下面说的UIScrollView包含其子类,UITableView,UICollectionView等3d
主要是demo中用的导航是透明的,起始坐标是(0, 0),系统会自动偏移UIScrollView让其初始状态从(0,64)显示,可是又可以滑到导航来显示蒙层效果效果如图代码规范
应该是iOS7时苹果以为这样好看,因此至今默认效果仍是这样的
) UITextView中的内容就是在一个UIScrollView上,因此系统对最底层对UIScrollView作了偏移。code
为何说是最底层的UIScrollView呢,由于若是在一个UIScrollView中嵌套其余UIScrollView,被嵌套的UIScrollView是再也不偏移的,只会偏移最底层那个UIScrollView。blog
[self setAutomaticallyAdjustsScrollViewInsets:NO] //self.automaticallyAdjustsScrollViewInsets = NO;//同上
iOS11:
在iOS11中UIViewController的automaticallyAdjustsScrollViewInsets
属性被废弃,再也不起做用,
取而代之的是UIScrollView中新增的属性contentInsetAdjustmentBehavior
继承
//UITextView继承自UIScrollView,因此也是设置contentInsetAdjustmentBehavior //效果同iOS11前的self.automaticallyAdjustsScrollViewInsets = NO; scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
self.navigationController.navigationBar.translucent = NO;
self.edgesForExtendedLayout = UIRectEdgeNone; //默认为UIRectEdgeAll,会向上下左右偏移,偏移到(0,0) //setf.extendedLayoutIncludesOpaqueBars = NO;//这里系统默认就是NO,若是单设EdgesForExtendedLayout无效能够试试加上这句
不建议使用,先不说代码多,由系统设置引发的问题仍是由更改设置来解决比较好。这样解决就好像一我的引发的问题,让另外一个去解决,不符合代码规范。并且当须要手动设置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; } }
须要UITextView的通常都是比较长的视图,好比意见反馈什么的
),因此不会被偏移(前面提到了,只会偏移最底层的UIScrollView
)