ラベル ScrollView の投稿を表示しています。 すべての投稿を表示
ラベル ScrollView の投稿を表示しています。 すべての投稿を表示

2017年9月6日水曜日

StoryboardでScrollViewのコンテンツを配置

UIScrollView上に配置するUIをStoryboardで配置しようとすると、iPhoneやiPadのサイズからはみ出したUIが隠れてしまう。
ScrollViewの上にMapViewと紫色のViewが乗ってる

そこで、そのStoryboardのViewControllerを選択し、SizeInspectorのSimulated SizeをFreeformにし、Height(もしくはWidth)を必要な値に変更してやれば、Storyboardがその長さまで広がってくれるのでUIの配置が簡単にできるようになる。


2017年1月23日月曜日

ScrollView上の部品でtouchesイベントを有効にする

ScrollView上に配置した部品はtouchesBeganとかのイベントが無効になってしまう。

やり方は意外と簡単で、以下のようにUIScrollViewを継承したクラスを作り、それを使えばいいのだ。
中にはtouchesBegan( )をoverrideし、superviewに渡すメソッドを書く。
(必要に応じてtouchesMove( )とかのメソッドも書く)

//ScrollViewでtouchイベントを取得できるようにするため、overrideしたクラスを作る
class TouchableScrollView: UIScrollView
{
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        superview?.touchesBegan(touches, with: event)
    }

}

StoryboardでScrollViewを配置してるなら、そのCustomClassにこのTouchableScrollViewを指定する。
コードで配置してるならこれのインスタンスを使えばいい。

UIScrollViewはStoryboardで扱いにくい

画面の一部(または全部)をスクロールさせて大きなコンテンツを見せるためのクラスがUIScrollViewなわけだ。

画面サイズに収まるUIScrollViewの上に、画面サイズに収まらない(または拡大表示すると収まらなくなる)コンテンツを置くことで、スクロールが可能になる仕組み。
UIScrollViewは要するにでかいコンテンツを見せるための窓のようなもの。

Storyboardからも設定できるからそっちから使いたいけど、ちょっと扱いにくい。
Xcode8にもなって、いまだ完全対応してないのかよ…と愚痴ってやりたい。

具体的には、中のでかいコンテンツのサイズを設定するcontentSizeがStoryboardじゃ設定できないっぽい。
Storyboardで設定するだけじゃ以下のようなWarningが出てしまう。
コンパイル、実行はできるけど気持ち悪い。
warning: Ambiguous Layout: Scrollable content size is ambiguous for "My Scroll View".

なので通常は以下のようにコードで設定してやる必要がある。
myScrollView.contentSize = CGSize(width: 500, height: 500)

でも細かな部品を配置したいとき、コードだけでやるのは大変だよね。Constraintsの設定とかよくわかんないし。
その場合は、ダミーのUIViewをScrollViewに上下左右のマージン0、センターをScrollViewと同じにするConstraintsにして貼ってやり、さらにその上に中身のでかいコンテンツを置いてやるとWarningが消えてくれる。

UIScrollViewはまだ不慣れなので、わかんない点もあるので、いろいろ調べてみたい。