月別アーカイブ: 2015年11月

UIAlertViewから【UIAlertController】へ。

ちょっと前になりますが、UIAlertViewは非推奨になって、UIAlertControllerを使うことになったそーです。

使ってみたらdelegateとか使わないし、アラートごとに書けるし、便利でした。

一応自分用纏め。
参考サイト
Objective-C – iOS8でのダイアログ表示:廃止になるUIAlertViewと推奨されているUIAlertControllerのメリット – Qiita
UIAlertControllerでアラートやテキスト入力モーダル画面を出す。 – @niwakk7 iPhoneアプリ作っていますよ

書き方は色いろあるみたい。
とりあえず使ってみるのが良いね。

イメージビューに取り込んだイメージの表示の仕方。imageView.contentMode

イメージビューと画像のサイズや縦横比が違う場合の表示の種類。

imageView.contentMode = UIViewContentModeScaleAspectFit;
縦横比を維持したまま画像全体を表示。サイズが合わないと隙間が出来る。
iOS Simulator Screen Shot 2015.11.09 19.04.15

imageView.contentMode = UIViewContentModeScaleAspectFill;
縦横比を維持したままイメージビューを画像で埋める。サイズが合わないと画像が切り取られる。
iOS Simulator Screen Shot 2015.11.09 19.11.55

他にも色々あるけど実際使うんはこの2つちゃうかなあ?

UIImagePickerを使ってカメラロールの写真を表示する。

UIImagePickerを使ってカメラロールの写真を表示します。
1年半くらいアプリ開発やってて写真とか画像とか扱ったことなかったことに自分でビックリ。w

とりあえず、Single View Applicationで新規に作ります。

UIButtonとUIImageViewを設置します。

スクリーンショット 2015-11-09 17.49.33

UIImageViewはimageViewでプロパティ接続、UIBttonはselectImageでアクション接続しました。

UIImagePickerにはNavigationControllerDelegateも必要なので、
を忘れずに。

以下簡単にコード。

起動するとこんな感じ。
iOS Simulator Screen Shot 2015.11.09 17.59.33

画像を選ぶ、を押すとカメラロールへのアクセスの許可を聞いてくる。
iOS Simulator Screen Shot 2015.11.09 17.59.43

カメラロールを選んで、
iOS Simulator Screen Shot 2015.11.09 17.59.49

写真を選ぶと、
iOS Simulator Screen Shot 2015.11.09 17.59.56

選んだ写真が表示されました。
iOS Simulator Screen Shot 2015.11.09 18.00.06

意外と簡単でした。ヽ(^。^)ノ

MasterDitailをつかってTodoリストを作る。じぶんなりに。4

今回で最後です。

前回までにMaster-Ditail Applicationをつかってリストを作り、新規で作成、セルを選んでDitail画面で修正して戻ってくる、というところまで出来ました。

あとは保存です。
データとして保存しておかなければアプリを終了すると全部消えてしまいます。

セーブするのにuserdefaultを使いました。
保存される内容にmutabuleが含まれるので、ロードする時にmutablecopyを使っています。

コードはこんな感じ。

んでもってviewDidLoadに[self load];を設置。

[self save];はinsertNewToDoメソッド、replaceToDoAtIndexメソッド、- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath(たぶんセルを削除するメソッド)、の3ヶ所に書いた。

appDelegate.mに書く方法もあるが、どっちが良いんだろうなー、と、思案してます。

とりあえず、これで基本的な複数の要素の有るTodoリスト的なものが出来たと思う。
これに日付を入れれるようにするとか、並べ替えが出来るようにするとか、そーゆー要素を付け加えて行けば良いんじゃないかな。

あっちの本、こっちの本、ネット等々から寄せ集めて出来た感じなので、これでよいのか自信ありません。
再度記しておきますが、これは自分なりに備忘録として残してるものなので、おかしな所があったとしても責任はもてません。
こーした方がいいんじゃない?という意見があれば大歓迎ですが、理解できるかは不明です。(^_^;)

うじゃうじゃ。

MasterDitailをつかってTodoリストを作る。じぶんなりに。3

続きます。

前回、新規の+ボタンでDetail画面に行って保存で戻ってくる所まで出来ました。
次はすでにあるセルをタップして編集に行きます。

Master-Detail ApplicationではセルをタップするとDetail画面にセグエする仕様になっています。

このセグエにはshowDetailというidentifierが付いています。
スクリーンショット 2015-11-09 13.31.58

セグエで移動する前に呼ばれるのはprepareForSegueメソッドです。
この中でshowDitailでセグエする場合の処理を書きます。

この中で編集されているセルが何番目のセルなのかを保持する方法がよーわからんかったので、DetailViewControllerにまで持って行って保持した。
Master画面でそれなりのプロパティをつくっておけばよかったのかな?

