【iOS】長文テキストを縦方向に自動スクロールせさる方法
スポンサーリンク

iOSのプログラミングにおいて、縦方向の自動スクロールができるようにしたい

Swift / Objective-C のUIScrollViewで自動スクロールせさる方法

ヒーラー
iOSプログラミングにおいて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で呼ぶのは、その前だと画面サイズが確定していないためです。

完成


スポンサーリンク

Twitterでフォローしよう

おすすめの記事