UIScrollView内容偏移的问题处理(更新到iOS11)

本文在CSDN上的地址

问题:

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

可以看到上方有64的偏移,光标是无法到达的。
代码如下:

- (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);
    }];
}

原因:

翻了好久的资料找到了问题。

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

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

  • 初始状态因为被偏移了(0,64)所以能够贴导航显示


    初始状态

  • 导航透明,UIScrollView的起始点在(0,0),所以可以滑动到导航栏显示蒙层效果(应该是iOS7时苹果觉得这样好看,所以至今默认效果还是这样的
    蒙层效果

UITextView中的内容就是在一个UIScrollView上,所以系统对最底层对UIScrollView做了偏移。

为什么说是最底层的UIScrollView呢,因为如果在一个UIScrollView中嵌套其他UIScrollView,被嵌套的UIScrollView是不再偏移的,只会偏移最底层那个UIScrollView。

解决方案:

1. 设置ScrollView不自动偏移

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

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

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

if (@available(iOS 11.0, *)) {
        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
        self.automaticallyAdjustsScrollViewInsets = NO;
}

//swift:
if #available(iOS 11.0, *) {
      scrollView.contentInsetAdjustmentBehavior = .never
} else {
      automaticallyAdjustsScrollViewInsets = false;
}

2. 设置导航不透明

self.navigationController.navigationBar.translucent = NO;

3. 边界延伸设置为None

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

4. 手动更改偏移

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

//循环出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. 问题解决了当然得写篇博客,给别人参考了。减少别人再次翻找的麻烦,编程需要的就是共享精神,我们在编程时遇到问题还不是大部分靠前人的经验处理吗!!!所以希望大家能贡献自己的力量。予人方便就是予己方便,因为我们也需要从共享中获益。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容