とりあえずDetailViewController.hにindexPathプロパティを作る。

んでからMasterViewController.mのprepareForSegueメソッドの内容を記述。

これで、セルの内容をDetail画面に送り出したわけですが、まだDetail画面の受け取り準備が出来てません。
Detail画面で受け取ったtodoの内容をそれぞれテキストフィールド、テキストビューに入れます。

DetailViewController.mのconfigureViewを修正します。

これでMaster画面から送られてきたセルの内容がDetail画面で表示されるようになりました。
しかしこのままでは保存ボタンを押すと新規のセルとして保存されてしまいますのでそれを修正します。

MasterViewController.mのunwindToMasterを編集します。
遷移先に送ってあったセルの番号を取得し、中身が無ければ新規保存、有るなら内容修正のメソッドに行くようにします。

セルの内容修正のメソッドは

これで新規でTODOを作る、作ったTODOをDetail画面で修正して戻るとこまで出来た。

MasterDitailをつかってTodoリストを作る。じぶんなりに。2

前回からの続き。

さて、Todoリストをの作り方で僕が一番悩んだのはタイトルや日付、内容といった複数の要素をどーやって保存してるんだろう?ってこと。
いろいろと調べて行き着いたのは、一つのtodoをNSDictionaryで作って、それをNSMutableArrayに入れて保存しているらしい。いわゆる入れ子構造なのかな?
色々とやりかたは有るんだろうけどそんな感じで進めていく。

まずは、StoryboardのDetail画面が寂しいのでテキストフィールドとテキストビューを設置する。
言うまでもなくUITextFieldは一行の入力画面で、UITextViewは複数行の入力画面です。
できればautoLayoutで位置の調整をしておきましょう。

スクリーンショット 2015-11-09 10.56.21

んで、2画面にして、プロパティを作ります。
テキストフィールドはtitleField、テキストビューはbodyTextViewにしました。
スクリーンショット 2015-11-09 10.59.51
スクリーンショット 2015-11-09 11.00.26
スクリーンショット 2015-11-09 11.01.26

これらのタイトルと内容を保持するNSDictionary形式のtodoプロパティを作りましょう。
ちなみにこれはMasterViewControllerからも使うのでヘッダファイルDetailViewController.hに作ります。

スクリーンショット 2015-11-09 11.09.50

さて、コードを書いていきます。
先ほど中身を削除したconfigureViewを再利用します。
Master画面の+ボタンで来た場合、todoの中身はありません。
なので無いことを確認して、新しく、todoを作って入力して表示させます。

内容を入力したら戻らないといけません。
保存ボタンを付けてMaster画面に戻れるようにします。
前回の+ボタンのようにbarButtonItemをDetail画面の右上に設置します。

スクリーンショット 2015-11-09 11.33.36

このボタンからセグエの復路を辿るのですが、MasterViewControllerにunwindToMasterメソッドがないとExitに接続できません。

スクリーンショット 2015-11-09 11.35.31

なのでMasterViewController.mにunwindToMasterメソッドを追加します。

これで保存からExitに繋がるようになります。
スクリーンショット 2015-11-09 11.45.11

そしてunwindToMasterメソッドに接続します。

スクリーンショット 2015-11-09 11.45.32

今回は元々あるMaster-Detail Applicationを使っているので保存せずに戻る為のボタンがすでに有りますが、自分で新たにViewを作った場合など、セグエを戻るルートが複数ある場合、ルートによってidentifierを設定しておいた良い場合があります。
一応今回もidentifierをsaveTodoとして設定しておきます。
詳しくはsegueで戻る時のidentifierの設定。こっちを見てね。

スクリーンショット 2015-11-09 11.49.19のコピー

Master画面に戻る前に書いた内容をtodoに入れます。
prepareForSegueメソッドはセグエの移動の前に呼ばれるメソッドです。

保存からMaster画面に戻ったらまずunwindToMasterメソッドに入ります。

すでにあるセルを呼び出して変更した場合と、新規でtodoを作ってきた場合で処理が変わるのですが、まずは新規でtodoを作ってきた場合の処理を書きます。

戻ってきたらDetailViewControllerのtodoを呼び出してinsetrNewTodoに渡します。
insertNewTodoでは、NSMutableArrayプロパティのobjectsがあるかどうか確認してなければ作ってからその中に格納しています。

最後に- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath メソッドでテーブルに表示される内容を変更します。

これで起動すれば+ボタンでDitail画面に行って、保存して戻ってくることが出来ます。
ただ、まだセルを選択してDitail画面に行った場合の処理を書いていないので正常動作しません。

MasterDitailをつかってTodoリストを作る。じぶんなりに。1

MasterDitailをつかってTodoリストを作る手順を自分なりの備忘録として残してみる。

