Home > Programming > Cocoa
Cocoa Archive
Delaunay Tessellation for iPhone
- 2010-01-13 (Wed)
- Cocoa
以下の文章はDelaunay Tessellation for iPhone | アクトインディ技術部隊報告書と同様のものです。
プログラムプレゼンテーションの第2回は、iPhoneを用いてDelaunay分割をするというものにしてみました。
本当は他のものをやるつもりだったのですが、前回のプログラムプレゼンテーションではkomagataさんがObjective-Cのキメラさ、カオスさをおもしろがっていたと勝手に仮定して、Objective-C++でさらなるカオスさを目指すことにしました。
そんな折りに以前ドロネー分割をするためのプログラムをつくって、アップロードしようかなといっていたのを思い出しました。
ということで、今回はそれを流用することにしました。
単純に移植するだけだから簡単だろと思ったところ、意外と手直しに時間がかかってしまいました。
ドロネー分割については計算幾何学で出てくるものですが、この余白はそれを書くのにはせますぎるということで、ググればきっとわかる!!!
ソースコードはこちらです。
ライブラリとしてBoost C++ Librariesを使用しています。
実行すると、毎回ランダムな10点を作成し、下図のようにドロネー分割された図が表示されます。
右側の図は外接円も表示させた場合です。
ドロネー分割では生成された三角形によって作られる外接円の中に、その三角形以外の点が含まれてはいけません。
ランダムな点を生成する部分にはboost::randomを用い、ドロネー分割を計算する部分はC++で書かれています。
Objective-CとC++のコードを混ぜる場合の注意点は、HMDTさんによくまとめられているのでこちらを参照していただくのがよいかと思います。
HMDT – Objective-C++
Objective-C++のソースを書かれるときは、.mとなっている拡張子を.mmにしてくださいね。
自分はこれをしないでObjective-C++のファイルだと認識されずはまりまくりました。
こんな風にC++のコードも簡単に使用することができるので、Objective-Cを使われている皆様もぜひ組み合わせてみてはいかがでしょうか???
P.S.
本当はNSOperationを使って、スレッドを新しく作ってバックグラウンドで処理をしたかったのですが、プログラムの構造上面倒なのでやめました。
参考
Objective-C プログラミング言語:C++ と Objective-C の併用
HMDT – Objective-C++
- Comments: 0
- Trackbacks: 0
複数行にわたったテキストを含むUILabelを適切な高さに調節する。
- 2010-01-09 (Sat)
- Cocoa
複数行にわたったテキストを表示するためのUILabelのインスタンスであるlabelがあり、そのlabelを適切なサイズ高さに変更したい時がありました。
// すでに以下の2行は他の部分で設定されている。 [label setLineBreakMode:UILineBreakModeWordWrap]; [label setNumberOfLines:0]; CGRect *frame; frame = [label frame]; frame.size = CGSizeMake(WIDTH, 0); [label setFrame:frame]; [label setText:@"long long long text..."]; [label sizeToFit];
ポイントはnumberOfLinesを0にすることと、sizeToFitメッセージを呼び出すこと。
numberOfLinesを0にしないと、sizeToFitを呼び出した時点で、指定した幅が無視されてしまう気がする。
毎回frameの幅を決めているのは、テキストが何度も書き換わる場所だから。
テキストが短いものになった場合、sizeToFitメッセージで短い幅が設定されてしまうと以降ずっとその短い幅になったままになってしまうため。
でもAppleのドキュメントには、以下のようにsizeToFitメッセージはnumberOfLinesを考慮するって書いてある。
自分のやり方がおかしいのか?
- 「UILabel Class Reference」より抜粋
-
When the receiver is resized using the sizeToFit method, resizing takes into account the value stored in this property. For example, if this property is set to 3, the sizeToFit method resizes the receiver so that it is big enough to display three lines of text.
- 引用元: UILabel Class Reference
- Comments: 0
- Trackbacks: 0
Apple Push Notification Serviceを利用した、iPhone クライアントと、Rubyによるサーバの作成。
[とりあえず表示しましたが、これからコードをアップロードしたり改変していきます。]
先週から、システム部で何か動くものを作って発表するという企画?が始まりました。
プログラムプレゼンテーションを始めてみたら意外に良かった
第一弾は自分だったので、1週間しかなかったので、ちょこっとやればできそうで今までやってみたかったiPhone OS 3.0の目玉機能の一つ、Push Notification Serviceの実装をやってみることにしてみました。
iPhoneクライアントはほぼObjective-Cしかありませんのでそれを使い、サーバはRubyで実装しました。
以下が発表したスライドを少し改変したものになります。
コードは今回はbitbucket.orgにアップロードすることにしました!
コードはこちらになります。
http://bitbucket.org/milkcocoa/apns-test/
ただしサーバのファイルに関しては
- デバイスIDとかの部分はxでマスクしています。
- キーに関してはスライドで指定した方法で記述してください。
[ポイントを書く。]
- Comments: 0
- Trackbacks: 3
Xcodeで0xE8000001エラー(iPhone OS 2.2.1)
iPhone OS 2.2.1をインストールしたiPhoneにXcodeで作成したプログラムを転送しようとすると、
Your mobile device has encountered an unexpected error (0xE8000001)
Try disconnecting and powering off the device; then power the device on and reconnect it.
などというエラーが発生し、XcodeがiPhoneを認識しないという状況に陥ります。
これの解決策は
/var/mobile/Media/PublicStaging
を削除し(jailbreakする必要があります)、再起動することです。
なぜ発生するのかは、今の自分にはよくわかりません(jailbreakしたから???)。
- Comments: 0
- Trackbacks: 0
UITableViewCellを削除ボタンを使って削除する
- 2008-12-11 (Thu)
- Cocoa | Programming
iPhoneのアプリケーションでは、交通標識の一時停止マークのようなものをクリックすると、削除ボタンが現れて項目が削除できるというギミックがあります。こういうのです。
このボタンを押して削除したときにはどのようなdelegateがおこなわれるか、そしてどのようにして項目を削除するのかということにちょびっとはまったので書いておきます。
まず、このボタンを押すとtableView:commitEditingStyle:forRowAtIndexPath:というdelegateがおこなわれます。
そして削除時なんですが、deleteRowsAtIndexPaths:withRowAnimation:メソッドを利用して削除します。
このとき注意すべき点は、このメソッドを呼び出した際にUITableViewのtableView:numberOfRowsInSection: delegateが呼び出されるということです。
そこで、UITableViewのcellに表示している項目を例えばNSMutableArrayなどで管理している場合には、そのNSMutableArrayの項目を先に削除しておかないと、例外が発生します。
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSUInteger row = indexPath.row;
if (editingStyle == UITableViewCellEditingStyleDelete)
{
[tableViewArray removeObjectAtIndex:row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}
}
のように先にNSMutableArrayの方を削除してから、deleteRowsAtIndexPaths:withRowAnimation:メソッドを呼び出す訳です。
- Comments: 0
- Trackbacks: 1
Home > Programming > Cocoa



