SwiftからObjective-Cのライブラリを使って、初回起動時にアプリ説明を表示する方法

iPhoneアプリを作るときですが、要件にあえばライブラリを使いたいものです。

しかし、Objective-Cのライブラリ沢山あるのですが、Swiftに対応したライブラリはそこまでありません。

当然ですが、歴史が違いますからね。

 

しかし、Objective-Cのライブラリを指をくわえて見てるのも悔しいのです。

ということで、Objective-CのライブラリをSwiftで使う方法です。


Objective-CのライブラリをSwiftで使う方法

今回は、ウォークスルー(Walk Through)のUIが実装できるライブラリ・EAIntroViewを使ってみます。

ウォークスルーとは、初めてアプリを立ち上げたときに、アプリ説明を表示されるアレです。

EAIntroView – github
ealeksandrov/EAIntroView 

 

まず、EAIntroViewのファイルを手に入れます。先程のGithubのリポジトリからダウンロードします。

ダウンロードしたら、「EAIntroView」ディレクトリの中にある、次の4つのファイルを確認してください。

EAIntroView/EAIntroPage.h
EAIntroView/EAIntroPage.m
EAIntroView/EAIntroView.h
EAIntroView/EAIntroView.m

 

プロジェクトを立ち上げる

Xcodeを立ち上げて、プロジェクトを開きます。今回は練習用にサンプルのプロジェクトを作ります。

 

「File > New > Project」 から「Single View Application」で、適当なプロジェクトを作ります。ここでは、「Sample」という名称にしています。

2015-02-12 17.40.21

 

ライブラリを追加する

次に、このプロジェクトに先程、ダウンロードした「EAIntroView」のファイルを追加します。

プロジェクトフォルダで右クリックで「Add Files to “プロジェクト名”」を選択します。

2015-02-12 17.42.37

 

先程、確認した「EAIntroView」ディレクトリを選択して、「EAIntroPage.h」などの4つのファイルをまとめてプロジェクトに追加します。

2015-02-12 17.46.27

 

xxxx-Bridging-Header.h ファイルを作る

SwiftでObjective-Cのライブラリを読み込むためには、Bridging-Headerを利用します。

プロジェクト内に「${ProductModuleName}-Bridging-Header.h」のファイル名でヘッダーファイルを作成します。

${ProductModuleName}の箇所は、任意の名前でも大丈夫なのですが、プログクト名が良いようです。今は、Sampleプロジェクトなので、

ここでは、「Sample-Bridging-Header.h」にします。

 

プロジェクトの箇所で、右クリックして「New File」を選択します。ここから「Header File」を選びます。

2015-02-12 17.51.44

 

そのまま「Sample-Bridging-Header.h」のファイルを作成します。

2015-02-12 18.03.05

 

作成した「Sample-Bridging-Header.h」の中身は次のようになっています。

//
// Sample-Bridging-Header.h
// Sample
//
// Created by kanakogi on 2015/02/12.
// Copyright (c) 2015年 FlipClap Inc. All rights reserved.
//

#ifndef Sample_Sample_Bridging_Header_h
#define Sample_Sample_Bridging_Header_h

#endif

 

これを次のようにして、さっき追加したライブラリファイルの中から、ヘッダーファイルを読み込みます。

//
// Sample-Bridging-Header.h
// Sample
//
// Created by kanakogi on 2015/02/12.
// Copyright (c) 2015年 FlipClap Inc. All rights reserved.
//

#ifndef Sample_Sample_Bridging_Header_h
#define Sample_Sample_Bridging_Header_h

#import "EAIntroView.h"
#import "EAIntroPage.h"

#endif

 

Bridging-Headerを設定する

準備はもう少し続きます。プロジェクトを選択して、「Build Settings」の中の「Swift Compiler」>「Objective-C Bridging Header」の右側でダブルクリックするとポップアップが開きます。

ここに先程作った「Sample-Bridging-Header.h」へのパスを入力します。次のように入力します。

$(SRCROOT)/$(PROJECT)/Sample-Bridging-Header.h

2015-02-12 18.10.05

 

これでライブラリを使う準備ができました。


 SwiftからObjective-Cのライブラリを使う

ここからライブラリを使うためのコードを書きます。

Objective-Cのライブラリなので、当然ながらSwiftのサンプルはありません。

つまり、Objective-CのコードをSwiftに書き直す必要があります…orz

 

ウォークスルーを表示するためのメソッドは、Objective-Cだと次のような感じです。

- (void)showIntroWithCrossDissolve {
    EAIntroPage *page1 = [EAIntroPage page];
    page1.title = @"Hello world";
    page1.desc = @"Lorem ipsum dolor sit amet";
    page1.bgImage = [UIImage imageNamed:@"bg1"];
     
    EAIntroPage *page2 = [EAIntroPage page];
    page2.title = @"Hello world 2";
    page2.desc = @"Lorem ipsum dolor sit amet 2"; 
    page2.bgImage = [UIImage imageNamed:@"bg2"];
     
    EAIntroView *intro = [[EAIntroView alloc] initWithFrame:rootView.bounds andPages:@[page1,page2]];
    [intro setDelegate:self];

    [intro showInView:rootView animateDuration:0.3];
}

 

