Swiftでオブジェクトのアドレスを表示する

Swiftでオブジェクトのメモリアドレスを表示するには?

Objective-Cでは、

と、%pを使うことで、アドレスを知ることができた。


Swiftでは

と、unsafeAddressOfを用いることで、アドレスを知ることができる。

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

Autodesk Graphic(旧iDraw)は、図形からCore Graphicsのコードを書き出せることを先日知ったので、記します。

言語を選択

環境設定 > 読み込み / 書き出し
で、SwiftかObjective-Cかを選択
ss 2016-02-07 8.05.12

クリップボードへ書き出し

必要なレイヤーを選択して、Ctrl+クリック(もしくは編集メニュー)から、
別名でコピー > Core Graphics Codeを選択。
ss 2016-02-14 22.19.30
これでクリッブボードにコードがコピーされています。
ペースト(Ctrl + Vなど)すると、以下のようなコードが貼り付けられます。

省略してしまいましたが、インナーシャドー、グラデーション、輪郭線を用いた角丸四角形と三角形を描くのに130行程度のコードになっています。

生成されたコードからUIImageを作成

生成されたコードでは、CurrentContextを用いて、そこに描画しています。
サイズを指定してContextを作成し、それをCurrentContextとするのには
UIGraphicsBeginImageContextWithOptionsが使えます。

こんなかんじで、UIImageに持ってくることができます。

スケールについて

生成されたコードではコメントアウトされているCGContextScaleCTMを生かしてscaleFactorを変えれば、スケールの変更ができます。

一部書き方があっていないところあり

Autodesk GraphicのVer 3.0.1を使用しているのですが、一部、書き方がSwift 2.1に適合していない部分がありました。
グラデーションのOption指定部分を修正しました。

テキスト

テキスト部分を書き出してみるとCoreTextを使用したコードで書き出されました。
Path化されてしまうのではなく、テキスト情報が残っています。
ss 2016-02-14 22.54.08

一部でエラーが出たので修正しました


ということで、Autodesk GraphicはCore Graphics Codeを書き出せます。

関連

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

Swiftで作成中のプロジェクトにObjective-Cのファイルを導入する

Using Swift with Cocoa and Objective-C (Swift 2): Swift and Objective-C in the Same Project
こちらのページにやり方書いてあるので、これに従ってやっていこう。

  1. Objective-Cのファイルを追加する。

  2. 追加するとXcodeが尋ねてくるので、YESとすると、bridging-header.hが作成される。

  3. bridging header fileに、Objective-Cで作成したクラスの必要なヘッダファイルをimportする。

  4. これで、Objective-Cで作ったクラスが扱えるようになる。

やってみよう

RPMediaPlayer.h
RPMediaPlayer.m
RPItem.h
RPItem.m

この4つのファイルを使用したい。

RPMediaPlayer.hはAVFoundationフレームワークと、”RPItem.h”をimportしているのだけども、この場合はどうなるのか?

RPMediaPlayer.h

RPMediaPlayer.hファイル追加。そして、RPMediaPlayer.mファイルを追加したところで、Xcodeが尋ねてきた。
ss 2015-10-11 9.43.27
“Create Bridging Header”を選択した。
すると、プロジェクトに、プロジェクト名-Bridging-Header.hファイルが加わっている。

RPItem.h、RPItem.mをプロジェクトに追加。

プロジェクト名-Bridging-Header.hに、

#import “RPMediaPlayer.h”

と記述。

これで、Swift側のファイルから使えるようになった。

ViewController.Swift

これでちゃんと動作した。

2014年11,12月開発状況

2014年11,12月開発状況

11月

クラウドストレージから読み込み機能作成中

語学学習支援プレイヤー」をアップデートすべく、開発中。
作成中の機能 : クラウドストレージ(Dropboxなど)のオーディオファイルを読み込んで使用できるようにする

  • クラウドストレージから読み込むさい、フォルダ指定できるようにする。
  • クラウドストレージから読み込み中、他の曲を選択して再生することができる。
  • 読み込みを途中でキャンセルできる。

ファイル管理画面をどうするか?
いままでは、
たとえば、アルバムタブだと、
アルバム一覧ー>各アルバム詳細
のように、一覧ー>詳細
の2層構造。
(「曲」タブのみ、一層)
「ミュージック」アプリの形式に合わせていた。

「クラウドストレージから読み込み」でのファイル管理。
クラウドストレージは、フォルダの中にフォルダをもてる階層構造なので、それを表現できる画面にする必要が有る。
読み込んだ後の「ローカルでのファイル管理」でも階層構造をもつこととする。
ローカルでのファイル管理画面では、フォルダの新規作成、ファイル名変更、アイテム移動(ファイル、フォルダの移動)ができるようにしよう。
まずは、ファイル管理画面で階層構造をもつことができるようにした。
CustomTableViewControllerのテーブルのセルをタップすると、新たなCustomTableControllerのインスタンスを作成し、navigationControllerにpushするようにした。

