kitoko552.memo

kitoko552のメモ

iOS

ModalのWebViewでFileReaderを使うとViewControllerごとdismissされる

iOS

FileReaderとは developer.mozilla.org Webページ内でハードウェアのファイルにアクセスするやつ。 iOSの場合これ。 ViewControllerごとdismissされる これをModalで開いたViewController内WebViewで使うと、アクション選択時やキャンセル時にViewController…

Swift 3のstructがプロパティに合わせて自動で作るイニシャライザはinternalになる

要点 Swift 3では、structがプロパティに合わせて自動で作るイニシャライザは、プロパティのアクセスレベルにかかわらずinternalになる。 ライブラリを公開している方は注意。 外部からも使えるようにするにはpublicなイニシャライザを改めて定義してやる。 …

AlamofireのSwift 3対応バージョンをiOS 8対応のプロジェクトでも使えるようにする

要点 AlamofireのSwift 3対応バージョンである4.0.0は対応OSがiOS 9以上 iOS 8でも使いたい場合は、フォークしてURLSessionStreamTaskを使っている部分をコメントアウトすると使える Swift 3登場 先日正式版のiOS 10, Xcode 8がリリースされ、既存のアプリを…

UIViewControllerAnimatedTransitioningを使って自作の画面遷移を実装する【基本編】

要点 iOSアプリの画面遷移 自作の画面遷移を実装する方法 UIViewControllerAnimatedTransitioningに準拠したクラスの実装 transitionDurationメソッド animateTransitionメソッド 1つ目のまとめ UIViewControllerTransitioningDelegateのメソッドの実装 anim…

Swiftで端末のディレクトリ一覧を表示する

要点 ディレクトリの一覧を表示したい contentsOfDirectoryAtPathを使う場合 subpathsAtPathを使えばもっと簡単 enumeratorAtPathというのもある 要点 NSFileManagerを使って探索する。 使えるのはcontentsOfDirectoryAtPath(path: String) -> [String]?, su…

UICollectionViewやUITableViewのスクロール処理はViewが描画されてから行う

要点 UICollectionView, UITableViewのスクロール処理 setContentOffsetかscrollToItemAtIndexPathを使う メソッドを呼ぶのはViewが描画されてから viewDidAppearかviewDidLayoutSubviews内で呼ぶ 要点 UICollectionView, UITableViewのスクロールはsetConte…

EMBEDDED CONTENT CONTAINS SWIFT CODEの正体を暴く

要点 CocoaPodsでの警告 Build Settingsの値が最終的に採用される EMBEDDED CONTENT CONTAINS SWIFT CODEってなに? 重複コピーはされないのか CocoaPodsはなぜEMBEDDED CONTENT CONTAINS SWIFT CODEをYESに設定するのか 要点 EMBEDDED CONTENT CONTAINS SWI…

iOS9でWKWebViewのdecelerationRateの設定がうまくいかないときの対処法

