ObjecTips

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

Tips

CITextFeature の iOS 9β4 での変更点

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

Apple Watch と WatchOS のデバイス情報を取得する

iOS 9 β4で WKInterfaceDevice にデバイス情報を取得するメソッドが追加された。 追加されたメソッドは以下で取得できる情報は iOS の UIDevice に存在する同名のメソッドと同じ。 @property(nonatomic, readonly, copy) NSString *systemVersion WK_AVAILAB…

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 からはアクセスできない誕生日用のカレンダー。 このあたりの詳しい話は…

float 等の浮動小数点数の誤差を考慮して等価比較する

よく定数を忘れるので備忘 float の誤差を考慮して等価比較するには FLT_EPSILON を使う double のための DBL_EPSILON long double のための LDBL_EPSILON も用意されている。 例えば float a が float b とイコールであるかをチェックするには a と b との…

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

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

NSUserDefaults の変更通知を受け取る

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

iOS 8リマインダーアプリの挙動調査 その2

前回の内容は以下 iOS 8リマインダーアプリの挙動調査 - ObjecTips 優先順位の !!! は UITextView の中に含まれている事が分かった。 これをコピーすると何が入っているのか。 UIPasteboard を使って中身を見てみた。 すると pasteboardTypes には ( "com.ap…

iOS 8リマインダーアプリの挙動調査

リマインダーアプリの優先順位の表示を参考にするため、どのように実装されているのか調べてみた。 優先順位の !!! の部分は attributedString もしくは attachment の画像として UITextView の中に一緒に入れられているっぽい。 しかしテキスト編集時にこの…

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 を調査したい時がある。 そういう…

iOS 8.3 to iOS 9.0 API Differences CoreTelephony

まだWWDCのネットワーク系のビデオを見ていないので紹介されているか分からないけど、たぶんされていないであろう CoreTelephony の変更点について。 関連記事は以下 iOS 8.3 to iOS 9.0 API Differences Core Image - ObjecTips iOS 8.3 to iOS 9.0 API Dif…

iOS 8.3 to iOS 9.0 API Differences CoreLocation

iOS 9 での CoreLocation の変更点 関連記事は以下 iOS 8.3 to iOS 9.0 API Differences Core Image - ObjecTips iOS 8.3 to iOS 9.0 API Differences オーディオ周り - ObjecTips iOS 8.3 to iOS 9.0 API Differences ネットワークとWeb周り - ObjecTips iO…

UITableViewCell を左スワイプしてボタンを表示するUI

UITableViewCell を左スワイプした時に表示されるボタンは iOS 7 までは削除ボタンのみに固定されていた。 削除ボタンのタイトルはデリゲートメソッド - (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath…

テスト時のログを見やすくする

前回 XCTest の name プロパティを使ってテスト時のログを見やすくする方法について書いた。 XCTest の name プロパティの活用 - ObjecTips その時は XCTest の name プロパティがあるのを知って「これを使えばログを見やすくできるんじゃないか?」という思…

XCTest の name プロパティの活用

XCText.framework でテストを書く時テストケースのクラス階層は MyTests: XCTestCase : XCTest となっていて XCTest には name というプロパティがある。 このプロパティで、今どのクラスのどのテストケース(テストメソッド)が実行されているかを知る事が…

Inter-device Audio Mode

Keynote その他で全然触れられてなかった Inter-device Audio Mode (IDAM) というおもしろい機能が WWDC2015 Session 507 What's New in Core Audio で紹介されていた。 https://developer.apple.com/videos/wwdc/2015/?id=507 この機能は iOSデバイスをUSB…

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

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

iOS 8.3 to iOS 9.0 API Differences ネットワークとWeb周り

結構 diffs の量が多いので分割分割で今回はネットワークとWeb周りについて。 関連記事は以下 iOS 8.3 to iOS 9.0 API Differences Core Image - ObjecTips iOS 8.3 to iOS 9.0 API Differences オーディオ周り - ObjecTips iOS 8.3 to iOS 9.0 API Differen…

iOS 8.3 to iOS 9.0 API Differences オーディオ周り

オーディオ周りの変更点のまとめ。いい感じに進化していってる。 関連記事は以下 iOS 8.3 to iOS 9.0 API Differences Core Image - ObjecTips iOS 8.3 to iOS 9.0 API Differences オーディオ周り - ObjecTips iOS 8.3 to iOS 9.0 API Differences ネットワ…

iOS 8.3 to iOS 9.0 API Differences Core Image

画像周りの変更点をまとめようと思ったら Core Image だけで済んでしまったので Core Image だけ。 関連記事は以下 iOS 8.3 to iOS 9.0 API Differences Core Image - ObjecTips iOS 8.3 to iOS 9.0 API Differences オーディオ周り - ObjecTips iOS 8.3 to …

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

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

Framework名とクラスヘッダファイル名のイレギュラー

XCTest.framework において XCTest クラスを定義しているヘッダファイルはちょっとイレギュラーな形になっている。 通常 XXAbc というクラス名であれば XXAbc.h というヘッダファイルで定義されるが XCTest の場合は XCAbstractTest.h というヘッダファイル…

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

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

ウェブブラウザでの位置情報に基づくアプリのURL

たまたまウェブサーフィンをしていたら iTunes でのアプリの URL が従来のものから変わっているものを発見した。 例えば Apple のリリースしている iBooks の場合以下のようになる。 USページ https://itunes.apple.com/us/app/ibooks/id364709193?mt=8 JPペ…

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

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

デフォルトの EKSource について

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

位置情報に基づくリマインダーの通知が利用できないデバイス

参考 iPhone および iPad でリマインダーを作成および使用する - Apple サポート 当然と言えば当然かも知れないけど、iPod touch と iPad Wi-Fi モデルでは利用できない。 リマインダー.appでのリマインダー詳細画面では「指定場所で通知」の項目自体が非表…

リマインダーの優先順位

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

UIDeviceFamily 一覧

ビルドしたアプリの Info.plist 内に設定されている UIDeviceFamily キーは開発者が明示的に設定するものでは無く、ビルド時に Xcode によって自動で設定される。 公式にドキュメントに載っているのは以下 値 デバイス 1 iPhone, iPod touch 2 iPad iPhone, …

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

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

AppleScript でウィンドウを閉じる

アプリケーションを指定して windows で全てのウィンドウを閉じる。 ウィンドウ指定で閉じる場合は window index の形式でウィンドウを指定。 index 1で最前のウィンドウを指定、index 2 で最前から1つ後ろのウィンドウを指定して閉じる。

AppleScript でアプリケーションを起動・終了する

AppleScript でのアプリケーションの基本操作 アプリケーションの起動には run と activate の2種類があって run は単にアプリケーションを起動するだけ。 activate はアプリケーションを起動してアクティブにする。Dock クリックでのアプリケーション起動と…

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…

Apple Remote Desktop でコマンドでログイン

Apple Remote Desktop で Unix コマンドを送信 の機能を使って複数台マシンを一気にログインさせる方法。 まず システム環境設定>ユーザとグループ>ログインオプション で ログイン時の表示をユーザのリストから名前とパスワードに変更。 これでログイン画面…

Apple Watch の対応言語 その2

前記事は以下 Apple Watch の対応言語 - ObjecTips この記事から程なくして Watch OS 1.0.1 で対応言語が増えた。 追加された言語は以下 日本語表記 母国語表記 オランダ語 Nederlands ポルトガル語(ブラジル) Português (Brasil) デンマーク語 Dansk スェ…

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

前回に続き 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…

WatchKit App の表示名

WatchKit App の表示名を変える時の備忘 表示 設定 iPhoneのApple Watchアプリ内 iOSアプリ(親アプリ)のCFBundleName*1 Apple Watchでのアプリ起動時 WatchKit AppのCFBundleName or CFBundleDisplayName*2 iPhone の Apple Watchアプリにはなぜか CFBundl…

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

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

Swift での NSLocalizedString

Objective-C では NSString *NSLocalizedString(NSString *key, NSString *comment) NSString *NSLocalizedStringFromTable(NSString *key, NSString *tableName, NSString *comment) NSString *NSLocalizedStringFromTableInBundle(NSString *key, NSString…

Swift での Class 取得メソッド

Objective-C で NSObject の Class を取得するには class (クラスメソッドとインスタンスメソッド) classForCorder (インスタンスメソッド) classForKeyedArchiver (インスタンスメソッド) classForKeyedUnarchiver (クラスメソッド) などのメソッドがある。…