Dropboxのファイルを扱うには、Dropbox APIを使う。調べた。

Drop-ins
簡単にDropboxファイルにアクセスできる仕組み。Dropbox上のファイルを選択する画面があらかじめ用意されている。
Drop-insにはChooserとSaverがある。
Chooserで、ファイルをひとつ選択すると、複雑なURLを生成する。
これをダウンロードするなりなんなりする。

インターネットとの通信がでてきた。いままでやっていなかったこと。
iOSで、インターネット上のファイルをあつかう機能を調べてみよう。
iOS 7 から登場したNSURLSessionを使うと、URLを指定してその内容をダウンロードする処理が扱いやすい。
NSURLSessionを使って、インターネット上のファイルのダウンロードの実験をやってみた。
NSURLSEssionでは、アプリを閉じてもダウンロード処理できる。複数のタスクをダウンロードできる。
あつかいやすい。

Drop-insのchooser。これは、クラウドストレージの選択画面があらかじめ用意されていて簡便だ。しかし、複数のファイルを選択する方法、フォルダを選択する方法がみあたらない。

そこで、Dropbox APIのCore APIを使うこととした。

12月

Core APIを使ってDropboxからアイテム読み込み

Core APIを使ったダウンロードだと、アプリ終了後のダウンロードはNSURLSessionのようにはできないようだ。
アプリ終了後しばらく動作できるbackground task(iOS 7だと3分間)を使うこととする。

Dropboxからアイテムを読み込む際、フォルダが選択できるようにしたい。
Core APIで、フォルダに相当するURLを指定してもエラーになる。
なので、フォルダの中を順繰りにめぐってファイルpathを取得するようにした。

また同名のアイテムがあった場合、上書き確認の必要。ー> つくった。

途中経過をテーブルに表示する。ー> 読み込み中は、セルにインジケーターとプログレスバーを表示すようにした。

「クラウドストレージから読み込み」では、「アイテム(ファイルもしくはフォルダ)の選択」をおこなう。
フォルダセルをタップしたとき、どう動作するか悩む。
「クラウドストレージから読み込み」では、「アイテム選択」のみ行うので、セルの左2/3ぐらいをタップした場合は、フォルダを選択。セルの右1/3をタップした場合はフォルダの内容を展開することとした。
どこが境界かわからないと、操作に納得感がなかったので、点線をいれた。

ローカルでのフォルダ・ファイルの扱い。

ローカルでは、ファイルのみ選曲できるようにしていたのでこれを踏襲。
編集モードは、アイテム選択して、削除、名前変更、移動ができるようにした。また、フォルダの作成ができるようにした。

削除 : アイテムを削除する。このさい、確認メッセージをだすこと。そのさい、「ファイルひとつ」「フォルダひとつ」「複数ファイル」「複数フォルダ」「複数アイテム」で分けた。
名前変更 : アイテムの名前を変更する。
移動 : アイテムの移動。新たなnavigationControllerを作成。移動用tableControllerをルートフォルダ分から現在表示しているフォルダ分まで作成し、navigationControllerにpushする。そして、naviagationControllerを現在のviewからモーダルに表示するようにした。

フォルダの作成 : 新たなフォルダを作成する。末尾が’.’のフォルダ名などは作成できないようにして、メッセージを表示するようにした。

ここまで、できた。

[Objective-C]MPVolumeViewを使う (外観を変更する)

前回([iOS]MPVolumeViewを使う)のつづき。

iOS7でのMPVolumeViewのデフォルト表示。
defaultVolume
MPVolumeViewは、外観を変更することが出来る。
tintColorの変更で、ツマミの左側の色を変更する。赤色にしてみた。

redVolume

画像を用いる場合。

volumeSliderMin@2xvolumeSliderThumb@2xvolumeSliderMax@2x

左から、volumeSliderMin.png, volumeSliderThumb.png, volumeSliderMax.png
Retina用にサイズを2倍したものも用意。

コードは、以下のようになる。

実機では、このようになってほしい。
customVolumeSlider

ところが、iOS7にアップデートしたところ、画像を用いたMPMediaViewの表示がおかしくなった。
使用機種:iPhone 4s
iOSバージョン:iOS7.0.2
volumeを最大にしている状態、すなわちツマミを右端に寄せている状態で描画した場合に発生。
rightPos
そこから、ツマミを移動すると・・・
wrongversion
右端部分がおかしい。
mighihashi

しかたがないので、右側の画像の透明部分をやめて、背景色で塗った。
correctVersion

[Objective-C]iOSで、ミュージックライブラリにアクセスして音楽を再生する

(2015年9月14日追記。
Swift版の記事を書きました。
[iOS][Swift]ミュージックライブラリにアクセスして音楽を再生する(MPMusicPlayerController使用) | nackpan Blog
ごらんください。)


