Xcode7 – Swift2 UIImageViewのタッチイベントを検知する

Xcode 7.0.1
Swift 2.0

ボタンだと、下記のようにできます。

UIImageViewだと、addTargetは使えません。

参考:SwiftにてUIImageViewをTap検知後、詳細画面に遷移したい

上記を参考に、下記のように作成してみましたが、エラーはでませんが、検知しません。

touchesBeganを使って座標で計算しようかなと思いまして、下記をとりあえずつくりましたが、これも反応しません。

参考:UILABELやUIIMAGEVIEWが応答しない場合の対処法

userInteractionEnabledはUIViewクラスのプロパティで、デフォルトではNOらしい。これをtrueにしないと反応しないらしい。

上記を追加したが、反応しない。

どうも、UIScrollViewを使っていることが原因っぽい。UIScrollViewを外すと反応する。

参考:UILabel・UIImageViewでタッチイベントを拾う方法の例外

しかし 「UIScrollViewの上に乗っているUILabeやUIImageView」 の場合は、
タップしてもtouchesBeganメソッドやtouchesEndedメソッドが反応しない。
(UIScrollViewのtouchesBegan/touchesEndedメソッドの実装によるものと推測)

UIScrollView上にある、UIImageViewとかUILabelのタッチイベントを検知するには、UITapGestureRecognizerを使い、対象のviewのuserInteractionEnabledをtureにしたら反応した。

Xcode7 – Swift2 ウインドウズサイズ取得

Xcode 7.0.1
Swift 2.0

参考:SwiftでカスタマイズしたViewを追加する方法

下記で取得できる。

上記は、CGFloat型というやつらしい。計算したりするときは、下記のように型を合わせる必要がある。

Swift – MacでSwiftのバージョンを確認する

参考:Swiftで開発している人必見!ターミナルでSwiftのバージョンを確認する方法

Xcode Swift – URLから画像を表示する

Xcode 7.0.1
Swift 2.0

参考:UIImage

下記のようにやってみましたが、NSDataに関するエラーがでました。

エラー内容

Cannot invoke initializer for type ‘NSData’ with an argument list of type ‘(contentsOfURL: NSURL, options: NSDataReadingOptions, error: inout NSError?)’

参考:[swift] CustomCellを利用したユーザ一覧画

Swift 2.0より、JavaではおなじみのTry-Catch構文が導入され、例外処理(エラー発生時処理)が処理されることになりました。それにともない、NSErrorを使うメソッド等の書式が変更を受けているようです。

参考:Swift 2.0 の try, catch ファーストインプレッション

これでできた。

Xcode – HTTP接続できない

下記のようなエラーが出た。
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.

参考:iOS9でHTTP接続できない場合の対処法

iOS9より実装された、ATS(App Transport Security)という機能による制限のようです。
公式のドキュメントによると、今後はなるべくHTTPS接続に統一するよう求められています。

info.plist に下記の設定を追加することで、ATSによる制限を回避し、従来通りにHTTP接続を行うことができます。

これ設定したら接続できた。

Xcode Swift – SKShapeNodeと重力

SKShapeNode

SpriteKitを使ってるときに、四角形とか丸とかを作りたいときに使う。

重力加えてみる

下記のようにphysicsWorld.gravityにCGVectorを設定する。

画像も追加してみる

画像はSKSpriteNodeというのを使ってつくれる。

Xcode Swift – AutoLayoutをコードで書く(Visual Format Language)

Visual Format Languageの使い方。Visual Format Languageは、VFLと略されているらしい。appleの説明ページは、ここっぽい。けどまだしっかり読んでいない。

VFLを使うときは、設定対象のviewで、setTranslatesAutoresizingMaskIntoConstraints(false)を設定する必要がある。また、VFLを使う前に、addSubviewをしておく必要がある。そして、設定対象のview達を下記のように配列に格納する。

そして、下記のように使う。

optionsに何を入れたらどうなるのかはまだわかっていない。metricsは、使いたい長さとかを事前に計算しておき、metricsに渡すと、設定の際に使えるようになる。

VFLサンプル

結果

スクリーンショット 2015-08-16 11.01.15

スクリーンショット 2015-08-16 11.01.28

参考:
Introduction to the Visual Format Language
http://swift-salaryman.com/autolayout.php
http://www.slideshare.net/classmethod/i-os-auto-layout
SwiftでAuto Layoutがめっちゃ楽に書けるライブラリ「Crew」

Xcode Swift – 動かそうとしたらyou don’t have permission to view itというエラーがでる

cmd+rで動かそうとしたら、you don’t have permission to view itというエラーがでる。

ここに同じエラーの人いるけど、chmodで権限を777にしてもエラーがでる。

