質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

722閲覧

pageControlが動きません。

tomichi

総合スコア16

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/09/20 11:37

前提・実現したいこと

現在、scrollViewを使って画像を動かす処理をしています。
そこで、スライドさせた写真と連動するように動くUIpageControlにしたいのですが、シュミレーターでは一番右から固定されて動きません。これはなぜでしょうか?

発生している問題・エラーメッセージ

エラーメッセージはないです。

該当のソースコード

swift

1import UIKit 2 3class homeViewController: UIViewController{ 4 5 @IBOutlet weak var Home: UIScrollView! 6 @IBOutlet weak var pageControl1: UIPageControl! 7 8 let images = [UIImage(named: "home1"), UIImage(named: "home2"), UIImage(named: "home3")] 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 Home.frame = CGRect(x: 0, y: 88, width: CGFloat(414), height: CGFloat(225)) 14 Home.contentSize = CGSize(width: Home.frame.width * 3, height: Home.frame.height) 15 16 for i in 0 ..< 3 { 17 let b = UIImageView() 18 b.frame = CGRect(x: CGFloat(i) * Home.frame.width,y: 0, width: Home.frame.width, height: Home.frame.height) 19 b.tag = i 20 b.image = images[i] 21 Home.addSubview(b) 22 23 if b.image == images[0]{ 24 pageControl1.currentPage = 0 25 print(0) 26 }else if b.image == images[1]{ 27 pageControl1.currentPage = 1 28 print(1) 29 }else{ 30 pageControl1.currentPage = 2 31 print(2) 32 } 33 } 34 } 35}

試したこと

printを使ってif文内処理が行われているかを確認したところ、作動しているようで、0,1,2とprint()したものが出てくるところに表示されていました。

補足情報(FW/ツールのバージョンなど)

調べてもなかなか出てこないです。すみませんが教えていただけると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スライドさせた写真と連動するように動くUIpageControlにしたい

に関しては、スクロールするたびにスクロール量を測ってどの位置か計算してその都度"currentPage"にあてはめる作業が必要になるかと思います。これ結構めんどくさいんですよね(/ω\)

なので以下サンプルコード貼っておきます!

swift

1import UIKit 2 3class ViewController: UIViewController, UIScrollViewDelegate { 4 5 var scrollView:UIScrollView! 6 var pageControl:UIPageControl! 7 let color:[UIColor] = [.darkGray, .green, .cyan] 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 scrollView = UIScrollView(frame: CGRect(x: 0, y: 50, width: UIScreen.main.bounds.size.width, height: 200)) 13 pageControl = UIPageControl(frame: CGRect(x: 0, y: scrollView.frame.size.height + scrollView.frame.origin.y + 50, width: UIScreen.main.bounds.size.width, height: 50)) 14 15 scrollView.delegate = self 16 17 scrollView.backgroundColor = .blue 18 scrollView.contentSize = CGSize(width: UIScreen.main.bounds.size.width * 3, height: 200) 19 20 pageControl.numberOfPages = 3 21 pageControl.backgroundColor = .brown 22 23 self.view.addSubview(scrollView) 24 self.view.addSubview(pageControl) 25 26 for i in 0 ..< 3 { 27 let sampleView = UIView(frame: CGRect(x: 0 + (CGFloat(i) * UIScreen.main.bounds.size.width) , y: 0, width: UIScreen.main.bounds.size.width, height: 200)) 28 sampleView.backgroundColor = color[i] 29 scrollView.addSubview(sampleView) 30 } 31 } 32 33 func scrollViewDidScroll(_ scrollView: UIScrollView){ 34 35 let pageWidth = UIScreen.main.bounds.size.width 36 let current = floor((scrollView.contentOffset.x - pageWidth/3)/pageWidth) + 1; 37 pageControl.currentPage = Int(current) 38 } 39}

シュミレーターでは一番右から固定されて動きません。これはなぜ

これに関しては最初に表示した時のみ動く箇所"viewDidLoad"でforの最後"pageControl1.currentPage = 2"が当てはめられているだけだからという感じですね、、

投稿2020/09/20 12:53

編集2020/09/20 13:00
sachiko-kame

総合スコア334

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomichi

2020/09/20 13:31

そのようにしたら動きました! ありがとうございました!!
sachiko-kame

2020/09/20 13:43

よかったです!!(✿´ ꒳ ` )
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問