2017-09-07 14 views
0

UIScrollViewがかなり奇妙に動作しているので、今私はかなり困惑しています。UIScrollView UITextField/UIPickerViewで奇妙な振る舞い

基本的に、iOSチャートを使用してグラフを表示するために使用しているiPhone 6の高さの約2倍のUIScrollViewがあるため、スクロールして垂直に跳ね返ることができるように設定しましたが、水平にも跳ねません。すべてのグラフ、およびいくつかの追加のUITextFieldとUILabelsは、一般的なように見えるUIScrollViewのフレームに合わせて別の「ボディビュー」に埋め込まれています。このように、私のビューの階層は次のようになります。私は今日に気づいまで

hierarchy

これはうまく働いている私はUIPickerView、私のスクロールビューの突然のすべてをトリガーこのUIScrollViewの上の特定のUITextFieldを押したとき水平方向のバウンスが可能になります。この動作は、タップされたときにボディビュー上の他の2つの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

私はかなりこの問題に迷ってしまいましたので、任意の助けいただければ幸いです。明確にするために

編集

、私は明示的に所望の高さと、ユーザーがオンになっていることを画面の幅に等しくなるように、私のscrollViewのコンテンツのサイズを宣言します。 bodyViewの幅を同じ値に設定します。これは、次のコードでviewDidAppearで行われます。

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

私も両方にscrollviewと身体ビューを強制的制約が私の階層内のUIViewControllerのデフォルトの子ビュー(スクロールビューの親と同じ幅を持っています)。

私が気づいた一つ興味深いのは、私は時にビュー負荷私のスクロールビューの幅と私の体のビューを印刷するとき、私はiPhone 6のために次の出力を受け取ることです:

385.0

385.0

これはiPhone 6の幅と同じです。しかし、私はテキストフィールドをタップして、同じ値を印刷するとき、私はこの出力を得る:

385.0

384.0

ので、いくつかの理由で、私の体のビューが1であります私のスクロールビューよりも小さいポイント。私はviewDidAppear関数のように、テキストフィールドをタップすると、ボディビューの幅をスクロールビューと同じに設定しようとしましたが、これは効果がありませんでした。 UIPickerViewの面では

、私はそうのような私のクラスのインスタンス変数とpickerviewを初期化します。

var subjectPickerView = UIPickerView() 

私はその後、viewDidLoadでテキストフィールドの入力ビューになるこのピッカービューを割り当てる:

textField.inputView = subjectPickerView 

このようにすると、ピッカービューがスクロールビューのサブビューになるかどうかはわかりませんが、このシナリオではキーボードを置き換えるだけです。

+0

あなたのスクロールビューのバウンスは垂直ですか? – CodeChanger

+0

@ CodeChangerはい、「バウンス」と「バウンスが縦に」は有効で、「バウンスは横に」は有効になっていません。 –

+0

* "私はそれを設定しました...スクロールも水平方向へのバウンスもありません" *スクロールする能力は 'contentSize'に基づいています---それを明示的にまたは制約で設定していますか?あなたは* "UITextField --- UIPickerViewをトリガーする"と言う*どのようにピッカービューを表示していますか?スクロールビューのサブビューですか? – DonMag

答えて

0

@ AchmadJPのコメントのおかげで、スクロールビューとボディビューの間に等幅の拘束を明示的に作成しようとしました。これは問題を解決したようです。

私がこれまで行っていなかった理由は、ボディビューの先頭スペース、後ろスペース、上スペース、およびボトムスペースがスクロールビューの先頭スペースと同じに制限されていたからです。理論的には、これは幅が常に等しいことを意味するはずですが、明らかにそうではありません。