CoreGraphicsコードをSwift 3.0に変換する

Xcode 8.0が登場しました。
旧プロジェクトをXcode 8.0で開くと、Swift 3.0(あるいはSwift 2.4)に変換するよう促すダイアログが出現しました。

CoreGraphicsコードをSwift 3.0への自動コンバートにかけたところ、変換されない部分が残りました。

変換後、このようなコードになったのですが最終的には

と変換したい。

文字列の処理がやりやすいのはなにかしらと考えて、急遽Rubyを学ぶことにしました。


文字列操作とファイル操作の基本的なやりかたを知ったので、以下の変換プログラム converter.rbを書きました。
CGPathMoveToPoint(pathRef, nil, 20, 0)

pathRef.move(to: CGPoint(x: 20, y: 0))

CGPathAddLineToPoint(pathRef, nil, 200, 0)

pathRef.addLine(to: CGPoint(x: 200, y: 0))

CGPathAddCurveToPoint(pathRef, nil, 205.523, 0, 210, 4.435, 210, 10)

pathRef.addCurve(to: CGPoint(x: 210, y: 10), control1: CGPoint(x: 205.523, y: 0), control2: CGPoint(x: 210, y: 4.435))

と変換するものです。

converter.rb

変換したいswiftファイルがあるフォルダに、converter.rbをおき、Terminalでそのフォルダへ移動した後、

と入力するとプログラムが実行されます。
実行すると、

とたずねられるので、そこで変換したいファイル名を入力すると変換が行われます。
(このさい、”_元ファイル名.bak”というバックアップファイルも作成します。)
ファイル名を入力せずにreturnキーを押すと、プログラムは終了します。

関連

Autodesk Graphic(旧iDraw)はCore Graphicsのコードを生成できる – nackpan Blog

2016年8月開発状況

前半

前月に引き続きRepete Plusの開発中。

Repete PlusはRepeteの機能追加版です。
* オーディオファイルの区切り編集機能
* 曲送り・曲戻し
* 早送り・戻しでの秒数指定
* メイン画面の左右下部に設定変更ショートカットボタン
* 歌詞表示

が主な追加機能です。

今月は、7月に引き続き「区切り点編集機能」の作成を行いました。

スクロール、ズーム、区切り点の挿入・削除に加えて、
* 区切り点の移動
* 区間の使用・不使用チェック
機能を追加しました。

後半

Dropbox API

Dropbox APIが、従来のものが廃止されることになり、あらたなAPIを用いて書き直す必要が生じました。
API v1 is now deprecated | Dropbox Developer Blog
そこで、Repeteおよび作成中のRepete Plusの該当部分を書き直しました。

OneDrive API, Google Drive API

Repeteでは、他にOneDriveとGoogle Driveを連携できるクラウドストレージとして設定しています。
OneDrive、Google Driveともに、既存のアプリは従来のAPIを継続して使用できます。
新規に作成するアプリであるRepete Plusでは、最新のものを用います。
8月後半は、そのための書き換えを行いました。

「Repete」(旧「語学学習支援プレイヤー」)をアップデートしました(ver 2.2)

iPhone/iPadアプリ「Repete」(レペテ)(旧「語学学習支援プレイヤー」)をアップデートしました。(ver 2.1.2 –> ver 2.2)

「Repete」(「語学学習支援プレイヤー」)は、流れる言葉が一区切りしたところで、ユーザーが任意の時間ポーズをいれることができます。
リピーティングに便利なオーディオプレイヤーです。

変更点

• Dropboxの従来の接続方式が廃止され、新方式になりました。
API v1 is now deprecated | Dropbox Developer Blog
そこで、アプリ側も新方式を組み込んだものに書き換えました。
(そのため、Dropbox使用の際には、連携をあらためて許可してもらう必要があります。ご了承ください)

当面は従来の 選曲画面で、一番下のセルが選択できないケースがあったので修正しました。


よろしくお願いします。

Dropbox API v1からv2への移行

作成したiOSアプリ「Repete」(語学学習支援プレイヤー)には、Dropbox上のオーディオファイルを取り入れる機能があります。
Dropboxへのアクセスには、Dropboxが提供するAPIを使用しています。
API v1 is now deprecated | Dropbox Developer Blog
Dropbox API v1が廃止され、新たなアプリおよび既存のアプリはAPI v2を使ってDropboxと接続する必要があるとのことで、今回、移行処理を行いました。

File Type Permissionが廃止された

