zoukankan      html  css  js  c++  java
  • IOS6之后ScrollView无法滚动的解决办法

      今天做了一个ScrollView的小例子(我的环境Xcode5.0.2 IOS7),结果发现无法滚动,即使设置了scrollView的contentSize还是不行,于是研究了一番,最终找到了解决方案:

    • 在ios6之前,因为Xcode没有Autolayout的机制,所以直接使用scrollView,设置它的contentSize即可正常滚动
    • 在ios6之后,因为Xcode引入了Autolayout的机制,所以我们设置的contentSize被修改为适合屏幕大小的值,也就是说自适应啦,因此无法滚动,解决方案如下:
    1. 直接去掉scrollView的Autolayout即可,但是这种方式不完美,毕竟Autolayout是官方推荐的,轻易去掉会引起其他问题,因此慎用。
    2. 在viewController中重载 - (void)viewDidAppear:(BOOL)animated 方法,并且设置contentSize,代码如下:
     1 #import "ImaginariumViewController.h"
     2 
     3 @interface ImaginariumViewController ()
     4 @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
     5 @property (weak, nonatomic) IBOutlet UIImageView *imageView;
     6 @end
     7 
     8 @implementation ImaginariumViewController
     9 
    10 - (void)viewDidAppear:(BOOL)animated
    11 {
    12     [super viewDidAppear:animated];
    13     self.scrollView.contentSize = self.imageView.image.size;
    14     self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
    15 }
    16 
    17 @end

      另外,附上我的一个小实验:

     1 #import "ImaginariumViewController.h"
     2 
     3 @interface ImaginariumViewController ()
     4 @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
     5 @property (weak, nonatomic) IBOutlet UIImageView *imageView;
     6 @end
     7 
     8 @implementation ImaginariumViewController
     9 
    10 - (void)viewDidLoad
    11 {
    12     [super viewDidLoad];
    13     NSLog(@"viewDidLoad %g %g",self.scrollView.contentSize.width, self.scrollView.contentSize.height);
    14     self.scrollView.contentSize = self.imageView.image.size;
    15 }
    16 
    17 - (void)viewWillAppear:(BOOL)animated
    18 {
    19     [super viewWillAppear:animated];
    20         NSLog(@"viewWillAppear %g %g",self.scrollView.contentSize.width, self.scrollView.contentSize.height);
    21     self.scrollView.contentSize = self.imageView.image.size;
    22 }
    23 
    24 - (void)viewDidAppear:(BOOL)animated
    25 {
    26     [super viewDidAppear:animated];
    27     NSLog(@"viewDidAppear %g %g",self.scrollView.contentSize.width, self.scrollView.contentSize.height);
    28     self.scrollView.contentSize = self.imageView.image.size;
    29     self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
    30 }
    31 
    32 - (void)didReceiveMemoryWarning
    33 {
    34     [super didReceiveMemoryWarning];
    35     // Dispose of any resources that can be recreated.
    36 }
    37 
    38 @end

      实验结果,console输出:

      实验分析:

      可以看到我在viewDidLoad方法和viewWillAppear方法之后都设置了contentSize,

      但是发现viewDidLoad里设置是有效的,在viewWillAppear一开始log的值正是我们设置的700 655,

      而在viewWillAppear里设置contentSize之后,viewDidAppear又还原了contentSize为0 0,

      所以我猜测viewDidAppear才是真正执行Autolayout的地方,因此我们要设置contentSize就在viewDidAppear方法调用[super viewDidAppear:animated]之后吧。

      这个实验也算是对上面的第二种解决方案的解释吧!



  • 相关阅读:
    前端代码规范
    使用CSS设置行间距,字间距.
    今天我们要说的画一个三角形,恩,画一个三角形,第一种呢是利用我们的html标签结合css来实现;而第二种方法就就是我们的html5新增的一个标签canves,这个canves就是网页画幕,那么顾名思义就是在网页里建造一个画板,用来画画,好,那接下来就和我一起去看看吧!
    javascript基础程序(算出一个数的平方值、算出一个数的阶乘、输出!- !- !- !- !- -! -! -! -! -! 、函数三个数中的最大数)
    css3 风车旋转
    css3简单的图片轮播
    css3 2D动画的基本用法和介绍
    Android 系统UI设计规则
    Android用户界面程序设计示例
    将博客搬至CSDN
  • 原文地址:https://www.cnblogs.com/shadowflyer/p/3491243.html
Copyright © 2011-2022 走看看