これをSwiftに置き換える必要があります。そりゃそうか…。Objective-Cか…。

ということで、さっきのコード相当をSwiftで記述すると、次のようになります。これを「ViewController.swift」に記述します。

    func showIntroWithCrossDissolve(){
        var page1 : EAIntroPage = EAIntroPage()
        page1.title = "Hello world"
        page1.desc = "Lorem ipsum dolor sit amet"
        page1.bgImage = UIImage(named:"1.png")
        
        var page2 : EAIntroPage = EAIntroPage()
        page2.title = "Hello world 2"
        page2.desc = "Lorem ipsum dolor sit amet 2"
        page2.bgImage = UIImage(named:"2.png")
        
        var intro : EAIntroView = EAIntroView(frame: self.view.bounds, andPages:[page1,page2])
        intro.delegate = self
        intro.showInView(self.view, animateDuration:0.0)
    }

 

とりあえず、アプリを立ち上げた時に、このウォークスルーが表示するようにします。viewDidLoadに「self.showIntroWithCrossDissolve()」を追加します。また、ViewControllerクラスにも「EAIntroDelegate」を追加します。

これで「ViewController.swift」は、次のようになりました。

//
//  ViewController.swift
//  Sample
//
//  Created by kanakogi on 2015/02/12.
//  Copyright (c) 2015年 FlipClap Inc. All rights reserved.
//

import UIKit

class ViewController: UIViewController, EAIntroDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.showIntroWithCrossDissolve()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func showIntroWithCrossDissolve(){
        var page1 : EAIntroPage = EAIntroPage()
        page1.title = "Hello world"
        page1.desc = "Lorem ipsum dolor sit amet"
        page1.bgImage = UIImage(named:"1.png")
        
        var page2 : EAIntroPage = EAIntroPage()
        page2.title = "Hello world 2"
        page2.desc = "Lorem ipsum dolor sit amet 2"
        page2.bgImage = UIImage(named:"2.png")
        
        var intro : EAIntroView = EAIntroView(frame: self.view.bounds, andPages:[page1,page2])
        intro.delegate = self
        intro.showInView(self.view, animateDuration:0.0)
    }
}

 

UIImageで画像を指定しているので、プロジェクトに画像を追加しておいてください。プロジェクトツリーに画像をドラッグすると追加できます。

 

そして、これで実行すると次のように、「EAIntroView」を実行することができました!できたー!

2015-02-12 18.36.01


こんな風にObjective-CのライブラリもSwiftで使うことができます。

 

…と書き終えるつもりが、実行したらエラーが表示されました。

以前はこれでOKだったんですが、ここ数日にライブラリに修正があったようです。

エラーを見ると「EAIntroView.h」に、「EARestrictedScrollView/EARestrictedScrollView.h」を読み込もうとする記述が増えたようです。OKあせる時間じゃない。

2015-02-12 18.38.45

 

はじめの方で、Githubリポジトリから手に入れたファイル一式の中に「EARestrictedScrollView.h」がありました。プロジェクトに、次の2つのファイルを追加します。

Example/Pods/EARestrictedScrollView/EARestrictedScrollView/EARestrictedScrollView.h
Example/Pods/EARestrictedScrollView/EARestrictedScrollView/EARestrictedScrollView.m

 

次に「EAIntroView.h」の頭にある次の記述を…

//
//  EAIntroView.h
//
//  Copyright (c) 2013-2015 Evgeny Aleksandrov. License: MIT.

#import <UIKit/UIKit.h>
#import <EARestrictedScrollView/EARestrictedScrollView.h>
#import "EAIntroPage.h"

#define EA_EMPTY_PROPERTY 9999.f

 

「EARestrictedScrollView.h」を読み込むように修正します。

//
//  EAIntroView.h
//
//  Copyright (c) 2013-2015 Evgeny Aleksandrov. License: MIT.

#import <UIKit/UIKit.h>
#import "EARestrictedScrollView.h"
#import "EAIntroPage.h"

#define EA_EMPTY_PROPERTY 9999.f

2015-02-12 18.45.05

 

これで実行!エラーでない!できたー!

2015-02-12 18.36.01


という感じで、今度こそ出来ました!

やってて思ったけど、もしかしてライブラリがSwiftに対応するのを待った方が早いかも…

 

参考サイト:

【iOS】BridgingHeaderの使い方と設定方法 | AdMax Tech Blog

[iOS] iPhoneアプリの初回起動時に表示したい「おもてなし」ライブラリ4選 | アドカレ2013 : SP #10 | Developers.IO

この記事を書いた人:

ナカシマ

北区赤羽在住のWEBデザイナー兼エンジニア。インターネット、WordPress、本・漫画、音楽が大好き。妻と猫と暮らすアップル信者。

BLOG: 着ぐるみ追い剥ぎペンギン