Objective-Caboutmemo.393個人的メモです。間違いなどありましたらご指摘ください。iOS(AIR3.3SDK)でスクリーンショットを撮るお話。ありそうでなかった、というかあったけどもうまく動かなかったので作ってみたらちょっとハマりました。タイトルどおりのaneのコードが公開されてました。ScreenShotが、実装してみても想定通りに動作しない。Objective-C部分のコードを見てみると、UIGetScreenImage()というapple非公開APIを使用してる。非公開APIを使うとリジェクト対象だそうでこれは使えないと。下の記事を参考にスタンダードな実装に変更してみる。iPhoneアプリから画面のキャプチャー画像を取得する2つの方法aneファイルをビルドしなおして再テスト。画像はカメラロールに保存されたのは真っ白の画像。ちなみにObjective-CでiOSプロジェクトを作って、Xib上に適当にボタンとか画像とか配置した状態で上記の方法を実行すればスクリーンショットは問題なく取れるから根本的に間違ってるわけではなさげ。肝はFlashの描画領域がどこにあるのか、ということ。renderInContext:UIGraphicsGetCurrentContext()];UIWindowのkeyWindowのレイヤーをキャプチャしてるのだからFlashで言えばStage上のメインタイムラインをキャプチャしてるようなものなはずだから良さげな感じだけども結果は前述したとおりに真っ白。上記の方法は使えないみたい。app.xmlでのrenderMode要素をdirectを指定する場合はObjective-C側ではOpenGLESでのスクリーンショットを撮るような処理をしないといけないっぽい。具体的なコードはここに書かれてるものを参考にしました。imageこのコードで取得したUIImageをキャプチャすることでとスクリーンショットを撮ることができました。renderModeをcpu指定にすれば最初のコードでもスクリーンショットは撮れるのではないか?と思いましたが結果は否。renderMode:cpuでは、上述のどちらのコードでもスクリーンショットを撮ることはできませんでした。renderModeをcpuにする理由なんてない気もするのでまぁいいか。各コードの詳細はQuiitaにあげてあります。iOSでスクリーンショットをカメラロールに保存するANEを作ってみたけど真っ白な画面しか取れない(コメント欄で自己解決してます)p.s.ちなみに今回スクリーンショットを撮るのが最終目的ではなく、iOS5からのネイティブなTwitterAPIを使ってのスクリーンショットつきのTweet機能を実装したかったのでした。これも無事にうまく実装できたので、また後で記事を書きます。Objective-C[iPhone]UISliderにてvalue値固定でmaximumValueを変更した際にはUISliderの見た目が変化しないみたい。そんなときの無理やりな対処の仕方。Comments|UISliderの挙動に悩みました。sliderA.value;}sliderBはmaximumValueは変化するがvalueは変化しない。この状態でsliderBの見た目(つまみの位置)が相対的に変化して欲しい。sliderBのvalueを変数で保持しておいて、明示的にsilderB.valueに代入してみてもだめ。sliderB.value;}どうも挙動を確認してみるとslider.valueには現在地と同じ値を明示的に代入しても見た目の変化は起きないようだった。現在地と違う値を入れてあげれば、maximumValueに対応した見た目の変化も発生する。sliderB.value;}もっといい方法がありましたら、教えてくださいませ。Comment|簡単にできたようで出来てなくてちょっとはまったのでメモ基本的にはメソッドが用意されます。forState:UIControlStateHighlighted];これだけで指定した画像につまみが変更される。UISliderをInterfaceBuilderで配置した場合にはこれだけではうまくいかない場合がある。デフォルトのUISliderのheightは23になるのだけど、自分で用意したつまみ画像の高さが23を超える場合は、はみ出した部分はタッチ領域にならない。上記の例だとつまみの高さは100pxなので見た目はでかいつまみになっているけど、実機でタッチできる領域は中心の23px分しか反応しないことになる。InterfaceBuilder上からheightを修正してあげればいいかと思うと、Hの領域だけグレイアウトされていて修正ができない.なのでframeプロパティを修正して描画領域を書き換えてあげないといけないのでした。100);/////////////////////////////////////////////////////////////////////////////////////////////////////////というようなことが下記のブログには、しっかり書かれていましたのですが、、スライダーバー(UISlider)のカスタマイズ的:いまログ細かいところが理解できずに結構はまってしまった。その名の通り、xml形式のファイル。これをxcodeから開くとInterfaceBuilder(アプリケーション:以下IB)が立ち上がってビジュアル的にxmlの中身を編集できる。(ということだと思う)・Flashでいったらxibファイルって何にあたるの?とTwitterでつぶやいたら、エライ人から「FLEXでいうところのMXMLみたいなもの」と教えてもらった。FLEXでもMXMLも表示オブジェクトの配置情報を持っているし、MXMLを使わなくてもASで表示オブジェクトの配置することもできる。(でもMXMLも使い方をよくわかってない)ちょっと調べてみようと思ったらかなり分かりやすい素敵記事発見。:「支出管理」サポートxibファイルは、UIApplicationかUIViewControllerのサブクラスによってロードされるものなのね。どのクラスにも設定できちゃうから、この辺りの仕組みがよくわからなかった。ありがたやありがたや。Comment|Objective-CはASと違ってデリゲートとという機能がある。デリゲートとは別に色んなクラスが通知するイベントを一括で管理してくれるクラスがあるみたい。それが、NSNotificationCenterクラス。beginGeneratingPlaybackNotifications];nameはnilにすると全ての種類のイベントが取得対象になる。(そもそも通知の送信元がどのようなイベントを発信してるかを把握してる必要あり?)(ドキュメントみれば書いてあるのかな?)objectはnilにすると、全ての送信元からイベントを受け取る。あとNSNotificationCenterはシングルトンになるので、インスタンス変数の保持はしなくてもいいみたい。Comment|Objective-CにはASにはない機能でカテゴリという概念がある。これはクラスファイルにメソッドを追加することができる機能。通常クラスを拡張するにはそのクラスを継承したサブクラスを定義すればいいと思う。根本的に弄りたくなった場合、元のクラスを書き換えちゃうということもできる。(ASだと、Flash8でAS2のときは直接編集できたけど、AS3ではSWCになってるから無理ぽ)でも書き換えちゃうと何か不具合がおきたときとかバックアップとってないと元に戻すのが大変。いうわけでカテゴリという概念は、元クラスを簡易的に拡張できるという概念。追加できるのはメソッドだけ。手順は拡張用のクラス(?)ファイルを作ってそこで定義する。//処理}@end書き方で注意するのは、ヘッダーファイルでのinterfaceのくだり。変数は定義できないので、{}は書く必要なし。"UIViewExtention.h"を記述すればよい。これが記述されたクラス内では、UIViewインスタンスにUIViewExで追加したメソッドが普通に使えるようになる。Comments|まずはObjective-CというかC言語での乱数の発生させる方法。rand(void);という関数でint型の乱数を返すことができる。このときに返る値は、0~馬鹿でかい数という感じ。馬鹿でかい数はコンパイラによって変わるらしい。rand();printf(%d,i);//0から馬鹿でかい数の間の間ただ、このままだと乱数は実行するたびに常に同じ値を返すことになるので、初期化処理という行為が必要になる。初期値);使い方としては、rand()関数を実行する前にsrand()関数を実行することで初期化すればよし。初期値には、絶対にかぶらない値を日付データから取ればよし。//time(NULL)で現在の時刻が1970年1月1日午前0時0分0秒からの通算秒数で得られる。srand(time(NULL));rand();以上が、C言語での設定方法Objective-Cではsrandは以下のようにするらしい。timeIntervalSinceReferenceDate]);rand()※C言語のやり方でも問題なさげ。Comment|ヘッダーファイルにて、プロパティ宣言をすることでそのプロパティについてのゲッターセッターが実装される。retain];//保持する際は保持カウントをアップさせる:属性retainに相当}}}※@synchronizedは排他制御するかしないか。マルチスレッドで同時に実行して欲しくない処理があるとき、これを指定することで片方のスレッドを停止することができる。上の例では排他制御に対応しており、プロパティの属性でnonatomicを指定すると、排他制御はしなくなる。Comments|クラスファイルの最後の方にやたら登場するdeallocメソッドNSObjectのメソッドで、それをオーバーライドしている。dealloc実行のタイミングは保持カウントが0になったときに実行される。保持カウントはインスタンスの生成、retainさせた参照の追加でカウントアップ。releaseでカウントダウンされるのでカウント数には注意が必要。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。外部SWFファイルの読み込みで、子swf側で動的に配置したmcが表示されない。memo.393about。