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. 問題解決了固然得寫篇博客,給別人參考了。減小別人再次翻找的麻煩,編程須要的就是共享精神,咱們在編程時遇到問題還不是大部分靠前人的經驗處理嗎!!!因此但願你們能貢獻本身的力量。予人方便就是予己方便,由於咱們也須要從共享中獲益。
相關文章
相關標籤/搜索