“The file “MyApp.app” couldn’t be opened because you don’t have permission to view it” when running appこのサイトによると、キャッシュ的な問題らしい。このサイトのリンク先に下記が書いてあってやってみたら、解決した。

I’ve fixed it by cleaning a build folder. Just went to ‘Product’ menu and Option+Click ‘Clean’. After that a problem was resolved.

Xcode Swift – モーダル

モーダルとは、ポップアップ的だけど全画面ででてくるようなやつのことをいうと考えております。

こんな感じで表示させます。

modalのアニメーションには、色々な種類があってかっこいいです。
アニメーション設定は、上記の下記でやります。

FlipHorizontal以外には、下記のようなものがあります。これで全部ではないでしょうか?

Xcode Swift – イベント

ボタン押したよイベント

viewDidLoadメソッドは、viewがロードされたときに呼ばれるメソッド。ここでイベントの設定できる。
btn1をTouchUpしたら押されたよとコンソールに表示するには下記のようにする。

下記のようにremoveTargetで、イベントとの関連を消せる

ジェスチャーしたよイベント

UIGestureRecognizerというのを使うと、ジェスチャーを検知できる。

スワイプ

回転

タップとダブルタップ
ダブルタップをすると最初にタップを検知し、次にダブルタップを検知する。ダブルタップだった場合タップを検知したくない場合は、requireGestureRecognizerToFailというのを使う。

画面のどこをタップしたのか知りたい

イベントを送ってきたやつはsenderというのですが、sender.locationInView(self.view)とやると、view内の位置を取得できる。

Xcode Swift – AutoLayout

Alignアイコンをクリックすると、こういうのが出ます。cssのtext-align: center;と同じで、左揃え・中央揃え等の設定を行うことができます。これによって、いろいろな画面サイズに対応できます。

Alignment

それぞれの意味は下記になります。

複数UI部品間の設定

Leading Edges: 文章の読み始め側の端を揃える
Trailing Edges: 文章の終わり側の端を揃える
Top Edges: 上端を揃える
Bottom Edges: 下端を揃える
Horizontal Centers: 水平方向の中央揃え
Vertical Centers: 垂直方向の中央揃え
Baselines: ベースラインを揃える

特定部品と親View間の設定

Horizontal Center in Container: 親Viewの水平方向中央に表示
Vertical Center in Container: 親Vierの垂直方向中央に表示

最背面にしたい

storyboardのEditor->Arrangeを利用すればできる。
「send to Back」が、最背面、「send Backward」が1つ
下。

画像の配置を調整したい

Image Viewに画像を設定すると表示されますが、空白埋めたいとか、画像の比率は変えたくないとかいう問題が発生します。
Modeで設定します。「Scale to Fill」はよくわかりません。「Aspect Fit」は画像の比率を変えずにViewに収まる最大のサイズで表示します。「Aspect Fill」は、画像の比率を変えずに、確実にViewが埋まるように表示します。よって、画像の一部が非表示になる可能性があります。

上記のAspect Fillをコードで書く

UIImageViewのcontentModeに、UIViewContentMode.ScaleAspectFillとかを設定する。
(参考:UIImageViewのサイズを自動的に画像に合わせる方法のSwift版

AutoLayoutをコードで書く

参考:
コードでAutolayout
http://www.slideshare.net/classmethod/i-os-auto-layout
SwiftでAuto Layoutがめっちゃ楽に書けるライブラリ「Crew」

Xcode Swift – AppDelegateに変数をもたせて共有する

AppDelegateクラスに下記のように変数を設定する

ViewControllerに下記のように書くとAppdelegateの変数にアクセスできる

ちなみに、viewWillAppear(animated: Bool)というメソッドは、画面が表示されたときに呼ばれるやつらしい。
なので、下記のように書くと、画面が表示されたら、コンソールにほげと表示される。

Xcode Swift – 2画面を行ったり来たりする

Main.storyboardでViewControllerを追加しても、ViewController.swiftと連携させないといけない。1画面に1つのViewControllerが必要。新しくViewController.swiftを作成して、Xcodeの右側にある設定画面でひもづける。最初の画面から2番目の画面の遷移を設定するのは、Segue接続で簡単にできる。2番目の画面から1番目の画面に戻る場合は、2番目画面のボタンをExitにひもづけるが、1番目のViewController.swiftに下記コードを入れておく必要がある。

Exitにひもづけると、上記のreturnMenuが選択できるようになる。

2番目から1番目にSegue接続しない理由は、Segue接続だと新たに画面をつくるからで、行き来するたびに画面が量産される状態はよろしくないということらしい。

Segueには名前(identifier)をつけることができる。1番目から2番目に遷移するSegueに2ndSegueという名前をつけると、下記のようなコードで、1番目にあるボタンをクリックすると2番目に飛ぶようにできる。