忍者ブログ
  • 2024.10«
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • » 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/21 18:22 】 |
Objective-C TimeZoneを指定して世界の時刻を表示する。
この夏に海外に行くので、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
【2013/07/01 02:28 】 | Objective-C | 有り難いご意見(0)
キー値監視、KVO(Key Value Observing)
キー値監視、KVOについて。言葉だけ。
オブジェクトのプロパティが変更されたときに通知してくれるメソッド。



噛み砕いて説明すると

・電車の遅延とそのお知らせの関係

電車の遅延は駅に行かないと分からない。でも事前に「電車が遅延したときにお知らせが来るサービス」を登録しておく。

いざ遅延した時お知らせが来るので自宅に居たままで遅延が分かるのでその後の対処が出来る。

これがザックリとした説明。ここからややプログラム的に同じ文章で説明。

電車(監視したいプロパティをもつインスタンスオブジェクト)
遅延(運行プロパティの種類の1つ他に平常通りや運休などある)
電車が遅延したときにお知らせしてくれるサービス (運行プロパティが遅延の場合にコールされるメソッド)

電車(オブジェクト)の遅延(運行プロパティの状態。他に平常や運休がある)は駅に行かないと分からない。でも事前に「電車(オブジェクト)が遅延したとき(運行プロパティが遅延になったとき)にお知らせがくるサービス(コールバック)」を登録(設定)しておく。

いざ遅延したとき(運行プロパティが遅延になったとき)お知らせが来るので(コールバックされるので)自宅に居たままで遅延が分かるのでその後の対処(処理)が出来る。

かえってややこしいだろうか?



【2013/06/29 10:46 】 | Objective-C | 有り難いご意見(0)
Google Maps SDK for iOS 1.3.x その3
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




【2013/06/16 21:23 】 | Objective-C | 有り難いご意見(0)
Google Maps SDK for iOS その2実装編
準備できたので実装編

参考はやはり本家

本家リンク→

GitHub→

公式通りなのにシミュレータ初回起動時にエラーで落ちる。2回目から落ちない。なんでだろう?
【2013/06/16 10:00 】 | Objective-C | 有り難いご意見(0)
Google Maps SDK for iOS その1
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.frameworkXcodeProject 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関連でどこが間違ってるか分からなくなる。

あとはサンプルをみつつ簡単な物作ってみます。
【2013/06/15 09:28 】 | Objective-C | 有り難いご意見(0)
前ページ | ホーム | 次ページ

忍者ブログ [PR]