今天想作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
)