ObjecTips

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

Objective-C

AVAudioPlayer と AVPlayer の初期化時の注意点

AVAudioPlayer には NSURL で初期化を行う以下のメソッドがある。 - (instancetype)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError; AVPlayer にも NSURL で初期化を行う以下のメソッドがある。 + (id)playerWithURL:(NSURL *)URL; - (inst…

AVAudioRecorder deleteRecording でクラッシュ

AVAudioRecorder を生成後、録音を開始しないまま deleteRecording メソッドを呼ぶとクラッシュしたりエラーが出たりする。 以下のコードで試せる。 iOS 8.2, iOS 8.3 ではクラッシュ iOS 9.0 β ではコンソールに以下のエラーが出たがクラッシュはしなかった…

CITextFeature の iOS 9β4 での変更点

iOS 9で追加されたテキスト領域の矩形を検出できる CITextFeature に iOS 9 β4 で subFeatures というプロパティが追加された。 @property (readonly) NSArray *subFeatures; この subFeatures プロパティは検出した領域内に含まれる各文字の領域を示す CITe…

Photos.framework で自撮り(selfie)画像の一覧を取得する

iOS 9 β3で PHAssetCollectionSubtypeSmartAlbumSelfPortraits NS_AVAILABLE_IOS(9_0) = 210 が追加された。 以前紹介したスクリーンショット画像の一覧取得は Photos.framework でスクリーンショット画像の一覧を取得する - ObjecTips PHAssetMediaSubtype …

viewWillDisappear: では super をいつ呼ぶべきか

- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // some implements } と - (void)viewWillDisappear:(BOOL)animated { // some implements [super viewWillDisappear:animated]; } どちらが良いの?という議題 Appleのド…

UITableViewCell で Auto Layout + UITextView を使う際の Tips

iOS 8の self-sizing cell で自動で高さを調整してくれるように実装したところちょっと問題が。 まずセルのレイアウトは以下 上に UILabel, 下に UITextView を配置してラベルとテキストビューの間は0px ラベルとテキストビューそれぞれのセルの contentView…

UITableViewCell のメニューの表示位置をカスタマイズする

まず UITableView のセルのメニュー表示の実装方法はこちら UITableView のセル選択時にメニューを表示する - ObjecTips 前回の方法では UITableViewDelegate を使ってメニュー表示をする時と同じ標準的な位置にメニューが表示される。 セルへのメニューの表…

UITableViewCell 選択時にメニューを表示する

前回は UITableViewDelegate を使って簡単にメニュー表示をする方法について書いた。 UITableView のセルの Copy Paste メニューを表示する - ObjecTips この方法はセルを長押しした時にメニューを表示する事ができるが、セルをタップして選択したらすぐにメ…

UITableViewCell で Copy Paste メニューを表示する

UITableView にはセルの Copy Paste メニューを簡単に実装できる delegate メソッドが用意されている。 // Copy/Paste. All three methods must be implemented by the delegate. - (BOOL)tableView:(UITableView *)tableView shouldShowMenuForRowAtIndexPa…

デフォルトの EKCalendar について

デフォルトの EKSource iOS にはデフォルトで2つのデフォルトのソース EKSource が用意されている。 1つはローカルのカレンダー(iCloud同期を設定しない場合)。 もう1つは EventKit からはアクセスできない誕生日用のカレンダー。 このあたりの詳しい話は…

Photos.framework でスクリーンショット画像の一覧を取得する

iOS 9 β2で PHAssetMediaSubtypePhotoScreenshot NS_AVAILABLE_IOS(9_0) = (1UL << 2) が追加された。 これを使えば写真ライブラリからスクリーンショット画像のみを取得したり、逆にスクリーンショットを排除した画像一覧を取得する事ができる。 コードは以…

NSUserDefaults の変更通知を受け取る

NSUserDefaults には NSUserDefaultsDidChangeNotification という通知が用意されていて変更通知を受け取る事ができる。 この通知は userInfo が nil になっていて、何が変更されたのか変更の詳細を知る事ができない。 NSUserDefaults の何のキーが変更され…

dispatch_block_t

dispatch/object.h に以下のような定義がある。 typedef void (^dispatch_block_t)(void); 自前の実装の中で - (void)test { void (^blockName)(void) = ^{ }; } @interface MyObject : NSObject @property (nonatomic, copy) void (^blockName)(void); @end…

ARC で retain count を調べる

ARC環境では retain count を取得する retainCountメソッドと手動で retain release を行う retain release メソッドが使えなくなった。 でもいつどこでオブジェクトが保持され解放されているかオブジェクトの retain count を調査したい時がある。 そういう…

WebView の UserAgent を取得設定する iOS 9対応

UserAgent の取得 UIWebView では stringByEvaluatingJavaScriptFromString: メソッドで JavaScript を実行して UserAgent を取得できる。 iOS 8以降の WKWebView では evaluateJavaScript:completionHandler: メソッドで JavaScript を実行して UserAgent …

デフォルトの EKSource について その2

前回の記事で、デフォルトでは2つの EKSource が存在する事について書いた。 デフォルトの EKSource について - ObjecTips iCloud のアカウントを設定するとさらに EKSourceTypeCalDAV EKSourceTypeSubscribed の2つのソースが追加される。 一覧は以下 title…

リマインダーの優先順位 その2

少し前にリマインダーの priority プロパティについて書いた。 リマインダーの優先順位 - ObjecTips その後いろいろと調べていて OS X の方の EventKit/EKTypes.h を見ていたら以下のように priority の定数がしっかりと定義されていた。 typedef enum : NSU…

アプリ全体を Dynamic Type に対応させる

アプリを Dynamic Type に対応させようと思って実装してみた。 IBでフォント指定可能なUI まずIB上で設置できるUIをいくつか配置する。 UILabel UIButton UITextField UITextView はIB上でフォントの設定ができるので Dynamic Type に対応したフォントを設定…

デフォルトの EKSource について

EKSource 上記コードでカレンダーへのプライバシーアクセスとリマインダーへのプライバシーアクセスを表示して全ての EKSource の配列を取得できる。 このソースは iCloud や CalDav を設定する事で増減するが、デフォルトでは2つのソースが用意されている。…

リマインダーの優先順位

EKReminder の priority プロパティ @property(nonatomic) NSInteger priority; なぜか現時点でまだドキュメントに記載が無いが、ヘッダファイルには定義が載っている。 ヘッダファイルのコメントによれば priority の値は最高が1、最小が9になっていてRFC 5…

Share Extension の NavigationItem をカスタマイズする

Share Extension のテンプレートで作成される SLComposeServiceViewController のサブクラスを自前のコントローラクラスとして、コード内では self として説明する。 Share Extension のデフォルトの表示が以下 self.title = @"Title"; これで NavigationBar…

StoreKit の iOS 8.3 での変更点

iOS 8.3 で StoreKit に若干の変更があった。いずれも役に立つ変更。 ファミリー共有の Ask to Buy のテストが可能に SKPayment @property(nonatomic, readonly) BOOL simulatesAskToBuyInSandbox NS_AVAILABLE_IOS(8_3); SKMutablePayment @property(nonato…

発着信と通話の開始停止を検出する

前回に続き CoreTelephony のネタ 携帯キャリアの情報を取得する - ObjecTips CoreTelephony を使って電話の発着信と通話の開始停止を検出できる。 コールバックはアプリがアクティブな時に受け取れる。 CTCallStateIncoming 電話がかかってきた時 CTCallSta…

携帯キャリアの情報を取得する

CoreTelephony.framework を使えばできるらしい。知らなかった。 CTTelephonyNetworkInfo をインスタンス化して subscriberCellularProvider メソッドを呼べば CTCarrier でキャリア情報が取得できる。 CTCattier にはキャリア情報に関するいくつかのプロパ…

Formatterクラス まとめ

Framework クラス OS X iOS 用途 Foundation NSNumberFormatter 10.0 2.0 数値 Foundation NSDateFormatter 10.0 2.0 日付 Foundation NSByteCountFormatter 10.8 6.0 Byte,KB,MB,GB 等 MapKit MKDistanceFormatter 10.9 7.0 メートル、ヤード、キロ 等 Foun…

Photos.framework でカメラロールを取得する

Photos.framework でカメラロールを取得する方法が分かり辛かったので備忘 fetchAssetCollectionsWithType:subtype:options: メソッドの引数の type で PHAssetCollectionTypeAlbum を指定した場合、写真アプリで作成したものとiTunesで同期したアルバムの一…

スクリーンショットを検出する

iPhone のホームボタンとロックボタン同時押しでのスクリーンショットを検出する UIApplicationUserDidTakeScreenshotNotification が iOS 7 で追加されている。 これを使えばスクリーンショットを検出できる。 [[NSNotificationCenter defaultCenter] addOb…

Share Extension の ConfigurationViewController を投稿画面のようにブラー表示する

ピンポイントなタイトルだけど Share Extension の実装の際にこれはやっておきたいなという事で。 まずプロジェクトへの Share Extension の追加は省略。 設定が終わると Safari などから Extension を呼び出す事ができる。 とりあえず名前は Test Share Ext…

Storyboard で UIViewController の dismiss を設定できるようにする

Storyboard で segue を設定して画面遷移を作っていく時、Modal 表示した ViewController にキャンセルボタンを設置する事がままある。 この時の ViewController への実装は - (IBAction)cancel:(id)sender { [self.presentingViewController dismissViewCon…

WatchKit Extension から親アプリを起動した時の挙動

WKInterfaceController の openParentApplication: メソッドから親アプリが起動された際にどのような処理の流れになるのか確認してみた。 確認方法は以下 親アプリとエクステンションの両方に NSLog を仕込む Xcode で WatchKit App をターゲットにしてrunす…