CoreData: Documentsフォルダ以外にsqliteファイルを置く


iTunesのAppタブにあるファイル共有を使う場合、アプリのDocumentsフォルダがその共有対象になる。ところが CoreDataを使っている場合、そのデータベースファイルもデフォルトではDocumentsフォルダに生成されるので、これがiTunesから見えてしまうという問題がある。CoreDataのファイルを別の場所に置く方法について調べたので以下にまとめておく。
続きを読む

iOS6におけるAutorotationのロックとUpside-downのこと【update】


iOS6では、Autorotationの設定をプロジェクトで(plistで)全方向対応にしても、Upside-downができないということが起こった。理由は UINavigationControllerを使っていたためで、UINavigationController自体がUpside-downができないコントロールになっているからだった。
対処方法は以下を参照

Rotation behaving differently on iOS6

つまり、UINavigationControllerのサブクラスを作り、この中にUIInterfaceOrientationMaskAll を返す supportedInterfaceOrientations を追加して、このサブクラスを使うようにする。

さて、iOS6では Autorotation の管理方法が変わった。今まで使っていた、
– (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
は使えなくなった。

僕は、今まで自動回転をロックする方法として、この中でロックしたい方向の interfaceOrientation のときだけ YES を返すようにプログラムしていたが、これが使えなくなった。

代わりに新しい
-(NSUInteger)supportedInterfaceOrientations
が使えるかと期待したのだが、これはどうもコントローラがロードされたかビューが表示されたときにしか呼び出されないようだ。前述のshouldAutorotateToInterfaceOrientation のように回転のたびに呼び出されるものではない。

それで、(実は正しいかどうか自信はないのだが) AppDelegateにiOS6で新しくできた、
– (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
を使うことにした。これであれば回転する毎に呼び出される。コントローラからAppDelegateにロックの状態を示す値を渡さなければならないけれど、その値を元に返す UIInterfaceOrientationMask を変えてやることでとりあえず回転ロックの対応ができた。

でも、なにか少し危険な感じはする。他にもっといい方法があるかもしれない。また分かったらメモします。

【追加訂正】2013/01/01 15:17
この記事に
「-(NSUInteger)supportedInterfaceOrientations
はコントローラがロードされたかビューが表示されたときにしか呼び出されないようだ。」と書いたが、これは間違いだった。
同じ記事内にUpside-downに対応するために UINavigationControllerのサブクラスを作り、この中でsupportedInterfaceOrientations が UIInterfaceOrientationMaskAll を返すようにしていたが、これを実際には、

- (NSUInteger)supportedInterfaceOrientations {
    return [self.topViewController supportedInterfaceOrientations];
}

とすべきでした。こうすれば回転したとき表示中のコントローラでもsupportedInterfaceOrientationsが呼び出されるようになる。この時マスクを制御すれば画面の回転ロックは可能になります。