API v1には、File type Permissionという分類がありました。特定の種類のファイルのみアクセスできるというものです。
API v1 → API v2 migration guide – Developers – Dropbox
API v2では、File Types Permissionがなくなりました。移行にあたっては新たにアプリを登録して、ユーザーにもう一度認証してもらうことになります。

Tip: When messaging to your users the need to re-link their Dropbox account, we suggest the following language: “The Dropbox integration has changed. Please re-link your account to continue [syncing/backing up data/accessing files/etc].”

再リンクの必要を伝えるメッセージの例。

Fie Types Permissionのように特定の種類のファイルのみを取得するには、ファイル拡張子を用いて判別します。
Developer guide – Dropbox
こちらに、API v1でFile type判別に用いていた拡張子の一覧があります。

インストール

Swift製のライブラリをインストール。
Dropbox for Swift Developers | Install
こちらのページにそって、インストール。
AlamofireとSwiftyDropboxがインストールされます。
今回インストールしたバージョンは、
Alamofire: 3.3.1
SwiftyDropbox: 3.2.0

チュートリアル

Dropbox for Swift Developers | Tutorial
チュートリアルでは、アプリを登録して簡単なプロジェクトを作成しました。
チュートリアルプロジェクトでできること。
* Dropboxとの連携許可
* ユーザーのアカウント名を表示
* 指定したフォルダ直下の内容を表示
* ファイルのアップロード
* ファイルのdiskへのダウンロード
* ファイルのメモリへのダウンロード

おおよそやりたいことはできるのだけれど、そのほかに知りたい点がいくつか。
Tutorialを改造しながら、さぐりさぐりで調べていきました。

そのほか調べた事柄

ファイルの情報を知る

getMetadataを用いる。

フォルダかファイルか?

取得したmetadataがフォルダなのかファイルなのか知りたい。
Files.FolderMetadata、Files.FileMetadataを用いる。

ファイルの種類を限定

Dropbox for Swift Developers | Overview
こちらのページで紹介されているSample Appの”PhotoWatch”では、

という書き方をしています。
拡張子をチェックして判別しています。
参考:Developer guide – Dropbox
Dropbox API v1でFile type判別に用いていた拡張子の一覧あり。

フォルダ下のすべてのフォルダ・ファイルを取得する

listFolderのさいに、recursiveをtrueにすることで再帰的に調べてフォルダ下のすべてのフォルダ・ファイルが取得できます。

進行状況

進行状況を知るには?

参考:swift – SwiftyDropbox download progress – Stack Overflow

リクエストをキャンセルする

ダウンロードのリクエストをキャンセルするには?
swifty dropbox download cancel – Dropbox Community
こちらのページを読むと、初期はダウンロードキャンセル機能はなかったようです。
最新版ではあるとのこと。
SwiftyDropbox 3.2.0ではありました。

こんな感じでしょうか。
Storyboard側にキャンセル用ボタンを配置してViewController.swiftのcancelButtonPressedとactionでつないであるものとします。
Dropboxにリンクしている状態で、viewDidLoadが呼ばれると、ルートフォルダの”audio.mp3″のダウンロードが開始されます。
キャンセルボタンを押すと、ダウンロードがキャンセルされます。


以上、SwiftyDropboxの使い方について、いくつか知った事柄について記しました。

2016年7月開発状況

前月に引き続きRepete Plusの開発中。

Repete PlusはRepeteの機能追加版です。
* 歌詞表示
* 曲送り・曲戻し
* 早送り・戻しでの秒数指定
* メイン画面の左右下部に設定変更ショートカットボタン
* オーディオファイルの区切り編集機能
が主な追加機能です。

今月は、「区切り点編集機能」の作成を行いました。

7月初頭。UIScrollViewを使用しないで、グラフをスクロールさせる機能を作ったものの、UIScrollViewのスピードに乗ったスクロールやバウンドがない。やはり、UIScrollViewを使用することとした。

UIScrollViewのあつかいかたを学ぶ。重くならないように、必要なぶんだけグラフを描画する。

UIScrollView、スクロールすると、scrollViewのoriginが変化する。
scaleが変化すると、scrollViewが持つviewのframeのsizeも変化する。

スクロール、ズーム機能の実験

tapして点を消したり、加えたりする。Tap Gesture Recognizerを用いた。

スクロールとズームを横方向に限定

区切り点の編集機能を作成中

