姑プログラマの技術日記

作ったものをえらそーに解説したら幸せになれるかな

PICOLのこだわり。チュートリアルページ

PICOLというアプリのiOSアプリを担当させていただいて作りました。

公式ページ

PICOLは、バーコードを使って査定する買い取りアプリなのですが、もともとのコンセプトが

「ゲームっぽさ」

を目指しているのもあり、よくある標準UIKitのタブビューやナビゲーションバーを使わないデザインで画面デザインが上がってきました。

PICOLのホーム画面 f:id:naochi_2012:20180618135124p:plain:w180

チュートリアルもHOME画面ににたデザインで仕上がってきたので、作ったチュートリアルはこんなかんじ。

どこがこだわりなんだ。普通じゃない?ものすごく普通じゃない?って思ったアナタ。

普通はこっちです。

ね。こっちでも全然大丈夫じゃないですか。チュートリアルなんか1回しか見ないものだし、そこに力入れるのも。。って感じもするし。

でも、やだったんです。ページコントロール(画面下のページ番号が点々ででてるやつ)が一緒に横にスクロールしちゃったりするの。

そうなると画面の上下の赤い雲もヘッダとフッタな訳で。これも動いちゃやだなって思いました。ああ、そうなると黒いページ番号も固定したいじゃないかーって、さらに思ってしまいました。

社長がイケメンだしチュートリアルから気持ちいいものを使ってもらいたいですしね。

では、どうやって実装したのか図解します。

まず、チュートリアルは横スワイプでページを切り替えるだけの機能なのでUIPageViewControllerを使用しました。UIScrollViewかどちらかなのかなって思います。

f:id:naochi_2012:20180618161120p:plain:w400

横にスワイプして表示されるチュートリアルのそれぞれのページは、UIPageViewControllerDelegateのメソッドで、今表示するページを指定すて返すような仕組みになっています。表示はこれにお任せです。

 func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
}
 func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
}

f:id:naochi_2012:20180618161130p:plain:w400

そして、ヘッダ、フッタと、ページコントロールを持つ、固定したいビューをUIViewとして別のnibに作り初期化したら最初のUIPageViewControllerのviewDidLoadで

        self.view.addSubview(tutorialHeaderView)

とやるだけ。 そうすると固定されたヘッダビューの出来上がりとなります。

f:id:naochi_2012:20180618161140p:plain:w400]

ただし。これだけだと上にヘッダのビューを重ねているので、ページをスワイプ するときのタッチイベントがヘッダビューに取られてしまうので、ヘッダビューのクラスに hittestをつけて、nibからイベントを下のビューに逃したいViewに適当なtagをつけておきます。 そうするとスワイプ のイベントも効くようになります。

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let view = super.hitTest(point, with: event)
        //真ん中のviewに触られたら下のviewにタッチイベントを透過したい
        if view?.tag == 111 {
            return nil
        }
        return view
    }
    

サンプルコード、時間できたらあげると思う。