
iOSのプログラミングにおいて、縦方向の自動スクロールができるようにしたい
Swift / Objective-C のUIScrollViewで自動スクロールせさる方法

やりたいこと
「複数行になる長文テキストを入れたUILabelやUITextViewを、適当な時間をかけて上から下方向へ自動的にスクロールするようにしたい」
スクロール方向は、映画のエンディングのスタッフロールのようなイメージです。
完成イメージは以下のとおりです。

画面上部には固定されたヘッダー部分がある前提で、その下から画面最下部までテキストがスクロールする領域となっています。
実現方法
まず、UIScrollViewとUILabel/UITextViewの配置関係性だけであれば、StoryboardのConstraintsの設定だけでも可能ですが、自動スクロール自体や、スクロールスピードを考えると、ある程度プログラムを書く必要は出てきます。
Storyboardでの構造は以下のようなイメージです。

上記のようなStoryboardの例において、下3分の2くらいの領域にUIScrollViewを置いています。
その中にUILabelを置いています。
ScrollViewの外見のサイズは赤枠のとおりです。
それに対し、ScrollViewの中身のサイズ(contentSize)は青枠のとおりです。
これと同じサイズで黄色枠のUILabelが上に乗っている状態である必要があります。
なので、今回の場合は青と黄色の上下左右が動的にぴったりになるように、Constraintsを設定していま す。
この時点でノンプログラミングで通常のスクロールビューアプリができています。
ここから自動スクロールする部分について触れていきます。
UIScrollViewを使用していますが、この機能を拡張して自動スクロールするプログラムを追加したいと思います。したがって、カテゴリという機能を使って、従来のUIScrollViewを拡張します。
(例)UIScrollView+AutoScroll
@interface UIScrollView (AutoScroll)
- (void)startScroll:(NSInteger)scrollSpeed;
- (void)stopScroll:
@end
※コードはObjective-Cです。
start(速度設定もあればここに追加)とstopメソッドを用意します。
@implementation UIScrollView (AutoScroll)
BOOL isScrolling;
NSInteger autoScrollSpeed;
- (void)startScroll:(NSInteger)scrollSpeed
{
isScrolling = YES;
autoScrollSpeed = scrollSpeed;
[self autoScroll];
}
- (void)stopScroll
{
isScrolling = NO;
}
@end
privateメソッドの「autoScroll」というものを用意しています。
これがコアとなる自動スクロール部分です。
また、上で言うscrollSpeedは、時間ではなく移動量と思って下さい。
例えば10なら、一回の移動にY座標を10下げることを繰り返すという意味。
一番下に行ったら停めます。
これをロジカルにまとめると、
<autoScrollを呼ぶ>
|
<scrollSpeed分下に移動>
|
<一番下でないことを確認>
|
<再度autoScrollを呼ぶ>
これを繰り返せば良いことになります。
これをプログラムにしたものが以下です。

あとは、 ViewControllerのscrollViewをStoryboardのUIScrollViewと紐付けて、ViewControllerのviewDidAppearでscrollViewのstartScrollを呼びます。
viewDidAppaerで呼ぶのは、その前だと画面サイズが確定していないためです。
完成

