2016-08-08 3 views
2

これは私の見解です。左側はキーボードが表示されていないときの表示で、右側はキーボードが表示されているときの表示です。コンテンツスクロールビュー

enter image description here

すべての私のフィールドは、私は、このような制約を設定し、フィールド1 topConstraintがscrollViewの先頭に設定され、FIELD4 bottomConstraintがscrollViewの下に設定されていることをscrollViewに追加されます。他のフィールドはすべて下のフィールドに付けられます。

右のモックアップからわかるように、キーボードが表示されているときに、そのようなビューを再調整したいと思います。それでは、私が今やっていることです。これで

func keyboardWillShow(notification: NSNotification) { 
     self.field2.snp_updateConstraints { make -> Void in 
      make.bottom.equalTo(self.field3.snp_top).offset(8) 
     } 

私はこれまでのところ、とても良いフィールド2とフィールド3との間に大きなスペースを調整します。私はその後、contentInsetを設定するために行く:

let contentInset = UIEdgeInsetsMake(0, 0,getKeyboardSize(notification).height, 0) 

    self.scrollView.contentInset = contentInset 
    self.scrollView.scrollIndicatorInsets = contentInset 

が、フィールド3はまだキーボードの後ろ半分が隠れているので、scrollViewは、私が望むように調整されていません。

この投稿を投稿する理由は、contentInsetsがscrollViewでどのように動作しているかを明確に理解できていないため、手動でcontentOffsetを設定しないようにしたいと考えています。

設定している制約に問題があるようです。現在のfield4の制約は、scrollViewの底面ではなくビューに結びつけるように設定し、scrollViewの各端をビューに結び付けることです。

更新: 私はscrollViewに拘束されることをFIELD4下の制約を設定した場合、scrollViewsの高さが0で、どのようにそれはない私は以前ほど大きなことscrollViewを設定した場合、それがどうあるべきかのサイズを知ることができますビュー自体?これは本当に私はこのようなscrollViewの制約を設定していアップデート2 ...

私を混同しています

self.scrollView.snp_makeConstraints { make -> Void in 
     make.top.equalTo(self.snp_topLayoutGuideBottom) 
     make.left.right.equalTo(self.view) 
     make.bottom.equalTo(self.snp_bottomLayoutGuideBottom) 
    } 

をそしてUIDebuggerから、私はscrollViewの高さが同じであることがわかりますが、 Y座標が20に変更されましたが、まだスクロールできませんか?また、デバッグ時にscrollViews contentSizeをフレームより大きく設定することができます。つまり、スクロール可能にする必要がありますが、そうではありません。

更新3 Field1とField4の両方をscrollViewsの上端と下端に取り付ける必要があることを理解しました。したがって、scrollViewsフレームとscrollViews contentSizeの間には違いがあります。なぜなら、contentSize> frameのscrollViewがスクロール可能なときに意図的に機能するからです。 これは私にとって大きな一歩であり、奇妙なことはcontentInsetだけです。

私がcontentInsetを理解したことは、ビューがどちらの方向に縮小するかを指定することです。だから、私は今scrollviewの下部にあるキーボードの高さでインセットをしていますが、スクロールしていませんが、-100のようなランダムな負の数字にトップのcontentInsetを設定すると、スクロールされます下の挿入図が調整されているときにこの動作は達成されませんか?

+0

「フィールド4」を移動したくないので、キーボードとは独立しているはずです。申し訳ありませんが、実際に私はこの分野での経験がないので、私のコメントはあまり役に立たないでしょう。しかし、ちょうど私が正しく理解しているかどうかを知りたいのですが、あなたの質問に対する答えにも興味があります。 – Andrej

+0

正確には、フィールド4は移動しないでください。 –

答えて

0

だから私は次のようでこれを解決:

を私はフィールド1とフィールド4制約がscrollviewに設定されたことを確認しました、このようscrollViewが自動的に高さを計算することができた、ともあればスクロールすることが可能になりました一部のコンテンツはビューの外にありました。私は、キーボードの上部とフレームから見えるフレームを計算しました。

func keyboardWillShow(notification: NSNotification) { 

    self.Field2.snp_updateConstraints { make -> Void in 
     make.bottom.equalTo(self.Field3.snp_top) 
    } 

    self.Field3.snp_updateConstraints { make -> Void in 
     make.bottom.equalTo(self.Field4.snp_top) 
    } 

    self.view.layoutIfNeeded() 

    let contentInset = UIEdgeInsetsMake(0, 0,getKeyboardSize(notification).height + 4, 0) 
    let visibleRect = UIEdgeInsetsInsetRect(self.scrollView.frame, contentInset) 
    let scrollToOffset = max(0,self.Field4.frame.maxY - visibleRect.height) 
    self.scrollView.setContentOffset(CGPoint(x: 0, y: scrollToOffset), animated: true) 
} 

キー制約を変更した後だった、私は現在のレイアウトを無効にし、再びビューをレイアウト、我々は計算を正しく行うことができ、更新制約そのようにする必要がありました。