きもちよく文章をかけるiOSアプリ skyline をつくってApp Storeに申請してみました

f:id:keisei_1092:20170226175819p:plain

↑のような感じで、フォントやフォントサイズを自由に変更しながらテキスト編集ができるアプリを作ってみました。

ファイル構成

  • ViewController - テキストビューがあるとこ
  • SecondTableViewController - テキスト表示の変更ができるとこ
  • TextAttributesManager - テキスト表示に関する設定を保持
  • Main (Storyboard) - ↑のビューコン2つをUITabBarで、SecondTableViewControllerの前にUINavigationControllerを挟んでいます

ViewController

f:id:keisei_1092:20170226184843p:plain

テキスト編集が行えるUITextViewが生息しているメインのビューコントローラです。

UITextViewだけだとfixしてしまう(抱える文字数が画面外に出るまで増えないとスクロールできるようにならない)ので、UIScrollViewをかませたんですが、これが非常に厄介で

  • ScrollViewのTop, Bottom, Leading, Trailingを親Viewに設定
  • ScrollViewの子供にViewをかませてTop, B(略 をScrollViewに合わせたあとEqual Width, Equal HeightをScrollViewの親のViewにつなげる
  • ScrollView>View>の子供にTextViewをかませたあと、↑と同じことをする

という手順によってうまくスクロールできるようになりました。

f:id:keisei_1092:20170226184640p:plain

さらにScrollViewのAutoLayoutでLeadingとTrailingを設定しても余白ができてしまったので、追加でAutoLayoutの当該項目を参照して「Relative to margin」のチェックを外すとちゃんとピタッと表示されるようになりました。

キーボードまわり

TextViewをタップしたらキーボードがにゅっとでてきます。このとき文章の後半をいじりたいときにTextViewの下をキーボードが覆ってしまって編集できないという問題が発生します。Google先生に聞いてみるとこれはだいぶ既知のようでStackOverFlowやQiitaでTipsが多く得られましたが一番参考になったのは公式リファレンスでした。コードベースはObjective-C時代のものですが基本的なことがしっかり書いてあります。自分はscrollView.contentOffset.y = keyboardSize.height というふうなコードを書いて解決しました。

キーボードを閉じる方法も幾つかあり、例えばスクロールされたときに閉じるという方法がありますが、編集中に別の場所を見に行きたいことがあります。その度にキーボードが閉じるのが面倒だったので、今回はキーボードの上にUIToolbarを生やし、そこにDoneボタンを置くことで対応しました。せっかくなので文字数カウントもツールバーに追加してみました。

テキスト表示設定まわり

f:id:keisei_1092:20170226184924p:plain

UITabBarをへだててフォントとサイズを変更できるビューを実装しました。

まずフォントを全部表示します。UIKitでは、フォントのファミリー名一覧を UIFont.familyNames で、各フォントファミリー名に対応する太さやイタリックなどの情報を含んだ一意なフォント名を UIFont.fontNames(forFamilyName: ) というプロパティに持っています。これをforEachでブン回して配列にappendしました。

サイズはとりあえず ["16", "24", ...] のような感じでStringの配列で持たせてみましたが、実際にUIFontの引数として使うときにCGFloatへキャストしなければいけないので、最初からCGFloatで持っておいたほうがいいかなーという反省があります。

配列ができたら、 tableView(_ tableView: cellForRowAt indexPath: ) のなかで cell.textLabel?.font = UIFont(name: name, size: pointSize) で実際のフォントでレンダリングさせてあげるとフォントが選びやすいです。選択されている値であればチェックマークをつけておきます( cell.accessoryType = .checkmark )。テキストラベルの色も青色にしたかったのですが、UIColorの中にデフォルトのtintColorがなくて戸惑いました。これは、現在いるビューから引っ張ってくることで解決しました( view.tintColor )。

審査

良い感じにできたので、せっかくなのでApp Storeに申請してみることにしました。

この折に、Developer Programに加入します。円高のときは5桁切ってましたが、昨日加入したときは税込みで1万2千円ぐらいでした。

加入できたら、早速Xcodeの Product → Archive をして、Organizer画面でvalidateをしていくのですが 一回ハマりました。bundle identifierもApp IDsに登録してあるので、なんでや~となってたら iTunes Connect に登録していないのがダメだったようです。Xcode側が追加してくれるものかと思っていましたw iTunes Connectにアクセスし、先にスケルトンを作っておきます。この後はすんなり通りました。Upload to App Store... がコケましたが、これは Application Loader で直ipaアップロードさせることで通過できました。

あとはスクショをパシャパシャ撮ったり説明文を埋めたり価格を設定したりしたらSHIP IT! 無事 Waiting for review という状態になりました。

通ったらいいなー

審査に落ちる懸念があるとしたらローカルのフォントを全部ぶっこ抜いてユーザに選択できるようにしていることかなーと思います。ここらへんはフォントの数を減らすしかないのかもしれませんが、とりあえず楽しみに審査の結果を待ってみたいと思います。