天天看點

如何在Storyboard中使用Scroll view

本文章環境Xcode 11

在開始使用scroll view之前(storyboard/XIB),我們必須搞清楚兩個東西

  1. 在Storybord/Xib中使用Scroll view,會有哪些結構
  2. 為什麼會發出“ambiguous scrollabel content width/height”錯誤提示。
    如何在Storyboard中使用Scroll view

scroll view的結構

滾動視圖工作原理在于可滾動區間大小,就像這樣:

如何在Storyboard中使用Scroll view

為了讓滾動視圖在自動布局下有效工作,滾動視圖必須知道它的可滾動大小高和寬,同時也需要知道自己的frame(X, Y, Width,Height),比如滾動視圖在父視圖中的位置和大小。

如果AutoLayout不知道滾動視圖的可滾動内容大小,Xcode就會提醒你錯誤"ambiguous scrollable content width/height"

Scroll View的Content Layout Guide 和 Frame Layout Guide

在Xcode 11中,蘋果已經介紹過Content Layout Guide和Frame Layout Guide,他們可以更容易實作滾動視圖滾動,這個特性預設是開啟的【注意:這個特性是iOS 10 +,如果你需要相容更低iOS版本,處理傳送門】

如何在Storyboard中使用Scroll view

為了正确使用滾動視圖,我們必須設定以下限制:

  1. 添加scroll view在父視圖的位置和大小限制
  2. 添加可計算出scroll view可滾動區間大小的限制, 這樣才可以渲染出正确的布局和滾動。

    Frame Layout Guide:與位置(x, y)和大小(width, height) 有關, 和他在父視圖中的位置有關。

    如何在Storyboard中使用Scroll view
    Content Layout Guide:與scroll view内部可滾動區間大小有關
    如何在Storyboard中使用Scroll view

    滾動視圖最具有挑戰性的是:定義足夠多的限制來讓自動布局計算可滾動區間的大小,這個内容我們将在下面講到。

    原文可擷取示例項目。

步驟1:向Controller中添加scrolle view和限制

First, 添加一個滾動視圖(scroll view)到contoller中,并設定位置限制,Auto Layout 知道他在哪裡和大小的限制。

一般我設定安全距離的四邊對齊(top, leading, trailling 和 bottom),就像這樣:

如何在Storyboard中使用Scroll view

設定frame限制之後,你會注意到Xcode提示紅色線和錯誤,因為AutoLayout 不知道可滾動内容大小。小事一樁,我們等等就放一個view 進去解決它。

步驟2:向scroll view添加一個View和設定限制

為了簡化滾動内容區間的高度計算,我們添加一個子視圖到scroll view中,作為scroll view的content view(同時也是子控件的容器),為這個view添加四邊限制(leading, trailling, top 和 bottom, 設定為0),注意限制關系選擇是從view 到 scrollView content layout guide。

選中view (添加到 scroll view), 按住control之後拉到Content Layout Guide

如何在Storyboard中使用Scroll view

之後在限制選擇彈出框中,按住shift, 選擇多個限制, 選擇leading/top/trailling/bottom To Content Layout Guide

如何在Storyboard中使用Scroll view

需要注意的是,在建立這些限制之後,它們的值不一定是準确的,編輯他們的限制值為0這樣它就可以緊貼内容布局的四邊了。

如何在Storyboard中使用Scroll view

那就讓我們把這個view 叫做 Content View, 我們的UI 元素(或者布局)都應該在這裡添加。AutoLayout 将使用這個View 的高度和寬度計算可滑動區間大小。

在改變限制值為0之後,你會看到紅色線條錯誤,這是因為scollview還是不知道 scollview的高度和寬度。

如何在Storyboard中使用Scroll view

如果我們僅僅隻想讓滾動視圖往一個方向滾動時垂直, 就要求,可滾動區的寬度應該等于或者小于滾動視圖的寬度。接下來,我們将建立equal width 限制在view 和 scroll view的Frame Layout Guide,如此一來,可滾動區間寬度就确定了,和scroll view寬度一樣。

如何在Storyboard中使用Scroll view

但是我們依然需要檢查一下限制的值,檢視Multiplier是否為1,如果是,才確定是相等的。

如何在Storyboard中使用Scroll view

現在我們已經定義了可滾動區間的寬度限制,接下來就是高度限制了。

如何在Storyboard中使用Scroll view

這裡有一個小技巧,可以先設定一個較大的預設高度限制(為了取消掉錯提示,和子控件布局有正确的限制布局依賴),等我們元素添加完成且布局限制完成再去掉。

這裡我們就設定view 高度為1000吧:

如何在Storyboard中使用Scroll view

到目前為止,我們已經設定了這個view的高度和寬度限制,自動布局可以計算出scroll view的可滾動區間大小。

你能夠在Storyboard中滾動scroll view, 選中 scroll view内部的view,之後你就可以滾動了。

如何在Storyboard中使用Scroll view

如果你不想現在有滾動,而是想看見整個滾動區間,你可以在contoller中設定最大高度:

如何在Storyboard中使用Scroll view
  1. 選中 View controller
  2. 選擇 “Size inspector”
  3. 在" Simulated Size"中選擇Freeform
  4. 設定1100作為高度

    你可以看到view controller高度變為了1100,現在你可以添加布局元素

步驟3:在scroll view中添加UI元素

下面這張圖是布局後的label與image在scroll view 的樣子。

如何在Storyboard中使用Scroll view

你可以添加UILabel,UIImage控件,之後添加限制,這樣AutoLayout 接可以計算他們的位置(X, Y)寬和高(如果他們滿足intinsic content size,可以不用設定),注意,限制應該添加給基于view和這些元素,而不是和scroll view 有關聯。

你的限制應長這樣:

如何在Storyboard中使用Scroll view

注意,需要添加足夠多的限制,以滿足AutoLayout能夠計算可滑動區間高度,在移除剛剛添加的預設高度1000限制後。

注意事項是垂直限制必須與top content view 和 bottom content view有關系,這確定自動布局能夠計算可滾動高度。

現在,移除預設的view的1000限制高度,你就能夠看到所有限制都是藍色(滿足要求的限制)。

在你設定限制之後,你就可以為label在代碼中建立outlet,設定網絡API請求下來的JSON text值。你的可滑動高度将由控件内容大小擴充開。

This article is an excerpt from the book Making Sense of Auto Layout , if you feel like you have no idea what you are doing when adding / removing / editing constraints, give the sample chapter a try!

繼續閱讀