読者です 読者をやめる 読者になる 読者になる

ObjecTips

基本Objective-Cで iOS とか OS X とか

フォトライブラリへの動画保存メソッド まとめ

PHAssetChangeRequest.h (iOS 8以降) + (instancetype)creationRequestForAssetFromVideoAtFileURL:(NSURL *)fileURL; PHPhotoLibrary の performChanges:completionHandler: または performChangesAndWait:error: メソッドと組み合わせて使用する。 ALAsset…

フォトライブラリへの画像保存メソッド まとめ

PHAssetChangeRequest.h (iOS 8以降) + (instancetype)creationRequestForAssetFromImage:(UIImage *)image; + (instancetype)creationRequestForAssetFromImageAtFileURL:(NSURL *)fileURL; PHPhotoLibrary の performChanges:completionHandler: または pe…

iOS 8での位置情報のプライバシーアクセス

iOS 7では CLLocationManager を用いて位置情報を利用する際に自動的にシステムのアラートが表示される。 CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; self.locationManager = locat…

指紋認証APIの iOS 8.3 での変更点

iOS 8.2 から iOS 8.3 で Touch ID を使った指紋認証APIに微妙な変更があった。 フォールバックボタンの表示 まず iOS 8.2 で以下のコードを呼び出す LAContext *context = [[LAContext alloc] init]; [context evaluatePolicy:LAPolicyDeviceOwnerAuthentic…

NSViewController の viewWillAppear メソッド

OS X v10.10 の NSViewController に iOS の UIViewController と同じような以下のメソッドが追加された。 - (void)viewWillAppear NS_AVAILABLE_MAC(10_10); - (void)viewDidAppear NS_AVAILABLE_MAC(10_10); - (void)viewWillDisappear NS_AVAILABLE_MAC(1…

NSPredicate で UTI を扱う

NSPredicate の predicateWithFormat: のフォーマット内で UTI-CONFORMS-TO という評価式が使える。 これは UTTypeConformsTo() ファンクションと同じロジックで UTI を判定に用いる事ができて、例えばファイル情報のリストに対して UTI-CONFORMS-TO で kUTT…

NSPredicate で正規表現

NSPredicate と正規表現の組み合わせはちょっとややこしい。 例えば、正規表現で数字列を検出する場合 \d+ を用いる。 NSString でこの文字列を扱う場合 \ がエスケープ文字なので、これをこのまま NSString に入れると Unknown escape sequence '\d' という…

NSPredicate でワイルドカード

predicateWithFormat: でワイルドカードを使う事ができる。 1つ目はの a*e は先頭の文字が a で間に何文字か挟んで(0文字でもOK)末尾の文字が e の文字列が条件に合致する。 2つ目の a??le は先頭の文字が a で間に2文字挟んで末尾の文字が le の文字列が…

Xcode 6 での Storyboard の画像設定の不具合

Xcode 6.3 で検証 xcassets で Render As Template Image に設定したテンプレート画像を Storyboard 上で UIButton に設定してビルドした時に、iOS 8 だと正しく tintColor が反映されるけど iOS 7 だと tintColor が設定されないという問題がある。たぶん不…

iPhone 本体の音量

本体のハードウェアキーで設定可能な volume 値を調べてみた。 コードは以下 NSLog(@"%f", [MPMusicPlayerController systemMusicPlayer].volume); iOS 8ではdeprecated だけど warning を無視してビルドして確認。 結果は以下 *iOS 8.3 0.000000 0.062500 0…

iPhone 本体の音量を変更する その2

iPhone 本体の音量を変更する - ObjecTipskoze.hatenablog.jp 前回は結局 Private API を使うとできるという話になってしまったので今回は正攻法で。 MPVolumeView を使う。 UIが提供されるのみで programmatically に設定はできない。 UIはこんな感じ。 分…

iPhone 本体の音量を変更する

iPhone 本体の音量を変更するには MPVolumeView と MPMusicPlayerController クラスを使う。 MPMusicPlayerController には アプリ内の音楽再生周りを制御するインスタンスを呼び出す + (MPMusicPlayerController *)applicationMusicPlayer; システムの音楽…

UIKit の Private な UIGestureRecognizer その4

UIKit の Private な UIGestureRecognizer その3 - ObjecTipskoze.hatenablog.jp 前回の記事で実装した LogGesture() 関数を用いてシステムが自動的に - (void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer で設定するジェスチャの中身を…

メソッド置換

Runtime API に method_exchangeImplementations というメソッド置換を行う関数がある。 メソッド交換、メソッド置き換え、メソッド入れ替えなどとも呼ばれる。 実装は簡単 objc/runtime.h をimportして Class cls; Method m1 = class_getInstanceMethod(cls…

UIKit の Private な UIGestureRecognizer その3

前回の続き id object = [[gestureRecognizer valueForKey:@"targets"] firstObject]; で取り出した Private な UIGestureRecognizerTarget クラスから target と action を取り出す。 target は KVO で取得できる。 id target = [object valueForKey:@"targ…

UIKit の Private な UIGestureRecognizer その2

NSLog(@"%@", gestureRecognizer); の出力結果って見辛いよねって事で、いい感じに調査をするために調査用のログ出力を試みてみる。 通常のログ出力 <UITextTapRecognizer: 0x7ff853734850; state = Possible; delaysTouchesEnded = NO; view = <MyTextField 0x7ff853725f30>; target= <(action=oneFingerTripleTap:, target=<UITextInteractionAssistant 0x7ff853724d50>)>; num…</uitextinteractionassistant></uitexttaprecognizer:>

クラス階層を調べる

Private なクラスに出会った時に、そのクラスの superClass がさらに Private だったりする事がある。 その時にさらに superClass に遡って、、とやるのも面倒なので一気にクラス階層を出力できるようにする。 実装方法は以下の記事と同じく Private なメソ…

Private なメソッド、プロパティ、インスタンス変数を調べる

クラスの Private なメソッド、プロパティ、インスタンス変数を調べるには Objective-C の Runtime API を使う。 メソッドは Method, プロパティは objc_property_t, インスタンス変数は Ivar 型で取得できる。 #import <objc/runtime.h> で Runtime API を import してそれ</objc/runtime.h>…

UIKit の Private な UIGestureRecognizer

UITextField の長押し時の挙動をカスタマイズする必要があって調べてみたらいろいろと面白かった。 調べた方法は以下 UITextField のサブクラスを作って UIView の - (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer NS_AVAILABLE_IOS(…

NSString が数字のみで構成されているかを判定する

暗証番号とかパスコードの入力画面を作る際に数字だけの入力を許可したい場合がある。 文字列の入力制限は UITextFieldDelegate のメソッド - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(N…

functionで NSAssert を使う

NSAssert をfunction内で使おうとすると Use of undeclared identifier '_cmd'; did you mean 'rcmd'? Use of undeclared identifier 'self' という2つのエラーが起きる。 function内で使える NSCAssert というマクロがあるのでそちらを使う。