2014-09-22 87 views
13

我想讓AutoLayout與UIScrollView一起工作,並且遇到了一些問題。下面是我做的:UIScrollView AutoLayout僅限垂直

  1. 添加UIScrollView主視圖內與框架:[頂:0,左:0,寬度:320,高度:568]

  2. 添加UIView 「內容查看」所述UIScrollView與框架和BGCOLOR黑色內:[頂:0,左:0,寬度:320,高度:568]

  3. 設置UIScrollView約束:[頂:0,底部:0,左:0,右: 0]

  4. 設置 「內容查看」 約束:[頂:0,底部:0,左:0,右:0]

  5. 對齊裏面的 「內容查看」

  6. 設置主視圖BGCOLOR到灰色的項目(以看看這是怎麼回事)

這是問題的一個截圖:http://imgur.com/P8s9lB0

出於某種原因,限制令的內容視圖是在屏幕的中間。而且,它可以在各個方向上滾動。我想要的內容只能在垂直方向滾動,如UITableView,所以我不能像這樣移動它:http://imgur.com/lBCwfAS

我在做什麼錯了?我已經檢查了我在StackOverflow和Google中可以找到的所有教程和答案,但實際上沒有人遇到過奇怪的問題,所以我正在尋求幫助。

編輯:我也加入ContentView的寬度和高度作爲約束,並沒有幫助。

回答

16

用於禁用水平滾動,可以設置在(無效)scrollViewDidScroll方法的內容的大小。

[self.scrollView setContentOffset: CGPointMake(0, self.scrollView.contentOffset.y)]; 

您還需要設置方向鎖,因此一次只能使用1個滾動方向。 https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/index.html#//apple_ref/occ/instp/UIScrollView/directionalLockEnabled

self.scrollView.directionalLockEnabled = YES; 
+0

謝謝!水平滾動被禁用。 – Gasim 2014-09-22 19:53:09

+0

沒有問題。至於自動佈局問題,您是使用界面構建器還是通過代碼使用自動佈局? – Derek 2014-09-22 20:13:03

+0

我正在使用界面生成器。我左右改變了約束到-16,它工作。我不相信它的正確行爲。有沒有辦法使它與0一起工作? – Gasim 2014-09-22 20:15:51

1

給內容視圖明確的高度和寬度的限制

+0

我沒有 - >寬度:568,高度:320沒有運氣 – Gasim 2014-09-22 19:48:52

+0

也許你的內容畫面通過它的子視圖縮小。你是否得到了自動佈局異常? – mustafa 2014-09-22 19:55:16

+0

不是,沒有一個。這是事情。我開始玩弄約束值,並將-16和-16作爲前導和尾隨約束條件,實際上將視圖固定在中間......我真的不想依賴這樣的數字。造成這個問題的原因是什麼?收縮者是什麼意思?而且,即使滾動視圖起作用,它也不會滾動到所需的位置。 – Gasim 2014-09-22 19:59:35

3

我寫了一個函數,允許垂直滾動內容但不能水平滾動內容。它在scrollview內創建一個寬度有限的UIView,並嵌入所有的scrollview子視圖。

TegScrolledContent.createContentView(scrollView) 

https://github.com/exchangegroup/scrollable-content-ios

enter image description here

+0

謝謝evegenii,你的圖書館真的幫我在我的登錄視圖時,左轉和右轉景觀。 – 2015-11-24 03:13:08

6

總結萊謝克·S」回答:

爲了有一個垂直滾動視圖,所有的滾動視圖裏面的觀點必須有自己的寬度約束設置。很容易設置爲滾動視圖的超級視圖。

原因是滾動視圖不會水平滾動,只要其子視圖都不需要水平滾動即可。例如,如果您有一個標籤,將其設置爲0行,則自動佈局會嘗試在標籤開始添加換行和換行符之前儘可能寬。如果標籤上沒有明確的寬度限制,它只會使滾動視圖的內容區域變寬。尾隨滾動視圖的約束被忽略。

如果你有一堆視圖,你可能想把它們放在一個包含視圖的視圖中。對於我的情況,我只有5或6個標籤可以動態改變高度,但不應該改變寬度,所以我只是將它們的寬度與滾動視圖的寬度相同。和賓果,垂直滾動視圖與標籤的增長或縮小取決於文本。

1

下面是我用來實現垂直滾動視圖的代碼片段。 它通過添加內容視圖作爲滾動視圖的子視圖,然後將該內容視圖的寬度限制爲父滾動視圖的寬度。從那時起,所有的子視圖都應該添加到內容視圖中,而不是添加到滾動視圖中。

// View that will contain content of scroll view. Width is constrained to the width of the scroll view. 
UIView *contentView = [[UIView alloc] init]; 
contentView.translatesAutoresizingMaskIntoConstraints = NO; 
[scrollView addSubview:contentView]; 

views[@"contentView"] = contentView; 
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; 
[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:views]]; 

// Now, add all your subviews to contentView 
7

您可以完全使用約束來做到這一點,它很容易。

UIScrollView只需要瞭解它在裏面有多少寬度和空間。所以它需要有一些東西固定在LeadingTrailingTop & Bottom約束。另外,內容的寬度和高度必須是固定的(這並不意味着我必須specificy它。我仍然可以使用約束來實現這一目標。)

  1. 添加UIScrollView和位置的要求。
  2. UIScrollView的內容中添加UIView
  3. 設置內容UIViewLeadingTrailingTop & Bottom限制爲0
  4. 添加Equal Width約束到UIScrollViewUIView。這將使其只能垂直滾動。
  5. 您現在需要設置內容的高度UIView。然後,您可以指定內容視圖的高度(blech),或者通過確保底部控件被限制在內容視圖的底部來使用其中包含的控件的高度。

我這樣做,它工作的一種享受。

+1

這是我正在尋找的答案。我有contentView相當於UIScrollView的超級視圖。謝謝 – 2017-06-13 17:24:58

1

隨着@ derek的回答我想補充說設置contentOffset總是在scrollViewDidScroll將導致性能問題。所以,請只檢查如果x不是0,那麼設置contentOffset

if(contentOffset.x != 0){ 
     setContentOffset(CGPointMake(0, contentOffset.y), animated: false) 
    } 

是到了滾動

directionalLockEnabled = true