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」という名称にしています。
ライブラリを追加する
次に、このプロジェクトに先程、ダウンロードした「EAIntroView」のファイルを追加します。
プロジェクトフォルダで右クリックで「Add Files to “プロジェクト名”」を選択します。
先程、確認した「EAIntroView」ディレクトリを選択して、「EAIntroPage.h」などの4つのファイルをまとめてプロジェクトに追加します。
xxxx-Bridging-Header.h ファイルを作る
SwiftでObjective-Cのライブラリを読み込むためには、Bridging-Headerを利用します。
プロジェクト内に「${ProductModuleName}-Bridging-Header.h」のファイル名でヘッダーファイルを作成します。
${ProductModuleName}の箇所は、任意の名前でも大丈夫なのですが、プログクト名が良いようです。今は、Sampleプロジェクトなので、
ここでは、「Sample-Bridging-Header.h」にします。
プロジェクトの箇所で、右クリックして「New File」を選択します。ここから「Header File」を選びます。
そのまま「Sample-Bridging-Header.h」のファイルを作成します。
作成した「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
これでライブラリを使う準備ができました。
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」を実行することができました!できたー!
こんな風にObjective-CのライブラリもSwiftで使うことができます。
…と書き終えるつもりが、実行したらエラーが表示されました。
以前はこれでOKだったんですが、ここ数日にライブラリに修正があったようです。
エラーを見ると「EAIntroView.h」に、「EARestrictedScrollView/EARestrictedScrollView.h」を読み込もうとする記述が増えたようです。OKあせる時間じゃない。
はじめの方で、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
これで実行!エラーでない!できたー!
という感じで、今度こそ出来ました!
やってて思ったけど、もしかしてライブラリがSwiftに対応するのを待った方が早いかも…
参考サイト:
【iOS】BridgingHeaderの使い方と設定方法 | AdMax Tech Blog
[iOS] iPhoneアプリの初回起動時に表示したい「おもてなし」ライブラリ4選 | アドカレ2013 : SP #10 | Developers.IO