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

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

ただいまの
回答率

90.53%

  • Swift 2

    1337questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

【swift】ボタンを押すと横スクロールするようにしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 3,045

nyancoro

score 73

初回チュートリアルのような横スクロールする画面を作っています。
ボタンを押すと横に1ページ分スクロールするように実装したいのですが、やり方がわかりません。

コードは以下になります。
ボタンのアクションにどう書けばいいのでしょうか、教えて頂けると幸いです。
よろしくお願いいたしますm(__)m

class TutorialViewController: UIViewController, UIScrollViewDelegate {

    private var scrollView: UIScrollView!
    private var pageControll: UIPageControl!
    private let pageNum = 4
    private let pageColors = [1:"画像1.jpg",2:"画像2.jpg", 3:"画像3.jpg",4:"画像4.jpg]

    override func viewDidLoad() {
        super.viewDidLoad()
        self.scrollView = UIScrollView(frame: self.view.bounds)
        self.scrollView.contentSize = CGSizeMake(self.view.bounds.width * CGFloat(pageNum), self.view.bounds.height)
        self.scrollView.pagingEnabled = true
        self.scrollView.showsHorizontalScrollIndicator = false
        self.scrollView.delegate = self;
        self.view.addSubview(self.scrollView)

        self.pageControll = UIPageControl(frame: CGRectMake(0, self.view.bounds.height-50, self.view.bounds.width, 50))
        self.pageControll.numberOfPages = pageNum
        self.pageControll.currentPage = 0
        self.view.addSubview(self.pageControll)

        for p in 1...pageNum {
            let v = UIImageView(frame: CGRectMake(self.view.bounds.width * CGFloat(p-1), 0, self.view.bounds.width, self.view.bounds.height))
            v.image = UIImage(named:pageColors[p]!)
            self.scrollView.addSubview(v)
        }
        createNextButton()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    private func createNextButton() {
        let myButton:UIButton = UIButton()
        myButton.frame = CGRectMake(0,0,200,40)
        myButton.backgroundColor = UIColor.orangeColor()
        myButton.layer.masksToBounds = true
        myButton.setTitle("次へ", forState: UIControlState.Normal)
        myButton.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
        myButton.layer.position = CGPoint(x: view.bounds.width/2, y:view.bounds.height-70)
        myButton.addTarget(self, action: "onClickNextButton:", forControlEvents: .TouchUpInside)
        self.scrollView.addSubview(myButton)
    }

    func onClickNextButton(sender: UIButton) {
        //TODO:2ページ目を表示させる処理
    }

    func scrollViewDidScroll(scrollView: UIScrollView) {
        let pageProgress = Double(scrollView.contentOffset.x / scrollView.bounds.width)
        self.pageControll.currentPage = Int(round(pageProgress))
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

このような関数でページをスクロールできますよ。

func scrollToPage(page: Int, animated: Bool) {
        var frame: CGRect = self.scrollView.bounds
        frame.origin.x = frame.size.width * CGFloat(page);
        frame.origin.y = 0;
        self.scrollView.scrollRectToVisible(frame, animated: animated)
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/23 09:32

    ありがとうございます!m(__)m
    おかげさまで狙い通りに動きました!
    使いまわしやすかったのでベストアンサーにさせて頂きました。

    キャンセル

0

シンプルに書くなら以下の感じでしょうか(アニメーション付き)

※myButtonをself.viewに乗せると2,3,4ページと遷移します。
self.view.addSubview(myButton)

func onClickNextButton(sender: UIButton) {
    //TODO:2 → 3 → 4ページ目を表示させる処理

    let pointX = scrollView.contentOffset.x
    UIView.animateWithDuration(0.3, animations: { () -> Void in

        self.scrollView.contentOffset = CGPointMake(pointX + self.view.frame.size.width, 0)
        }) { (finish) -> Void in
            // アニメーション後の処理
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/12/23 09:33

    ご回答ありがとうございましたm(__)m!

    キャンセル

同じタグがついた質問を見る

  • Swift 2

    1337questions

    Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。