新規プロジェクトでMaster-Detail Appricationを作成。

スクリーンショット 2015-11-09 10.05.22

Master画面の右上から直接新規画面に行きたいので右上のBarButtonItem関連を削除。

スクリーンショット 2015-11-09 10.08.11

insertNewObjectsメソッドも使わないので削除。

スクリーンショット 2015-11-09 15.13.24

画面をStoryboardに切り替えてBarButtonItemを設置、identifierをaddに変更すると+ボタンになる。

スクリーンショット 2015-11-09 10.13.32のコピー

Detail画面のラベル関連setditailItem関連は使わないので削除。

スクリーンショット 2015-11-09 10.26.24
スクリーンショット 2015-11-09 10.25.53
MasterViewControllerにもあるので削除
スクリーンショット 2015-11-09 12.20.15

先ほど設置したaddBarButtonItemからDetail画面にセグエを設定。
スクリーンショット 2015-11-09 10.30.47

showを選択。
スクリーンショット 2015-11-09 10.32.31

これで、Masterがめんの+をクリックするとDetail画面に行くようになった。
一度Runさせて確認してみましょう。

adMobのインタースティシャル

adMobのインタースティシャル広告を入れてみた。

ここを見ながら。
インタースティシャル広告  |  AdMob iOS ガイド  |  Google Developers

上記サイトを見ながらそのまま

と入力すると
‘init’ is deprecated
Property access is using ‘setAdUnitID:’ method which is deprecated
と注意された。

そんなのもう使ってないよ。とのことらしい。

んで、英語版のページを見に行くと、
SDK7.2.1から非推奨になってて新しい書き方が載ってた。

翻訳ページ
インタースティシャル広告| iOS用のAdMob | Googleの開発者

initWithAdUnitIDと書くようだ。
日本語版のページも直しておいてほしいものです。

んで、viewDidLoadですぐに
[self.interstitial presentFromRootViewController:self];
を呼んで表示しようとするとダメな様です。

実はそこのエラーで引っかかってました。(;p)

UITextViewが途中から表示される問題。

結構長い間悩んだ問題です。

UITextViewを使って編集不可の長文(取説など)を表示したいのだけど、特に設定しないと、画面を開いた時に何故か途中からの表示になってしまった。
読んでもらう為に書いたので頭から表示したいのだが途中から表示される。

多分こちらのサイトの方も同じ問題と思われる。
iOS – UITextView が初期表示時に勝手にスクロールする – Qiita
xcodeのtextviewのレイアウトについて – textviewに長文を載… – Yahoo!知恵袋

実際こんな感じ。
スクリーンショット 2015-11-07 15.05.26

上記Qiitaのサイトの方はsetContentOffsetで頭から表示させることで解決された。
しかし、それだと途中まで読んでページ遷移して戻ってくるとまた頭からの表示になってしまう。
戻ってきたら続きから見たい。

それで悩んだ挙句2chで質問したらアッサリと解決策を提示してもらえた。

「contentOffsetを保持しておいて、viewDidAppearでセットすればいいよ。」

なるほどーって書いたコードがコチラ。

かなり乱暴な気がしますが(^_^;)、これで思ったように動いたのでとりあえずは良しとします。

adMobでスマートバナー、ふたたび

adMobでスマートバナーとか広告サイズがわからんかった。という記事を書いた。

未だによく理解はできてないんだけど、新たに設置する機会があったのでまとめてみた。

前の記事ではkGADAdSizeSmartBannerPortraitをどこに入れるかで悩んだけど、ひょっとしたら必要ない?
むしろautolayoutの設定のほうが大事だったりするかも。

今回やった内容はこんな感じ。

StoryboardでViewを設置。
スクリーンショット 2015-11-07 14.34.46

わかりやすくするために色を付けました。

ViewのカスタムクラスをGADBnnerViewに変更。
スクリーンショット 2015-11-07 14.34.27

ViewのHorizontal Centerで中心を設定。
スクリーンショット 2015-11-07 14.22.10

Viewのコンストレイントで上から0,左右に-16,幅が320,高さが50,アスペクト固定で決定。
スクリーンショット 2015-11-07 14.21.14

さらにコンストレイントの設定でWidthとHeightを=から>=に変更。
スクリーンショット 2015-11-07 14.43.02

んで、コードはこんな感じ。

これでSmartBanner広告が出た。
スクリーンショット 2015-11-07 14.21.33

ところで、adMobのバナー広告って時間とともに下から消えるのをよく見かける気がするんだけどなにかのえらーなのかな?(^_^;)
↓こんな感じ。
スクリーンショット 2015-11-07 14.37.33

スクリーンショット 2015-11-07 14.45.36

スクリーンショット 2015-11-07 14.51.38

スクリーンショット 2015-11-07 14.56.04