2017-09-07 57 views
0

所以我現在很困惑,因爲我的UIScrollView行事很奇怪。UIScrollView奇怪的行爲與UITextField/UIPickerView

基本上,我有一個UIScrollView約爲iPhone 6的高度的兩倍,我使用它來顯示一些使用iOS圖表的圖形,所以我將它設置爲能夠垂直滾動和彈跳,但不能滾動也不水平反彈。所有的圖形,以及一些額外的UITextFields和UILabel都嵌入在一個單獨的「主體視圖」中,該主體視圖與UIScrollView的框架對齊,這似乎是常見做法。因此,我的觀點的層次結構是這樣的:

hierarchy

這個工作很好,直到今天我注意到,當我按下這個UIScrollView的一個特定的UITextField,這將觸發一個UIPickerView,所有的突然我的滾動視圖開始允許水平彈跳。當它們被輕敲時,對於正文視圖上的兩個其他UITextField,則不會發生此行爲。

我已經檢查了所有通過點擊受影響的文本字段觸發的代碼,並且沒有任何內容直接編輯任何UI對象的框架或邊界。實際上,當文本字段被點擊時調用的唯一函數是textFieldDidBeginEditing。我已經附上了這個函數的代碼,但我相當確定它不是問題。

我的下一個懷疑是UIPickerView彈出已經搞亂我的滾動視圖和/或它的嵌入式視圖的尺寸。我不太確定這是否可能/可能,但整件事情讓我非常難過。

這裏是我的代碼:

func textFieldDidBeginEditing(_ textField: UITextField) { 

    if textField == overallTimeframeTextField { 
     ... 
     // Not the problematic text field 
    } else if textField == subjectTimeframeTextField { 
     ... 
     // Also not the problematic text field 
    } else { // Affected text field 

     // Set the text of the text field 
     if textField.text == "" { 
      // This is executed in this scenario 
      textField.text = subjectPickerData[0] 
     } else { 
      ... 
     } 
    } 
} 

下面是一個簡短概述GIF我的問題。你可以看到我向下滾動頁面,在那裏我無法水平反彈,然後一旦我在文本字段上標記,突然滾動視圖允許反彈。

GIF

我幾乎失去了這個問題,所以任何幫助,將不勝感激。

編輯

爲了澄清,我明確地聲明我的滾動視圖的內容大小等於想要的高度,使用戶在屏幕的寬度。然後我設置bodyView的寬度等於相同的值。

// Fit the content to the screen 
scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: 1200) 
bodyView.frame.size.width = UIScreen.main.bounds.width 

我也有強制滾動視圖和身體既着眼於具有相同的寬度爲UIViewController的默認子視圖(滾動視圖在我的層次中的父約束:這是viewDidAppear用下面的代碼完成)。

我注意到一個有趣的事情是,當我打印我的滾動視圖的寬度和我的身體視圖時的意見負載,我收到了iPhone 6以下的輸出:

385.0

385.0

這是正確的,因爲這是iPhone 6的寬度。然而,當我點擊的文本字段,然後打印相同的價值觀,我得到這樣的輸出:

385.0

384.0

所以,出於某種原因,我的身體的看法是一個點比我的滾動視圖小。當我點擊文本字段時,我嘗試將身體視圖的寬度設置爲等於滾動視圖,就像我在viewDidAppear函數中那樣,但這沒有效果。

在UIPickerView而言,我初始化pickerview我的類的實例變量,像這樣:

var subjectPickerView = UIPickerView() 

我然後分配這個選擇器視圖是文本字段中輸入視圖中viewDidLoad

textField.inputView = subjectPickerView 

所以我不知道這是否使得選擇器視圖的滾動視圖的子視圖,但它只是在這種情況下更換鍵盤。

+0

是您的滾動視圖反彈垂直啓用? – CodeChanger

+0

@CodeChanger是的,「反彈」和「垂直反彈」已啓用,「水平反彈」未啓用。 –

+0

*「我已將它設置爲...既不滾動又不水平反彈」*滾動的能力基於contentSize--您是明確設置還是使用約束?你說*「UITextField ---觸發一個UIPickerView」*你如何顯示選擇器視圖?它是滾動視圖的子視圖嗎? – DonMag

回答

0

感謝@ AchmadJP的評論,我試着在我的滾動視圖和我的身體視圖之間明確地創建一個等寬的約束。這似乎解決了這個問題。

我之前沒做過這個事情的原因是,身體視圖的前導空間,尾隨空間,頂部空間和底部空間被限制爲與滾動視圖相同。從理論上講,這應該意味着寬度在任何時候都是相等的,但顯然情況並非如此。