UIScrollView を使用すると、スクロール時のみ scrollbar(scrollIndicator)が表示されます。
しかし、ユーザにスクロールが可能であることを示すためにも、スクロール時だけでなく常時表示したいと考えています。いろいろ調べてはいるのですが解決方法が見つかりません。そもそも可能かどうかもわかっていません。
ご存じの方いらっしゃいましたらよろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
※もっと最適な回答があったら申し訳ありません。
公式ドキュメントを確認しても、やはり**「常に表示する」**という設定は見つけられませんでした。
UIScrollViewドキュメント
なので、以下の案(参考サイト含めて)を共有させて頂きます。
既に質問者様の方で確認済みだったり、上手く動かなかったらスルーしてください。
案1:Viewを表示した瞬間に、「flashScrollIndicators」で一時的にスクロールバーを表示する
**「常に表示」**とは違うので回答になってないですが、公式にもメソッドが用意されているので簡単に実装可能。
※手持ちのiPhoneだと、設定画面がこちらの様な動きになってました。
Swift
1〜省略〜 2// スクロールView定義 3@IBOutlet weak var scrollView: UIScrollView! 4 5override func viewDidLoad() { 6 super.viewDidLoad() 7} 8 9override func viewDidAppear(_ animated: Bool) { 10 super.viewDidAppear(animated) 11 12 // View表示と同時に、一時的にスクロールバー表示 13 scrollView.flashScrollIndicators() 14} 15〜省略〜
案2:案1の処理を、タイマーで定期的に呼び出す
以下参考サイトに記載されている様に、タイマーで呼び出せば「常に表示」に似た動きは可能そうです。
※見た目とか処理的に、個人的に微妙な感じがしております。
How to make scrollbar of TextView always visible in Swift
案3:スクロールバーと同じサイズのViewを独自に追加する
Viewを独自に追加して、スクロールバーのFrameと同期させて「常に表示」っぽい見た目にする。
※無理矢理感があるのと、検証も不十分なので利用する場合は自己責任でお願いいたします。。
Swift
1import UIKit 2 3// UIScrollViewのDelegateを追加しておく 4class ViewController: UIViewController, UIScrollViewDelegate { 5 6 @IBOutlet weak var scrollView: UIScrollView! // スクロールView 7 private var scrollBar: UIView = UIView() // 独自に追加するスクロールバー 8 private let SCROLLBAR_TAG = 999 // スクロールバー判定用のタグ(適当な値) 9 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 } 14 15 16 override func viewDidAppear(_ animated: Bool) { 17 super.viewDidAppear(animated) 18 19 // スクロールViewのコンテンツサイズ、背景色設定 20 scrollView.contentSize = CGSize(width: self.view.bounds.width, 21 height: self.view.bounds.height * 4) 22 scrollView.backgroundColor = .cyan 23 24 // スクロールバーの一時表示設定 25 scrollView.flashScrollIndicators() 26 27 // スクロールViewのDelegate設定 28 scrollView.delegate = self 29 30 // 常に表示するためのスクロールバー(UIView)を、SubViewとして追加 31 for subView in scrollView.subviews { 32 scrollBar = UIView(frame: subView.frame) 33 scrollBar.backgroundColor = .lightGray 34 scrollBar.tag = SCROLLBAR_TAG 35 scrollView.insertSubview(scrollBar, at: 0) 36 } 37 } 38 39 40 func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { 41 print(#function) 42 // スクロールを開始しようとした時に、追加したスクロールバーを非表示 43 scrollBar.isHidden = true 44 } 45 46 func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 47 print(#function) 48 49 // スクロール動作が減速し始めた時に、追加したスクロールバーのFrameを更新し、再度表示する 50 for v in scrollView.subviews { 51 if v.tag != SCROLLBAR_TAG { 52 scrollBar.frame = v.frame 53 } 54 } 55 scrollBar.isHidden = false 56 } 57}
投稿2020/08/01 13:36
編集2020/08/01 13:39総合スコア1751
0
常時表示というのは、iOS のデザインガイド的観点からも適切では無いという議論を見たことがあるので難しいかと思います(技術的には可能かもしれません)。
回答を参考にガイドラインの該当しそうな場所を見てみましたが、明確に常時表示を禁止しているような記述は見当たらなかったので、もしかしたら現状は異なっている可能性もあります。
一方、
を使えば、任意のタイミングで Scroll Indicator を一時表示させることは可能なようですので、必要なタイミングで表示させるのが一つかと思います。
投稿2020/08/01 13:36
総合スコア5086
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/01 13:37
2020/08/01 14:05