2015年10月9日金曜日

NavigationBar非表示の左エッジスワイプ


UINavigationControllerは左端からのスワイプで前の画面に戻るが、NavigationBar非表示だと戻らなくなる。画面を覆っているViewがTouchイベントを吸収してしまうからのようです。

その場合は、そのViewにUIScreenEdgePanGestureRecognizerをセットして、自分で前の画面に戻してやればいい。
  • UIViewControllerにUIScreenEdgePanGestureRecognizerをドラッグ&ドロップで追加。
  • ViewからControl+ドラッグでUIScreenEdgePanGestureRecognizerをコネクト。
  • gestureRecognizersに追加する。

  • UIScreenEdgePanGestureRecognizerのプロパティーでLeftをチェック。

  • ViewのプロパティーでUser Interaction Enabledをチェック。

ソースコードの例
最低限の追加はUIScreenEdgePanGestureRecognizerのアクションを受けとるメソッド。
前の画面に戻るので、UIViewControllerに実装するのがよいでしょう。
- (IBAction)handleLeftEdgeGesture:(id)gesture
{
    [self.navigationController popViewControllerAnimated:YES];
}

これをIBでUIScreenEdgePanGestureRecognizerのアクションにセットする。

delegateメソッドは必須ではないが、必要な場合は<UIGestureRecognizerDelegate>をヘッダに追加し(これもなくても動いてしまうが)、適宜delegateメソッドを実装。

ステイタスバーを隠す場合は、UIViewControllerに次のメソッドを追加。
- (BOOL)prefersStatusBarHidden
{
    return YES;
}

NavigationBarを隠すにはUIViewControllerのviewDidLoadなどに次のメソッドを追加。
    [self.navigationController setNavigationBarHidden:YES];

これを行ったあとは前の画面に戻ったときもNavigationBarが隠れたままになるので、そちらでsetNavigationBarHidden:NOに戻す。

ちなみに、UINavigationControllerの左端からのスワイプ動作が都合の悪い時は、次のメソッドで無効にできる。

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}

2015年10月1日木曜日

SDメモリにコピーしたXcodeが起動できない

MacBook Air 128Gの残り容量が少なくなり、Xcodeをアップデートするときに以前のバージョンを残しておくスペースがない。そこで、SDメモリにコピーしておいて、そこからも起動可能にしておこうと、試してみました。

すると、こんなエラーが発生。
Xcode is running from a volume that does not support ownership. Please move Xcode to one that does.

ちなみにUSBメモリではこのエラーは発生しませんでした。

Finderで当該SDを選択 => 情報を見る
ダイアログの下の方の鍵を外し、「このボリューム上の所有権を無視」のチェックを外す。
こんなコマンドでも良いようです。
sudo diskutil enableOwnership /dev/disk0s2

再度起動を試すと別のエラーが発生。
/Volumes/...../Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/dyld_sim is not owned by root.

ターミナルで次のコマンドを実行。

ls -la /Volumes/

目的のXcodeのフォルダを探し、次のコマンドを実行。
sudo chown -R -v root xcpde-app-path

これで起動できるようになりました。ヘビーな使い方は無理でしょうが、以前はどうだったかな?と思ったときには役立つでしょう。

参考: