UIScrollViewを作成しようとすると、水平方向のズームのみが可能です。スクロールビューは、純粋な自動レイアウトアプローチで設定されています。通常のアプローチは、多くのスタックオーバーフロー回答(例えばthis one)とotherリソースで示唆されているとおりです。私はautolayoutが存在する前に、これをアプリでうまく使用しました。次のようなアプローチがある:スクロールビューのコンテンツビューで、私はsetTransform()
をオーバーライドして、x方向にスケール上に変換を渡す変更:自動レイアウトを使用しているときにUIScrollViewを一方向にのみズームする方法
override var transform: CGAffineTransform {
get { return super.transform }
set {
var t = newValue
t.d = 1.0
super.transform = t
}
}
私もそれはdoesnのように、スクロールビューのコンテンツは、オフセットリセット「Tは、ズーム時の垂直方向にスクロール:
func scrollViewDidZoom(scrollView: UIScrollView) {
scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: scrollView.frame.height)
scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0.0)
}
を自動レイアウトを使用しない場合これは非常にうまく動作します。
しかし、autolayoutを使用すると、ズーム時にコンテンツのオフセットが正しくなくなります。水平方向のコンテンツビューのみスケールが、それは垂直方向に移動します。
私は(この問題のビデオを作るために使用される)サンプルプロジェクトon GitHubを入れています。これには、Main.storyboardとNoAutolayout.storyboardという2つのストーリーボードが含まれていますが、Main.storyboardにはNoAutolayoutが実行されていないときにautolayoutがオンになっている点が異なります。 Main Interfaceプロジェクト設定を変更してそれらの間を切り替えると、どちらの場合でも動作を見ることができます。
マニュアルレイアウトで必要とされるよりもはるかに優れた方法でUIを実装することでいくつかの問題を解決するので、私は本当にautolayoutをオフにしません。 autolayoutを使ってズーミング中に垂直方向のコンテンツオフセットを正しい(つまりゼロ)に保つ方法はありますか?
EDIT:サンプルプロジェクトに3番目のストーリーボード、AutolayoutVariableColumns.storyboardを追加しました。これにより、テキストフィールドが追加され、GridView内の列数が変更され、内部のコンテンツサイズが変更されます。これは、この質問を促した実際のアプリで必要な動作をより詳しく示しています。
アンナさん、ありがとうございました。興味深いアプローチですが、うまくいくようです。私はそれにショットをつけて、報告する。 –
クイックテストは、これが機能することを示しているようです。私は明日の私の実際のプロジェクトにそれを統合しようとします。再度、感謝します! –
あなたがそれを微調整するかどうか私に教えてください - 私は同じ問題を解決しようとしています。 (そして私の答えを受け入れることを確かめてください;-) –