サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ノーベル賞
koze.hatenablog.jp
新規アプリで Xcode のテンプレートからプロジェクトを作成すると Assets.xcassets に AccentColor という名称のカラーアセットが用意されている。これに色を設定するとアプリ全体の AccentColor として反映される。 import SwiftUI struct ContentView: View { var body: some View { NavigationView { Button("Button") { } .toolbar { ToolbarItem(placement: .automatic) { Button(action: {}, label: { Text("Button") }) } } } } } 既存プロジェクトの場合 既存プロジェクトの場合は同名のカラーアセット AccentColor を用意するだけでは反映されない。 プロジェ
少し調査部分が長くなってしまったのでざっと読みたい人は「まとめ」の段をどうぞ UIButton でメソッドの実行を設定するには親クラスの UIControl で定義されている以下のメソッドを使用する。 func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControl.Event) https://developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget 実装例 let button = UIButton(type: .system) button.addTarget(self, action: #selector(someMethod), for: .touchUpInside) iOS 14 では UIAction を使っ
WWDCのメモリのセッションを見ていたら思わぬTipsについて言及されていた。 WWDC 2018 iOS Memory Deep Dive の20分57秒あたり https://developer.apple.com/videos/play/wwdc2018/416 UIGraphicsBeginImageContextWithOptions を使うのはやめて UIGraphicsImageRenderer を使えという話題。 UIGraphicsImageRenderer は最適なグラフィックフォーマットを自動で選択してくれる。 マスク画像の様な単色の画像を描画する場合に UIGraphicsBeginImageContextWithOptions では1ピクセル4バイトのsRGBに対して UIGraphicsImageRenderer は1ピクセル1バイトで75%のメモリの節約になる
Xcode 11.2 で Storyboard か xib で UITextView を使っていると iOS 13.2 より前のバージョンでクラッシュするという凶悪なバグが発生している。 実際にクラッシュを起こしてみると以下の様に _UITextLayoutView ってクラスは無いとエラーメッセージが表示された。 *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named _UITextLayoutView because no class named _UITextLayoutView was found; the class needs to be defined in source co
検証環境 Xcode 9.2, iOS 11.2 Simulator iOS 11.1 iPhone X の背面カメラで撮影したものを AirDrop で Mac に送ってシミュレータ経由で iCloud Photo Library に取り込んだ写真を用いてデータを確認 Exifの取得 まず取得方法をざっくり Exif等のデータをプロパティとして Core Image か Image I/O で取得可能 CoreImage CIImage *image = [CIImage imageWithContentsOfURL:URL]; NSDictionary<NSString *,id> *properties = image.properties; NSLog(@"%@", properties); Image I/O + CGImageSourceCopyPropertiesAtInde
iOS 10 までは UIImagePickerController と UIImagePickerControllerSourceTypePhotoLibrary の組み合わせでフォトライブラリを表示する際にアクセス権限の確認を自動で行ってくれていた。 アクセス権限がなければ鍵マークが表示され一切の情報を取得する事ができない。ユーザの操作としては必ずキャンセルが行われる。*1 iOS 10 自動でアクセス許可のアラートが表示される 権限なしの状態ではキャンセルしか出来ない 権限があればフォトライブラリを表示、写真を選択可能 iOS 11 ではアクセス権限の確認が自動で行われない様になった。そして権限がなくともフォトライブラリの表示は行われ、写真の選択も出来てしまう。 iOS 11 権限の確認無しにいきなりフォトライブラリが表示 何が起こるか 写真の選択を行うと通常通り delegate
Foundation | Apple Developer Documentation Foundation 周りざっくり、網羅はしていない。 iOS 11 関連記事 iOS 11 UIKit の変更点 - ObjecTips iOS 11 Messages Framework の変更点 - ObjecTips iOS 11 PDFKit - ObjecTips iOS 11 Core Image の変更点 - ObjecTips Vision framework でテキスト検出 TextDetection - ObjecTips Vision Framework で水平角検出(傾き) Horizon Detection - ObjecTips NSLinguisticTagger 言語、品詞の判定周りのメソッドが色々と増えたっぽい。 Core MLのドキュメントによると NSLinguis
UIKit | Apple Developer Documentation UIKit 周りざっくり、網羅はしていない。 iOS 11 関連記事 iOS 11 Foundation の変更点 - ObjecTips iOS 11 Messages Framework の変更点 - ObjecTips iOS 11 PDFKit - ObjecTips iOS 11 Core Image の変更点 - ObjecTips Vision Framework でテキスト検出 Text Detection - ObjecTips Vision Framework で水平角検出(傾き) Horizon Detection - ObjecTips 変更点 ContentSizeCategory の比較とアクセシビリティチェックの関数が追加 UIKIT_EXTERN BOOL UIContentSize
これまでの記事 これらを組み合わせて Excel のシートから JSON ファイルを作成するという事をやってみる。 例として以下の様なシートを用いる。 一応シートのデータも Gist にアップした。 sample data セルの内容を取得して配列化する まずアプリケーションの取得を行い、Excel の worksheet の取得を行う。 app = Application('Microsoft Excel'); worksheet = app.worksheets['Sheet1']; シートの一番上の行は列の内容を表すタイトル部分になっているので、表の内容取得はインデックス1の行(2行目)からループ処理で row を順番に取得してくようにする。 for (rowIndex=1; ; rowIndex++) { row = worksheet.rows[rowIndex]; } 上のコー
まず初めに 後からこの issue で分かった事だけど https://github.com/firebase/quickstart-ios/issues/13 Google Cloud Platform の利用規約に同意しておかないと下の手順の dSYM アップロード用のアカウントの作成やその権限付与でサーバエラーが起きて進めなくなってしまうので、Firebase にアプリを登録したらまずGCPのダッシュボードをチェックしてアクセスできるか確認しておいた方がいい。(これで結構時間を潰した) GCPのダッシュボードを開くと以下のようなダイアログが出る場合があるので設定しておく https://console.cloud.google.com/ セットアップ Google Firebase の Crash Reporting を使うには dSYM アップロードのための準備を行う必要がある。
編集不可な文字列を UILabel で表示させつつユーザにコピー操作だけはさせたいという事があったので実装を試みてみた。 コピーの方法は UITextView や UITextField でコピー操作を行う時と同様にポップアップのメニューを表示するようにする。 メニューは UIMenuController を使う事で標準UIのポップアップメニューを表示できる。 まず、ラベルをタップした時にメニューが表示される様にする。 UITapGestureRecognizer を使う方法もあるけど UILabel のサブクラスを作るので簡易に - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event このあたりをオーバーライドしてタッチ操作の終わりを検出する事にする。 初期化 まず UILa
iOS 8.3 で StoreKit に若干の変更があった。いずれも役に立つ変更。 ファミリー共有の Ask to Buy のテストが可能に SKPayment @property(nonatomic, readonly) BOOL simulatesAskToBuyInSandbox NS_AVAILABLE_IOS(8_3); SKMutablePayment @property(nonatomic, readwrite) BOOL simulatesAskToBuyInSandbox NS_AVAILABLE_IOS(8_3); 上記のプロパティが追加されていた。 これを YES にするとサンドボックス環境でこのペイメントで Ask to Buy の処理を発生させる事ができるとの事。 ちなみに Ask to Buy は日本語では「承認と購入のリクエスト」と表記されている。 「承認と購
AppleScript でのアプリケーションの基本操作 アプリケーションの起動には run と activate の2種類があって run は単にアプリケーションを起動するだけ。 activate はアプリケーションを起動してアクティブにする。Dock クリックでのアプリケーション起動と同じような挙動にするには activate を使う。 また、起動後に続けて AppleScript でいろいろと動作させたい場合にはアプリケーションをアクティブにする必要があるのでこの場合も acitivate を使う。 アプリケーションの終了は quit アプリケーションの再起動は quit と run activate を組み合わせて行う。 終了時の処理に時間がかかるアプリケーションもあるので適宜 delay をかけてアプリケーションが終了するのを待ってから起動すると良い。
現在一番新しいローカライズの方法が XLIFF を使ったプロジェクト全体のローカライズになる。 この方法は Base Internationalization 方式でのローカライズを想定している。 Xcode のプロジェクトナビゲーターでプロジェクトを選択した状態でメニューから Editor > Export for Localization... を選択する。 保存ダイアログ 保存すると指定したディレクトリにフォルダが作られて en.xliff が保存される。 XLIFF ファイルの中身は以下 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSche
β3 での変更点に限らず iOS 9.2 から iOS 9.3 で今のところ追加予定のものを調査。 (網羅はしてない) ドキュメントは以下2つ iOS 9.3 API Diff / iOS 9.2 to iOS 9.3 API Differences https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS93APIDiffs/index.html What's New in iOS / iOS 9.3 https://developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9_3.html#//apple_ref/doc/uid/TP40016661-SW1 HealthK
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // some implements } と - (void)viewWillDisappear:(BOOL)animated { // some implements [super viewWillDisappear:animated]; } どちらが良いの?という議題 Appleのドキュメント Subclasses can override this method and use it to commit editing changes, resign the first responder status of the view, or perform other relevant tasks. For example, you
iOS 8の self-sizing cell で自動で高さを調整してくれるように実装したところちょっと問題が。 まずセルのレイアウトは以下 上に UILabel, 下に UITextView を配置してラベルとテキストビューの間は0px ラベルとテキストビューそれぞれのセルの contentView への margin をとって Auto Layout を設定する。 テーブルの表示内容として以下のように NSMutableArray *mArray = [NSMutableArray array]; for (int i=0; i<indexPath.row; i++) { [mArray addObject:[NSString stringWithFormat:@"%d", i+1]]; } cell.textView.text = [mArray componentsJoinedBy
Photos.framework でカメラロールを取得する方法が分かり辛かったので備忘 fetchAssetCollectionsWithType:subtype:options: メソッドの引数の type で PHAssetCollectionTypeAlbum を指定した場合、写真アプリで作成したものとiTunesで同期したアルバムの一覧が取得できる。 PHAssetCollectionTypeSmartAlbum ではバースト、カメラロール、最後に追加した項目などのシステム作成のアルバム一覧が取得できる。 PHAssetCollectionTypeMoment では時間と位置情報にもとづくグループ(モーメント)が取得できる。 写真アプリの「アルバム」タブにはバースト、カメラロール、人々、自分で作成したアルバムとフォルダ等々がまとめて表示されているので、PHAssetCollecti
サンプルとして UINavigationController の rootViewController に UITableViewController を設定したものを使う。 UINavigationItem に適当にボタンを設定して UITableView の tableViewHeader に UIImageView を aspectToFill で入れて画像を設定。 Storyboardはこんな感じ ビルドするとこうなる 単純に UINavigationBar を非表示にしたい時は [self.navigationController setNavigationBarHidden:YES animated:YES]; 透明にしたい時は空の画像を背景に設定してやる。 [self.navigationController.navigationBar setBackgroundImage:
Objective-C で NSObject の Class を取得するには class (クラスメソッドとインスタンスメソッド) classForCorder (インスタンスメソッド) classForKeyedArchiver (インスタンスメソッド) classForKeyedUnarchiver (クラスメソッド) などのメソッドがある。 Swift では返り値の型は AnyClass で classForCoder (インスタンスメソッド) classForKeyedArchiver (インスタンスメソッド) classForKeyedUnarchiver (クラスメソッド) これらのメソッドしか存在しない。 Objective-C の class にあたるクラス取得方法には2通りあって + (Class)class にあたるのがクラスに対する self で - (Class)c
オーディオ周りの変更点のまとめ。いい感じに進化していってる。 関連記事は以下 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 iOS 8.3 to iOS 9.0 API Differences CoreLocation - ObjecTips iOS 8.3 to iOS 9.0 API Differences CoreTelephony - ObjecTips AudioToolbox AudioServices extern void AudioServicesPlayAlertSoundW
UITableViewCell を左スワイプした時に表示されるボタンは iOS 7 までは削除ボタンのみに固定されていた。 削除ボタンのタイトルはデリゲートメソッド - (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath; でカスタマイズ可能。 iOS 8 以降では UITableViewRowAction クラスを使ってボタンのスタイル、数、テキストがカスタマイズできるようになった。 以下が上記画面の実装コード まずポイントは以下のデリゲートメソッドを実装しておく必要がある事。 - (void)tableView:(UITableView *)tableView commitEditingStyle
よく定数を忘れるので備忘 float の誤差を考慮して等価比較するには FLT_EPSILON を使う double のための DBL_EPSILON long double のための LDBL_EPSILON も用意されている。 例えば float a が float b とイコールであるかをチェックするには a と b との差が FLT_EPSILON の値以下かどうか、つまり差の絶対値を FLT_EPSILON と比較演算する。 これが float a; float b; // 何らかの処理 if (a == b) { } こうなる ↓ float a; float b; // 何らかの処理 if (fabsf(a - b) < FLT_EPSILON) { } double の場合は ↓ double a; double b; // 何らかの処理 if (fabs(a - b) <
結構 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 Differences ネットワークとWeb周り - ObjecTips iOS 8.3 to iOS 9.0 API Differences CoreLocation - ObjecTips iOS 8.3 to iOS 9.0 API Differences CoreTelephony - ObjecTips CFNetwork CFFTPStream, CFHTTPStream HTTPとFTPのStream系の関数が
UserAgent の取得 UIWebView では stringByEvaluatingJavaScriptFromString: メソッドで JavaScript を実行して UserAgent を取得できる。 iOS 8以降の WKWebView では evaluateJavaScript:completionHandler: メソッドで JavaScript を実行して UserAgent を取得できる。 WKWebView の JavaScript は非同期で実行される。 UserAgent の設定 iOS 8までは UIWebView WKWebView 共に NSUserDefaults のデフォルト値に UserAgent の値を書き込んでからインスタンスを作るというちょっとトリッキーな事をする必要があった。 iOS 9以降では WKWebView に公式に UserAge
Storyboard で segue を設定して画面遷移を作っていく時、Modal 表示した ViewController にキャンセルボタンを設置する事がままある。 この時の ViewController への実装は - (IBAction)cancel:(id)sender { [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; } の様になる。 キャンセル操作の場合は完了(done)操作と違って ViewController を閉じる以外は何もしない上に、キャンセルボタンを実装する様々な ViewController の数だけこれと同じ実装を何度も行う事になる。 OS X の NSViewController には - (void)dismissViewController
これの続き Apple Watch Programming Guide: Developing for Apple Watch 2015-03-09 初出バージョンのドキュメントまとめ(網羅ではなく適宜省略) WatchKit Apps UI Essentials Assembling Your Storyboard Scenes Storyboard でのシーンの組み立て UIの要素をシーンに追加すると縦にスタックされる UIの要素を入れるコンテナの役割をする Group は重要な要素 Group はネストできる Group は背景色か背景画像を設定できる Accommodating Different Display Sizes 異なるディスプレイサイズへの対応 デフォルトではIB上で異なるサイズの Apple Watch のUIを全て同時に設定するが、個別に設定する事もできる どのサ
ドキュメントを読んだ後、実際にコードを書いてみて気付いた事がいくつかあった。 画面読み込み中のインジケーター 完全に静的な画面を表示するだけだとインジケーターは表示されない。 自前の InterfaceController クラスで IBOutlet で何かを接続するとそのコントローラが表示される際にインジケーターが表示される。IBOutlet で接続するだけで値を何も設定しない場合でもインジケータは表示される。 セパレータは縦にも表示できる WKInterfaceSeparator 自体に縦横を制御するプロパティがあるわけではなく、自動的によしなに縦横が適用される。 WKInterfaceDevice の preferredContentSizeCategory @property(nonatomic,readonly,copy) NSString *preferredContentSi
このページを最初にブックマークしてみませんか?
『koze.hatenablog.jp』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く