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]之后吧。

  這個實驗也算是對上面的第二種解決方案的解釋吧!

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM