UIbutton上の画像を右寄せ

UIButtonにイメージを貼り付け、横サイズ280に固定したかったのですが、
イメージが中寄せになるので困っていました。

いろいろ試してみるとこれで右寄せすることができました。


UIButton * button = [[UIButton alloc] init];
[button setImage:img forState:UIControlStateNormal];
button.frame = CGRectMake(10,10,280,img.size.height);
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;

performselectorで実行を遅らせる

iOSアプリ開発の話です。

テスト用のアプリで基本的な動きを学びながら、分かったところで本命アプリに組み込むなんて方法で開発しているのですが、ちょっと複雑にするとすぐ問題が出てきます。
今日発生した問題は画面遷移中に落ちてしまうという問題。

A.「ボタンをタップすると0.3秒のアニメーションがあって、アニメーション後に画面を書き換える」という処理と、
B.「0.1秒毎にtimerを動かしていて、指定した時間が過ぎると時間切れで画面遷移する」という処理があったのですが、
時間切れギリギリにボタンをタップすると、画面遷移のためにviewWillDisappearで変数をnil化した後にAの画面書き換え処理が動いてしまって、nil化した変数にアクセスしてしまい例外が発生していました。

これ、どうしようかと思いましてまずは画面書き換え処理の前にフラグを立てて、処理終了後にフラグを下ろす。フラグが上がっている間は画面遷移せずに待つ。
という方法にしてみました。

一定時間実行を遅らせるために使ったのはこれ。

[NSThread sleepForTimeInterval:0.5];

これで0.5秒待つ。フラグが下りてなかったら再度待つ。5秒待ってもフラグが下りなければ画面遷移強行。ってやってみたのですが、確かにスリープはしていますが、それでもタイミングによっては落ちます。

このsleepForTimeIntervalってのは画面遷移の時間を遅らせると同時に、画面書き換えの処理も止めちゃってますよね?
これじゃ意味ない。

ってわけで次は performselector ってのを使ってみます。

[self performSelector:@selector(OpenNext) withObject:nil afterDelay:0.5];

これで OpenNext という関数を0.5秒後に実行してくれます。
スリープしているわけではないのでその間に画面書き換えの処理は動いて完了してる(っぽい)。

これでどうにか落ちることはなくなりました。

file was built for unsupported file format which is not the architecture being linked (i386)

iADというiPhone/iPad向けの広告を試しに入れてみようと試行錯誤しているのですが、表題のエラーが出ました。

iAD関連のライブラリが不適切なんだろうと思ったのですが、よくわからない。
調べてみると、同じような症状の人がいました。

objective c – Sending email in an iPhone application – Stack Overflow

どうやらiAd.frameworkの追加の仕方が悪かった模様です。
左側にある[project navigator]の中に、Finderから直接iAd.frameworkのフォルダをドラッグアンドドロップしていたのですが、これが間違いらしい。

正しいフレームワークの追加方法は、[project navigator]の一番上のプロジェクト名のところをクリック。
[TARGETS]を選択し、一番上の[Build Phase]を選択。
[Link Binary With Libraries]を選択し、そこの[+]マークからお目当てのフレームワークを追加する。

正しい方法で追加すると正常にビルドできました。
以前AVFoundation.frameworkとか追加したことがあったんだけど、偶然正しい方法で追加していたっぽいなぁ。

Xcodeのフォントサイズを変更する


Xcodeでプログラムを書いていて、キーバインドは快適になったのですが、もう一つ、気になることがありました。

おじさんには少しフォントが小さすぎる!

一度画面の解像度を下げてみたのですが、これだと全体が大きくなっちゃうのでなんか使いづらい。なんか違う。

それでXcodeの設定からフォントのサイズを変更しました。

[xcode]→[preferences]を開いて[Fonts&Colors]をみます。

デフォルトでは11ptになっています。
一番上の Plain Text から一番下の Other Preprocessor Macros までをShiftを押しながらすべて選択して、フォントサイズを変更しました。

あんまり大きいと今度はコード全体が見えにくくなるしで調節が難しいところですが、小さすぎると姿勢が悪くなって肩が凝っちゃうので私は13ptで。

Ctrl+spaceでマーク,Ctrl+wでカット,Ctrl+yでペースト


Xcodeでどうしても我慢ならなかったのが、これができないこと。
shift押しながら十字キーで範囲選択とか、トラックパッドで範囲選択とかどうしてもやりづらい。
どうにかならんかとgoogle先生に聞くも有効な回答にたどり着けず。

でもようやくできました、というか解決しました。
xcodeの設定項目にキーバインドの項目がありました。
てか最初からxcodeの設定項目をきちんと見ておくべきでした。

設定したのは、
[Xcode]→[preferences]を開いて[Key Bindings]を選びます。
上にある[All],[Menu],[Text]から[Text]を選び、少ししたの方にスクロールすると[Mark&Yank]の設定があります。

[Delete to Mark]の項目はすでにCtrl+wに設定されているのですね。
マークの仕方が分からなかっただけなのか。
そしてマークする方法は[Ctrl+@]に設定されていました。

これを[Ctrl+space]に割り当てれば解決なのですが、[Ctrl+space]には既に別のキーが割り当てられています。
一応変更しましたが、この際[Ctrl+@]でマークする方法に慣れてもいいかなぁ。

いや〜快適快適!

outletが表示されない


問題続きでちっとも進まないアプリ作成

UIImageViewをInterfaceBuilderに作成して、右クリックから[New Referencing Outlet]をヘッダファイルにドラッグしてみるも何も起こらず。
あれ?
自動でコードを書いてくれるんだったような気がするけど、勘違い?

仕方なく手動でヘッダファイルに以下を追加。

IBOutlet UIImageView *canvas;

しかしconnection inspectorのoutletsの部分にこのcanvasが表示されない・・・。

InterfaceBuilder上に作成したviewとcanvasって名前を関連づけしないといけないような気がするんだけど、これじゃできない。

あれこれ調べると、発見。
以前アプリ名とファイル名が不一致でXcodeが固まる(XCode固まる)という状態になったんだけど、その問題がすべては解決できてなかった。

xibファイルのFile’s Ownerを選択し、Identity Inspectorを開いたら一番上にCustom Classという項目があって、ここのクラス名に修正前の名前が残っていました。
ここを正しいクラス名に修正すると無事outletsが表示されるようになりました。

buildできるがシミュレータが起動しない


まずは慣れようといろいろいじっているので、いろいろと問題が発生します。
今度はbuildには成功するが、シミュレータを起動するとすぐにエラーで落ちてしまうという状態に。

エラーメッセージは、以下のようなもの

Could not load NIB in bundle: ‘NSBundle ….

なんのことやら・・・。
ずっとブラウザとXcodeの往復をしていますが、またブラウザに戻って検索です。
すぐに以下の情報が見つかりました。

Xcode 実機で動作しなくなる(’NSInternalInconsistencyException’, reason: ‘ Could not load NIB in bundle…)

エラーログにある「ViewController.xib」を開き、右側の「Utilities」>「File Inspector」内にある「Localization」の部分を見ます。
僕の場合はEnglishの1つのみが書かれていたので、「Japanese」を追加します。

この方はシミュレータでは起動するが実機に持っていくと動かないという症状になったそうですが、エラーメッセージ自体は似ています。
さらに解決策の内容に心当たりがあったのでやってみると上手くいきました。

私の場合は、最初LocalizationのところにEnglishとJapaneseがあったが(Japaneseは自分で追加したはず)、Englishはいらないだろうと削除しちゃってました。
Englishは必須なのだろうか・・・?
とりあえず残しておくことにします。

あー本当に分からないことだらけだ。

Xcode固まる


iPadアプリ作成中なのですが、いろいろといじっていると画面上部の通知エリアのような部分に

Attaching to アプリ名

という表示が出て、ビジーっぽい状態のままになっていることに気づきました。
そしてこの状態でrunを実行すると固まってしまいました。

解決策を探すと、次の情報を得ました。
XCode 4 hangs at “Attaching to (app name)”
(※原文英語)

Q. Xcode3では動いていたアプリがXcode4にすると “Attaching to …”の表示のまま固まった
A. [自己解決]
1.左のペインのプロジェクト名(一番上)をクリック。右にXcode3のproject/target editorsのようなメニューが出る。
2.一番上のBuild Settingsをクリック
3.パッケージの中ですべてのbuildがプロダクト名と同じになるようにする。”Attacing to …”に表示されている名前と同じに。例えば、プロダクト名が”LCBO Finder”なのに”Attacing to myLCBO”と表示して固まっているのならば、buildできないだろう。これが私に起こった問題だった。開発中にアプリ名を変更したんだ。

build名とアプリ名が一致していない(?)とこの問題が起こる?

私の場合、アプリの名前は「paintSample」だったのに、ファイル達は「painSampleViewController」というような”痛い”打ち間違いをしていました。
すべてのファイル名や、ソースの中身まですべてpain→paintに書き換え、Xcodeを再起動すると動くようになりました。