ObjecTips

Swift & Objective-C で iOS とか macOS とか

Private API

Xcode 11.2 + Storyboard UITextView でクラッシュ

Xcode 11.2 で Storyboard か xib で UITextView を使っていると iOS 13.2 より前のバージョンでクラッシュするという凶悪なバグが発生している。 実際にクラッシュを起こしてみると以下の様に _UITextLayoutView ってクラスは無いとエラーメッセージが表示…

縦書き対応した iWorks アプリの新レイアウトエンジン

縦書き対応した iWorks についてMacお宝鑑定団にて http://www.macotakara.jp/blog/category-60/entry-37209.html 今回の縦書き表示は、Core Textではなく、iWorks専用レイアウトエンジンが搭載されていて、 との事で気になったので調べてみる。 otool -L /A…

NSUserDefaults に時・分のみ記録する(日付は不要なケース)

日付は不要で時・分のみを NSUserDefaults に保存したい場合、パッと以下の様な方法が思い付く 時・分を2つに分けて2つの NSNumber で保存する 時・分を分換算して1つの NSNumber で保存する NSDate で保存して時・分のみを利用する 他には以下も考えられる …

UIActivityViewController からメールが呼び出された時の statusBarStyle の調整

UIActivityViewController からメールが呼びだされた時に statusBarStyle が常に UIStatusBarStyleDefault で黒文字になってしまう。通常は問題無いがアプリのデザインでナビゲーションバーやボタン類に色を付けている場合、ステータスバーの文字色とマッチ…

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

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

EKStructuredLocation の Private なプロパティ

EKStructuredLocation の公開ヘッダでは @property(nonatomic, retain) NSString *title; @property(nonatomic, retain) CLLocation *geoLocation; @property(nonatomic) double radius; // 0 = use default, unit is meters の3つのプロパティが定義されて…

デフォルトの EKSource について

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

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…

iPhone 本体の音量を変更する

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

UIKit の Private な UIGestureRecognizer その4

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

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(…