頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


drawRect:内でUILabelオブジェクトを作ったらダメなの?

【問題点】
UILabelで表示した文字がbackgroundからforegroundに戻ってくると、どういうわけか汚くなってしまう!
画像の下が本来のもので、上のが不具合発生時のもの。

img2


【結論】
アプリがforegroundに戻ってくる時になぜか、drawRect:メソッドが呼び出される場合があり(下のログ参照)、この場合に文字が汚くなっていました。

img1

↑アプリを終了させて、別アプリを起動ししばらくいじった後に、当アプリを再起動、の繰り返し。
アプリ終了時に"applicationDidEnterBackground"を表示、
アプリ起動時に"applicationWillEnterForeground"を表示させています。

MyView:UIViewクラスのdrawRect:メソッドでUILabelのオブジェクトを作っていたのですが、UIViewのdrawRect:に関しリファレンスには
Subclasses need not override this method if the subclass is a container for other views.

なんてあるから、UILabelのオブジェクトを作るのはdrawRect:内はよろしくないのかも。
(うん、結論なんて言ってるけどよくわかってないんだ)


結局、MyViewクラスに別なラベル作成のためのメソッドを作って、MyViewクラスのオブジェクト作成時にそのメソッドを呼び出すようにしたら不具合はなくなりました。
よくわからんが、これで行くことにしようっと。
ちなみに、そのメソッド名は"drawLabel"としてて、その場合の表示が一番最初の画像の下の文字列になります。


【ファイルの構成】
MyViewController:UIViewController
MyView:UIView
関係あるのはおなじみのこの二つ、、、
いや、ラベルで文字を書くだけなら
[myViewController.view addSubview:label]
ってな感じにすればMyViewクラスはいらないけど、まーいろいろとごにょごにょやってるので、MyViewクラスってのがあるんです。

MyViewControllerクラスのloadViewで
MyView *myView = [[MyView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.view = myView;


で、MyViewのdrawRect:内で
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 30)];
label.text = @"ありがとう浜村淳です 0123456789abc (drawRect:)";
[self addSubview:label];

大雑把で細かいとこまでは書いてませんが上のような構成です。
なお毎度のことながら、IBは使っていません。


【メモリ不足?】
この意図しないdrawRect:が呼ばれる時にメモリ不足の警告が出る場合も、出ない場合もあり、、、
不具合は実機でのみ確認されました(iPhoneシミュレーターで再現するかは不明)。
うーん、やっぱりなんともよくわからん。

<< Core Dataのデータを日付順に高速でソートしたい  TopPage  タブ間でデータを共有する >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/455-fe2d5d38




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad