2013-11-04 90 views
11

我有一個UIScrollView在界面生成器中創建了一堆UITextViewUIImageView對象已經添加。我已將它連接到IBOutlet,並在-(void)viewDidLoad下將其內容大小設置爲1200x2000。用戶交互已啓用,多點觸控,滾動已啓用並顯示垂直和水平滾動指示都設置爲YES。當我在iOS模擬器中啓動應用程序時,它不會滾動。什麼可能是這種行爲的原因?UIScrollView不滾動?

+0

發佈的初始化代碼? –

+0

沒有任何初始化代碼,我相信UIScrollView是由IB自動初始化的。我所做的代碼明智的做法是設置scrollView的contentSize屬性 – 68cherries

+0

重寫並檢查UIScrollView委託方法,以檢查UIScrollView實際上是否獲取觸摸事件或某個其他視圖實際上是吃掉所有事件..g scrollViewWillBeginDragging: – Dinesh

回答

19
  1. viewDidLoad即將推出。您必須等到視圖佈局發生之後。嘗試在viewDidAppear中設置contentSize。

  2. 您使用的是自動佈局?如果是這樣,請查看以下答案(並忘記1.): UIScrollView doesn't use autolayout constraints

+0

我嘗試了第一個,但沒有幫助。我檢查了另一個答案,並寫了這個非常快速的代碼來實現它:' - (void)viewDidLoad { //在加載視圖後執行任何其他設置。 _mainScrollView.contentSize = CGSizeMake(4000,4000);對於(int i = 0; i <_mainScrollView.subviews.count; i ++){ UIView * newSubview = [_ mainScrollView.subviews objectAtIndex:i]; newSubview.translatesAutoresizingMaskIntoConstraints = NO; } [super viewDidLoad]; }' – 68cherries

+0

@Nenad M:爲什麼忘記第一?純自動佈局方法似乎仍然需要設置'contentSize'。也許如果你採取混合的方式,你不需要這樣做,但我還沒有嘗試過。 – testing

+0

@timquinn:什麼是祕密?一個祕密似乎是[這個答案](http://stackoverflow.com/a/16029013/426227)。 – testing

8

我知道如何解決這個問題,而不是訴諸編寫代碼的最佳方式是,這一切都可以在故事板內完成,這裏是如何:啓用

  1. 離開自動佈局。
  2. 製作一個通用的UIView UIScrollView的子視圖。 2.1)把所有的視圖組件放在這個通用的UIView中。
  3. 在子視圖和UIScrollView之間進行自動佈局約束。您必須將最後一個子視圖的右側和/或底部固定在UIScrollView的右側和/或底部。這就是UIScrollView知道內容大小的方式。
+0

非常感謝你!這是我發現在iOS 7環境中使用UIScrollView與Autolayout一起工作的唯一方法!!!!!!! :) 豎起大拇指! –

4

viewDidLoad確實爲時過早,但viewDidAppear:animated也許不夠遲。設置contentOffset的理想場所在viewDidLayoutSubviews之內。

3

如果您使用自動佈局,確保你把代碼中

viewDidLayoutSubviews 
0

我使用自定義視圖的UIScrollView的設置內容大小,拉刷新功能,滾動視圖不滾動。我嘗試設置contentSizeAutoLayout,並嘗試通過代碼設置它。滾動視圖仍然無法滾動。

花費3〜4小時後,我通過contentInset來解決。它會告訴滾動視圖爲滾動添加一些額外的空間。

override func viewDidLayoutSubviews() { 
    // Add extra 15pt on the `top` of scrollView. 
    //self.scrollView.contentInset = UIEdgeInsetsMake(15, 0, 0, 0) 

    // Add extra 2pt on the `bottom` of scrollView, let it be scrollable. And the UI is more beautiful in my case. 
    self.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 2, 0) 
} 

參考文檔: