ObjecTips

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

2015-04-01から1ヶ月間の記事一覧

WatchKit Development Tips まとめ

Apple Watch の発売に伴って WatchKit Development Tips が公開されてた 2015-04-24 時点のドキュメントまとめ(網羅ではなく適宜省略) WatchKit Development Tips and Best Practices - Apple Developer General Guidance Animate with image sequences. -…

WatchKit のドキュメントに書かれていない事

ドキュメントを読んだ後、実際にコードを書いてみて気付いた事がいくつかあった。 画面読み込み中のインジケーター 完全に静的な画面を表示するだけだとインジケーターは表示されない。 自前の InterfaceController クラスで IBOutlet で何かを接続するとそ…

Apple Watch Programming Guide まとめ その3

これの続き Apple Watch Programming Guide まとめ その2 - ObjecTips Apple Watch Programming Guide: Developing for Apple Watch 2015-03-09 初出バージョンのドキュメントまとめ(網羅ではなく適宜省略) Glances Glance Essentials グランス アプリの重…

Apple Watch Programming Guide まとめ その2

これの続き Apple Watch Programming Guide まとめ - ObjecTips Apple Watch Programming Guide: Developing for Apple Watch 2015-03-09 初出バージョンのドキュメントまとめ(網羅ではなく適宜省略) WatchKit Apps UI Essentials Assembling Your Storybo…

Apple Watch Programming Guide まとめ

Apple Watch Programming Guide: Developing for Apple Watch 2015-03-09 初出バージョンのドキュメントまとめ(網羅ではなく適宜省略) Overview Developing for Apple Watch Apple Watch and Its Paired iPhone Apple Watch と iPhone 3rd party アプリを…

Apple Watch Human Interface Guidelines まとめ

Apple Watch Human Interface Guidelines: Designing for Apple Watch 2015-03-09 初出バージョンのドキュメントのまとめ(網羅ではなく適宜省略) UI Design Basics Designing for Apple Watch App Anatomy Interface Navigation Styles iOS の UINavigatio…

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…

Auto Layout の Multiplier の指定方法いろいろ

Auto Layout で Multiplier を指定する時に多いのが View のアスペクト比を指定するケースだと思う。 InterfaceBuilder上で View を選択して、以下から Aspect Ratio の Constraint を追加する。 追加したらその Constraint を選択して、インスペクタで 4:3 …

NSPredicate で UTI を扱う

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

iOS 8.0, OS X v10.10 で追加された UTI

なぜか今になって割と追加されてた。 extern const CFStringRef kUTTypeURLBookmarkData __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0); extern const CFStringRef kUTTypeDelimitedText __OSX_AVAILABLE_STARTING(__MAC_10_10,__IPHONE_8_0); extern…

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 の不可視文字 (Invisible Characters)

Xcode に限らず、エディタで空白の whitespace を表示するオプションがある。 Xcode の場合、メニューの Editor > Show Invisibles から設定可能。 この時表示されるこれ ␣ をUnicode表で調べたみたところ OPEN BOX Unicode U+2423 UTF-8 E2 90 A3 というや…

GitHub Flavored Markdown でURLの自動リンクをしないようにする

GitHubやはてなブログで Markdown 内にURLを記述すると自動でリンクを張ってくれる。 http://www.example.com と書くと http://www.example.com とリンクが張られる。 ` で囲ってコードブロックにするのも1つの手だけど、セミコロンを特殊文字に変更して htt…

Markdown のテーブルにXMLを書く

Markdown のテーブルの基本表記はこれ |Column|Column| ||| |Row1|Row1| |Row2|Row2| コードブロック ` と ``` = <code> と <pre> タグを使うと枠線が表示されてしまうのでコードブロックを使わずにテーブルにXMLを入れてみる 入れるXMLはこれ <tag1> <tag2> </tag2> </tag1> とりあえず改行を削</pre></code>…

Markdown のテーブルで改行する

Markdown のテーブルの基本表記は以下 |Column|Column| ||| |Row1|Row1| |Row2|Row2| Column Column Row1 Row1 Row2 Row2 通常 Markdown では space 2 つで改行だけどテーブル内では改行が効かない。 HTMLの <br> タグを使うとテーブル内で改行させる事ができる…

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

koze.hatenablog.jp 前回は結局 Private API を使うとできるという話になってしまったので今回は正攻法で。 MPVolumeView を使う。 UIが提供されるのみで programmatically に設定はできない。 UIはこんな感じ。 分かりやすく以下のコードで border を描画し…

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 というマクロがあるのでそちらを使う。