ここまで作ったところで、やはり指先tapでは位置がおおまかになってしまい、狙った点にいまいちtapできないなと感じました。
tapで点を置いた後、点をドラッグすると移動できることとしました。
その機能を作るのに難航して7月が終了してしまいました。

フッターの幅をコンテンツの幅に揃える

現在、このblogでは、Wordpress提供のテーマ「Twenty Fifteen」を基にした子テーマを使用しています。
もとのTwenty Fifteenよりもサイドバーをややせまくしています。
ブログのデザインを変更した – nackpan Blog

フッターの幅をコンテンツの幅に揃える

コメントにて、フッターの幅をコンテンツの幅と合わせる方法について質問をもらいましたので、これを機にやり方を調べました。

レスポンシブデザイン

Twenty Fifteenでは、メディアクエリを使うことで画面の幅によって、適用するスタイルを変えています。

現在使用している子テーマでは、
* Desktop Small 955px
* Desktop Large 1240px
のときのサイドバーの幅を変更しています。
そのさい、フッターはコンテンツ部分とずれて表示されています。
(元のTwenty Fifteenではフッターとコンテンツ部分は揃っている)
* Desktop Small 955px
* Desktop Large 1240px
でも、フッターとコンテンツが揃うようにCSSを見直しましょう。

関係部分の構造。

20160711css_structure
footerはsite-contentと同じ階層にあります。
site-contentの下に、いくつか階層を挟んで記事、コメント、ナビゲーション部分があります。

marginとwidth

marginとwidthで位置と幅を指定しています。
今回のCSSでは、パーセントで指定しています。
このパーセントは親要素の幅を基準とします。

Desktop Small 955px(幅が955px以下の場合)での
site-contentの位置・幅。
20160712content

ナビゲーション部分の位置・幅。
20160712nav

これを踏まえて、site-footerとコンテンツ部分との位置・幅がそろうようなmarginとwidthを求めます。
margin。
20160711footer_margin

width。
20160711footer_width

計算した結果。
Desktop Small 955pxでは、footerの適切な位置・幅は
margin-left: 26.2939%;
width: 58.824%;
となりました。

おなじように、画面幅Desktop Large 1240pxでもfooterの適切な位置・幅を計算すると
margin-left: 28.8772%;
width: 64.6574%;
となりました。

これらを加味して、CSSは以下のようになりました。


これでブラウザの幅を広げたり縮めたりしても、フッターがコンテンツ幅と同じに保たれます。

2016年6月開発状況

今月からRepete Plusの開発を本格的に再開しました。
(去年、Objective-C版で開発に手をつけたあたりで、RepeteのほうのSwift移行およびプレイヤーの抜本的改修の必要があり、それに半年かかってしまいました)

Repete PlusはRepeteの機能追加版です。
* 歌詞表示
* 曲送り・曲戻し
* 早送り・戻しでの秒数指定
* メイン画面の左右下部に設定変更ショートカットボタン
* オーディオファイルの区切り編集機能
が主な追加機能です。

1日~22日

Repete Plusの開発。
* 画面レイアウト
* Repeteの機能の移植
* 歌詞表示機能
を行いました。
また、この時期には並行して、関数型プログラミングの考え方を理解しようと「すごいHaskellたのしく学ぼう!」を読み進めていました。

23日~28日

RepeteのPicker、Playerの動作確認中にいくつか挙動がおかしい箇所を発見。
選曲画面で一番下のセルが選択できないケースがあったのを修正。
Playerで用いているKVOにおいて、removeObserverが立て続けに呼ばれる可能性がまれにあり、crashを引き起こすので、その部分を修正。

29日、30日

Repete Plusの開発。
* 曲送り・曲戻し機能

開発中の画面

「Repete」(旧「語学学習支援プレイヤー」)をアップデートしました(ver 2.1.2)

iPhone/iPadアプリ「Repete」(レペテ)(旧「語学学習支援プレイヤー」)をアップデートしました。(ver 2.1.1 –> ver 2.1.2)

「Repete」(「語学学習支援プレイヤー」)は、流れる言葉が一区切りしたところで、ユーザーが任意の時間ポーズをいれることができます。
リピーティングに便利なオーディオプレイヤーです。

変更点

• バグの修正を行いました。
選曲画面で、一番下のセルが選択できないケースがあったので修正しました。

• 安定性の向上
プレイヤーの安定性を向上させました。
(技術メモ:KVOでremoveObserverが2回連続して呼ばれてcrashすることがまれに起こりうるので、この問題を修正しました)


よろしくお願いします。