iOSで、ミュージックライブラリにアクセスして音楽を再生する方法。
このappleのドキュメントにライブラリにアクセスして再生する方法、必要な曲を選択する方法、現在再生中の音楽の情報を知る方法等、まとめてある。
(ちなみに、日本語ドキュメント – Apple DeveloperのページにappleのiOS用日本語ドキュメントがまとめてある。英語版へのリンクもある)
今回は、ミュージックライブラリから音楽を選択すると音楽がスタートするようにし、再生、一時停止、停止ができるようにする。
iOSシミュレータでは動作しないので、実機を用いてください。

Single View Applicationでプロジェクトを作成。名前はsampleMusicPlayerにしてみた。 スクリーンショット 2013-08-11 21.37.44

MediaPlayerフレームワークを加える。 スクリーンショット 2013-08-11 21.39.39 「+」ボタンを押すと、フレームワークがずらりと現れるので、そのなかから、MediaPlayer.frameworkを加える。 スクリーンショット 2013-08-11 21.40.19 ViewController.hにMediaPlayerフレームワークをimportする。 スクリーンショット 2013-08-11 21.41.07

ボタンを配置。 スクリーンショット 2013-08-12 11.38.12

ボタンとViewController.mにactionを作成してつなげる。 スクリーンショット 2013-08-12 11.38.27

プレイヤーを表すpropertyをViewController.mに加える。 スクリーンショット 2013-08-12 12.07.33

プレイヤーのインスタンスを作成。 スクリーンショット 2013-08-12 12.18.01 (ここで、applicationMusicPlayerではなく、ipodMusicPlayerを用いると、「ミュージック」での再生状況(再生アイテムや、シャッフル、リピートなどのモード)を反映したものになる)

曲を選択するために、メディアアイテムピッカーを用いる。
(メディアアイテムピッカーというのは、iOSで用意されているあらかじめ設定済みのModalViewController。ミュージックライブラリの選択画面と同じようなことが出来る) スクリーンショット 2013-08-12 13.30.57

(iPodライブラリアクセスプログラミングガイドより)

メディアアイテムピッカーでの「選択完了したとき」や「キャンセルされたとき」のイベントを、ViewControllerで受け取れるようにする。
そのために、ViewControllerをメディアアイテムピッカーのデリゲートとして設定する。
「選曲」ボタンを押すと、メディアアイテムピッカーを作成して、デリゲートの設定を行い、ライブラリの曲を選択できるようにする。
「選択完了したとき」「キャンセルされたとき」のメソッドを記述する。 ViewController.h スクリーンショット 2013-08-12 15.15.51 ViewController.m スクリーンショット 2013-08-12 16.21.34

各ボタンのアクションに、「再生」「一時停止」「停止」機能を加える。 スクリーンショット 2013-08-12 19.47.50

iOSシミュレータでは動作しません。実機を用いてください。 「選曲」ボタンを押すと、メディアアイテムピッカーが表示され、曲を選択すると音楽がスタートします。「再生」ボタンで音楽の再生。「一時停止」ボタンで一時停止。「停止」ボタンで音楽を止めて、再生位置を一番始めに戻します。
ViewController.h

ViewController.m

関連記事

[iOS]AVPlayerを使う | nackpan Blog AVFoundationフレームワークのAVPlayerクラスを使って、ミュージックライブラリの楽曲を再生する。

[Objective-C]iOSで、リソースファイルから音楽を再生する

リソースファイルから音楽を再生。

「再生」「一時停止」「停止」ができればOK。生のオーディオデータを加工したりはしない。という条件ならば、AVFoundationフレームワークのAVAudioPlayerを用いると簡便。

まずは、SingleApplicationでプロジェクトを作成。プロジェクト名はSampleAVAudioPlayerにしてみた。
2013-08-08_01.0createProject
2013-08-08_01.1createProject

AVFoundationフレームワークを加える。
2013-08-08_02addFramework

ViewController.hにAVFoundationフレームワークをimportする。
2013-08-09_02.1importFramework

ボタンを配置。
2013-08-08_03layoutBtn

ボタンとViewController.m間に、Actionを作成してつなげる。
2013-08-08_05action

使用するオーディオファイルをプロジェクトに加える。
2013-08-08_06addSound

オーディオプレイヤーを現すpropertyをViewController.mに加える。
2013-08-08_07addProperty

オーディオプレイヤーにオーディオファイルをセットするコード。
2013-08-08_08viewdidload

各ボタンのアクションに、「再生」「一時停止」「停止」機能を加える。
2013-08-08_09btnActionCord

Playボタンを押すと、オーディオファイルの再生。Pauseボタンで一時停止。Stopボタンで停止し、オーディファイルの再生位置を冒頭に戻します。

手を加えたソースコードは以下のようになります。
ViewController.h

ViewController.m