× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
この夏に海外に行くので、2つの都市の時刻を表示するアプリを作った。
アナログ時計は針の動きを実装するのに手間がかかる割には対して感動がないのでデジタルで作りました。 iPhoneの時間について。 ・システムに設定されているタイムゾーン以外のゾーンの時刻の取得方法はない。 通常必要とされるのは「現在地の正確な時刻」特別その他のタイムゾーンの現在時刻データを直接的に 取得する方法はない。 ・NSDateのインスタンスオブジェクトそのものにはUTC時刻のデータが入っている NSDateFormatterクラスでNSDateオブジェクトを文字列にする時にゾーンの設定を行っている。 デフォルトの設定はシステムで設定しているタイムゾーン。 NSDate *date = [NSDate date]; NSLog(@"%@",[date description]); を試してみると分かります。 つまりString型だけで扱うだけならNSDateFormatterクラスで設定するのが手っ取り早い。 設定メソッドとサンプル NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PST"]]; [formatter setDateFormat:@"dd a HH:mm"]; NSString *currentTime = [formatter stringFromDate:date]; NSLog(@"%@",currentTime) この@"PST"とはタイムゾーンの略記でJST(日本)GMT(イギリス)など色々ある。 またサマータイムへの自動変換が行われる。 PSTの地域はサマータイムを導入しているため夏期の期間はPDTに自動的に変更される。 [formatter setDateFormat:@"zzz"]; と変更するとPSTと表示されるはずだが今はサマータイムなのでPDT(サマータイム)と表示される。 各世界の都市とそのタイムゾーン(略記)は以下のコードでLogで見られる。 // 略記と代表的な都市名 NSLog(@"timezones: %@", [NSTimeZone abbreviationDictionary]); // 都市 for (NSString *name in [timezoneNames sortedArrayUsingSelector:@selector(compare:)]) { NSLog(@"%@",name); } PR |
Google Maps SDK for iOS
とりあえず、実装できたので少しずついじっています。 そしてつまった。 いろいろクラスが用意されているのは分かりました。 しかし一番の疑問は、UIKitとの同時表示は出来ないのだろうか? 例えばAndroidのように画面の下半分はMapで上半分にTextViewというような。 とある。 注目したいのが Create or update a ViewController. If the map will be displayed when this view controller becomes visible, be sure to create it within the loadView method. "ViewControllerがVisibleになるときにmapを表示させたいならloadViewメソッドに書いてください" loadViewっていつどこから呼ばれてるんだろうか? ちょっと分からなかったので「とりあえずタイミングだけでも分かれば手がかりがあるかもしれない」とおもってNSLogをViewDidLoadとこの"loadView"に突っ込んでみた結果がこちら。 viewDidLoadより早い! ライフサイクルのなかにある普段オーバーライドしてないメソッドなんだろうと気がつく。 Androidのライフサイクルのように、iOSのライフサイクルはまだ勉強してない。 授業でも全くやってない気がする。viewDidLoadが一番最初って思ってた。 iOSのアプリのライフサイクル このAPIではAPIKeyの設定を上記図の中央:UIApplicationDelegate上から4番目で行う。 ViewController起動時にMapを表示する際は、UIオブジェクトを設定するのはUIViewControllerで一番最初に動くメソッドなければならないのでloadViewで動的にセットする。ということになるようだ。 ・GMSMapViewの上にButton等を設定したい場合はviewDidLoadで動的に設定する。 上記のことから、もしUIKitのオブジェクトをマップの上にセットしたい場合は、loadViewでMapを設定したのちライフサイクルで次に呼ばれるviewDidLoadで動的に設定すれば可能ではないかと試してみた。 できました。 ほかのUIKitのアイテムに関しても可能だと思います。 レイヤーをうまく使えば、下半分を別UIを配置して上半分は地図等も可能かと思います。 地図自体の範囲をいじれるかも挑戦してみたいと思います。 サンプル GitHub |
|
Androidの方はなんとなく分かったので今度はiOS
参考は本家のみ。 https://developers.google.com/maps/documentation/ios/start 事前に用意するもの ・Googleアカウント ・GoogleMapAPIを利用したいプロジェクトの作成or用意 ・SDKのダウンロード ここでダウンロード https://developers.google.com/maps/documentation/ios/start 場所はどこでもOK ・SDKを有効にする作業 ①GoogleAPIsConsoleにアクセス ②左側にあるリストの中からServicesを選択 ③APIリストの"Google Maps SDK for iOS"をONにする。使用許諾の確認がでるので同意する。 ④左側にあるリストのなかからAPIAccessを選択 ⑤画面下部にあるCreate new iOS Keyをクリック ⑥導入したいプロジェクトのBundle Identifierを入力してCreateをクリック ⑦新しいAPIKeyが生成される。Androidなど別のものと同じリストの中になる。 ・プロジェクト側(ややこしい操作あり) Xcodeは起動しておき、この状態にしておく ①ダウンロードしたSDK "GoogleMaps-iOS-1.x.x"を解凍 ②ここから注意! 解凍したファイル内のGoogleMaps.frameworkをXcodeのProject Navigator内の自プロジェクトのFrameworksにドラック&ドロップ この時"Copy items into destination groups folder (if needed)にチェックをいれる。 ③さっきの②でXcodeにインポートしたGoogleMaps.frameworkを右クリックしShow In Finderを選択 ④GoogleMaps.Framework内ResourcesGoogleMaps.bundleを選択しXcodeのProject Navigator内のFrameworksにドラッグ&ドロップ この時"Copy items into destination groups folder (if needed)にチェックをいれない。(今度入れない) 山場終了 ⑤次に必要なFrameworkをBuild facesで設定。 沢山あるのでSS参照 ⑥APIKeyの設定 AppDelegate.hにインポートの記述 #import AppDelegate.mの(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptionsメソッドに[GMSServices provideAPIKey:@"取得したAPIkey"];を記入 Build Settingsの変更 ① ArchitecturesのValid Architectureをデフォルトのarmv7 armv7sからarmv7のみに変更 ② LinkingのOther Linker Flagsに -ObjCを設定 設定はコレで終了。 GoogleMapのAPIを導入するところの操作がややこしい。さらにBuildSettings関連でどこが間違ってるか分からなくなる。 あとはサンプルをみつつ簡単な物作ってみます。 |
忍者ブログ [PR] |