要点 iOS9でWKWebViewのdecelerationRateの設定がうまくいかないのはiOSのバグ。 対処法としては、WKWebViewのscrollViewのdelegateを指定し、scrollViewWillBeginDraggingでdecelerationRateを設定する。 class HogeViewController: UIViewController { var…

forEachを使ってSwiftっぽく書く

要点 SwiftのforEachを使えば、普通のfor文よりもSwiftっぽく書けます。 ただし、配列などのコレクションの中身を変更するようなものはforEachじゃなくてmapとかfilterとかflatMap使いましょう。 // for文 for element in array { if element == 2 { // Do s…

CGImageからUIImageへの変換時に画像の向きが変わってしまう

iOS

要点 UIImage(CGImage:)ではなく、UIImage(CGImage:, scale:, orientation:)を使う。 // Preferred let uiImage = UIImage(CGImage: cgImage, scale: originalImage.scale, orientation: originalImage.imageOrientation) // Not preferred let uiImage = UI…

PhotoKitでアルバムを新規作成する

要点 PHPhotoLibraryのperformChangesメソッドでアルバムを作成できる。 performChangeメソッドのchangeBlockにアルバム新規作成のChangeRequestを書くことで作成する。 import Photos let changeBlock: () -> Void = { PHAssetCollectionChangeRequest.crea…

Swiftの配列をNSMutableArrayに変換する

要点 Swiftの配列をNSMutableArrayに変換するには、NSMutableArray(array:)を使います。 前提 Objective-C時代に活躍したNSArrayやNSMutableArrayは、Swiftではほぼ使いません。 しかし、コードがObjective-CとSwiftの共存であるプロジェクトでは、SwiftでNS…

SwiftでrespondToSelectorを呼ぶ必要はない

要点 SwiftにはOptional ChainingがあるのでrespondToSelectorを呼んでチェックする必要はありません。 シンプルにhoge.delegate?.delegateMethod()と書くだけでいいです。 delegateを使った実装 Objective-C時代は、delegateを使ってある処理を他のクラスに…

SwiftのクラスをObjective-Cで使う

要約 Objective-Cファイル内で${ProductModuleName}-Swift.hをimportする Swift側のファイルはNSObjectを継承していなければコンパイルエラーになる 詳細 kitoko552.hatenablog.com この記事の反対のことをやろうということです。 SwiftのクラスをObjective-…

Objective-CのクラスをSwiftで使う

要約 ${ProductModuleName}-Bridging-Header.h で該当のObjective-Cファイルをimportする だけです。 詳細 Bridging Headerの作成・設定方法は以下のリンクを読めば大体わかります。 tech.admax.ninja 作成・設定が完了したらBridging Headerファイルに、 //…

SwiftGenでリソースをタイプセーフに扱う

概要 SwiftGenを使えばLocalizable.strings, Storyboard, ImageAssetsなどのリソースをenum化してタイプセーフに書けるよって話です。 github.com SwiftでStringを扱うときの問題点 SwiftでStringを普通に扱うと以下のようになります。 let title = "What th…

Quick Actions (3D Touch Shortcuts)を実装する

iPhone6sから3D touchが導入されました。 ホーム画面のアプリアイコンを3D touchすることで、目的の操作画面でアプリを起動する操作をQuick Actions(または3D Touch Shortcuts)と言います。 この記事では、このQuick Actionsの実装方法や注意事項などを簡…

UILabelにwidthが可変になるようなconstraintsを加えると高さがうまく計算されない

iOS

UILabelはnumberOfLinesの設定によって行数を変更することができます。 その際、IBでheightにconstraintsを加えない限り、文字列の長さによって自動で高さを計算して表示してくれます。 しかし、widthが可変になるようなconstraintsを加えていると、文字列の…

UITableViewのviewForHeaderInSectionがsection=0のときに呼ばれない

UITableViewのdelegateメソッドviewForHeaderInSectionは、sectionが0のときに呼ばれないときがあります。 これは、heightForHeaderInSectionを実装していない場合に起きるので、heightForHeaderInSectionを実装すると直ります。 func tableView(tableView: …

NSMutableArrayをSwiftのArrayに変換する

Objective-cとSwiftが共存しているプロジェクトでは、NSMutableArrayをSwiftのArrayに変換したいときがあります。 感覚的に以下のように書きたいのですが、これではコンパイルエラーになってしまいます。 let mutableArray = NSMutableArray(array: ["hoge",…

UIButtonのタイトル・色を変える

UIButtonにはtitleLabelというプロパティがありますが、これを直接操作しようとするとタイトルや色を変更することはできません。 button.titleLabel?.text = "Button" // 変更されない button.titleLabel?.textColor = UIColor.blueColor() // 変更されない …

Swiftで円のUIImageをコードで作成する

色がついた円の画像が欲しいけど、画像を作るほどでもない(デザイナーの方に頼むほどではない)ときはコードでUIImageを作っちゃいましょう。 extension UIColor { func circleImage(#size: CGSize) -> UIImage { let rect = CGRectMake(0.0, 0.0, size.wid…

Swiftで丸いUIButtonを作る

これは定番ですが、すぐ忘れてしまうのでメモします。 ちなみにUIButtonでなくてもUIViewのサブクラスなら同じ処理で丸くすることができます。 UIButtonを丸くする際は、そのボタンのwidth, heightを同じ値にして(正方形にして)、そのサイズの半分の値をco…

Swiftでsubviewsに影響が出ないようにviewを透過する

Swiftでは(Objective-cでも)、あるviewのalphaを直接操作してしまうと、そのviewのsubviewsもalphaの影響を受けてしまいます。 override func viewDidLoad() { super.viewDidLoad() let view1 = UIView(frame: CGRectMake(35, 50, 300, 500)) view1.backgr…

Swiftでviewに対するタップを検知する

UIButtonのタップ検知は簡単ですが、UIButton以外のviewに対するタップイベントを取得したいときがあります。 そういったときは、以下を行います。 タップイベントを取得したいviewのuserInteractionEnabledをtrueにする。 タップイベントを取得したいviewに…

CGPathCreateWithEllipseInRectを使って円形のviewを作る

CGPathCreateWithEllipseInRectは、指定されたCGRectの各辺に接するような楕円のCGPathを得ることができます。 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let view1 = UIView(frame: CGRectMake(35, 50,…

UIViewのframeとboundsの違い

以下の例を見た方がはやいです。 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let view1 = UIView(frame: CGRectMake(50, 50, 300, 550)) println(view1.frame) // (50.0, 50.0, 300.0, 550.0) println(vi…

CGRectInsetの使い方

SwiftのCGRectInsetは、ある矩形から指定した余白分を除外した矩形を取得するメソッドです(もちろんObjective-Cも同じ)。 CGRectInsetの定義は以下のようになっています。 /** * :param rect 元になる矩形 * :param dx 横の余白 * :param dy 縦の余白 */ f…

Swiftで画像を正方形に切り取る

画像から正方形を切り取りたいときがあったので、メソッドを作りました。 CGImageCreateWithImageInRectを使えば簡単に切り取ることができます。 /** 与えられたimageを正方形にして返すメソッド 横長は真ん中を正方形に切り取って返す 縦長は上から正方形に…