2016-07-15 46 views
1

我做了一個UIScrollView,它水平滾動。當UIScrollView包含它滾動時,是什麼讓UIView調整回默認狀態?

在UIScrollView中,UIView包含顯示文本的UILabel和隱藏視圖的UIButton。

視圖的寬度隨標籤中的文本被用戶更改,而按鈕保持其大小。

我想讓UIView做的事情是當UIScrollView向左和向右滾動時保持其大小。但是UIView在滾動時會回到原來的大小。

下圖顯示了故事板的設置;兩個矩形是UIViews,UILabels默認都有「Label」文本。字母X是一個按鈕。包含這兩個的水平區域是UIScrollView。

enter image description here

下一個是我在運行模擬器的應用場景。我以編程方式更改這些UIViews的邊框。這些文本是從我製作的菜單中選擇的,UIViews的寬度隨着UILabel的寬度改變而改變。忽視爲什麼兩個標籤都有相同的文字;我沒有處理第二種觀點。即使只有一個UIView,情況也是如此。

enter image description here

當我滾動的UIScrollView到右,出現問題。這些UIViews的寬度將恢復爲故事板中設置的默認值。在選擇了菜單時

enter image description here

Theh下面函數被調用。對不起,這些怪異的變數名稱

//selectedTextPrim, selectedTextSecn: String() 
//result1Text, result2Text: UILabel 
//result1, result2: UIView 
//result1XBtn, result2XBtn: UIButton 
func processAddResult(){ 
    result1Text.text = selectedTextPrim + " > " + selectedTextSecn 
    result1Text.sizeToFit() 
    result1.frame.size.width = result1Text.frame.size.width + 24 
    result1XBtn.frame.origin.x = result1Text.frame.maxX 

    result2.frame.origin.x = result1.frame.maxX + 8 

    result2Text.text = selectedTextPrim + " > " + selectedTextSecn 
    result2Text.sizeToFit() 
    result2.frame.size.width = result2Text.frame.size.width + 24 
    result2XBtn.frame.origin.x = result2Text.frame.maxX 
//  print("\(result1Text.frame.size.height)") 
} 

代碼是否需要更改?或者有什麼辦法通過在某處添加一些代碼來進行管理?

回答

2

您的視圖通過自動佈局約束來定位。您可以直接設置框架(如您所做的那樣),但下一次系統執行佈局傳遞時,自動佈局將根據約束來重置幀。

許多事情可以觸發佈局通行證。其中之一是改變了觀點的bounds。滾動視圖滾動的方式是更改自己的bounds.origin。所以每次滾動視圖滾動時,它都會觸發佈局傳遞。在這些佈局過程中,您直接對視圖frame所做的任何更改都會重置爲自動佈局約束所指定的框架。

在這種情況下,您希望每個標籤自動調整大小以適應其文本。自動佈局可以自動執行此操作。如果您對標籤的尺寸沒有任何其他限制,則自動佈局將使用標籤的intrinsicContentSize,標籤的每次設置標籤的文本時都會自動設置該標籤。

然後你想要每個背景矩形自動圍繞一個標籤。您可以通過將矩形的邊緣限制爲標籤邊緣(加上提供填充的常量)來完成此操作。然後自動佈局會自動使矩形的框架跟隨標籤的框架。

如果你做得正確,只有你必須改變你的代碼是標籤的文字。自動佈局將負責調整大小和重新定位標籤和背景矩形。你應該看「Taking Control of Auto Layout in Xcode 5」 from WWDC 2013

相關問題