Home > iPhone Archive

iPhone Archive

iPhone: EDAMTimestamp からNSDateを作る

ちょっと分からなかったのでメモ。

Evernote APIでEDAMNoteを取得して、ノートの作成日をNSDateにする方法。
EDAMNote *note がノートのデータ。

NSTimeInterval timestamp = [note created];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:(timestamp / 1000.0)];

timestampを1000.0で割るのを忘れて不思議な年月日になってたw


Happynoteセール中だよ

  • Posted by: goron
  • 2011年12月31日 11:21
  • iPad | iPhone

今年も震災などいろいろありましたが、何とか年を越せそうです。

感謝の気持ちを込めて、今日から3日間Happynoteを無料にセールしてみました。
よかったらダウンロードしてみてください。


Happynote App

カテゴリ: ライフスタイル

価格: ¥85


みなさん、良いお年を


iPhoneアプリ Happynote リリースしました

  • Posted by: goron
  • 2011年11月11日 13:46
  • iPad | iPhone

iPhoneアプリ Happynote ver1.0 リリースしました。(ブログに書くの遅いですけど)
今年の始めには出す予定だったのですが、地震やらなにやらで(言い訳)伸び伸びになっていたのですが、ようやくリリースできました。

Happynote App

カテゴリ: ライフスタイル

価格: ¥85


このアプリは、毎夜寝る前に、その日あった良かったことを3つだけ書き続ける 3 good things というメソッドを専用アプリにしたものです。欧米では"Never go to bed angry"という言葉があって、就寝前は必ずハッピーな気持ちで寝るという習慣を作ることはとても良いことです。このアプリがその一助になればと思います。
そして、意外と3つの良いことは見つからないものなんですね。2つまでは何とか探せるのですけど、3つ目が見つからないことが多いですw その3つ目を強引に何かこじつけで良かったことにする発想が大事なんだと思います。

英語のローカライズ原稿を、英会話を習って先生に見てもらったのですが、その際、このアプリの意図を即座に理解した様子をみて、このアプリは西洋向きなのだなと感じました。"Never go to bed angry"という言葉も彼女の口から出てきたもので、このアプリを一言で表した言葉だなぁと感心するとともに、西洋には生活に対するいろいろな考え方がより発展しているのだなと感じました。
実際、アプリの売れ方は(ほとんど売れていませんがw)欧米が半分以上になっています。USでは星5つのベタ褒めレビューが付いていてとても驚いたし、ちょっと怖かったですw。

主な機能としては、


  • 記録した項目をランダムでアニメーション再生できる

  • twitter,facebookへの投稿。メール送信

  • CSVファイルのエクスポート

  • 書き忘れ防止のためのリマインダー

などになります。

たまに自分過去に書いたことを、アニメーションで読み返すのですが、3.11の地震のことが書いてありました。「今日生きて夜をむかえられてよかった」って。

ビデオは近いうち作り直します。。


とりあえず、何もプロモーションしないとどうなるのかな、
という実験は身を以て理解しましたw
良かったら、どうぞお試しください。

追記:
財経新聞さまに取り上げていただきました!
http://www.zaikei.co.jp/article/20111213/89411.html

i-Stationさまに取り上げていただきました!
http://iphones.cx/news/3happynote/

ありがとうございます!

01/06追記 ブログに書いてもらいました!ありがとうございます。
Genie's Happy Life


3 good thingについては以下をどうぞ
就寝前の「3つのよいこと」メモ習慣


ハマッた。Application failed codesign verification. The signature was invalid, or it was not signed with an iPhone Distribution Certificate. (-19011)

  • Posted by: goron
  • 2011年11月 1日 17:07
  • iPad | iPhone

今日のハマりどころ。 iOS5の話。解決に丸一日かかったw
Application failed codesign verification.
The signature was invalid, or it was not signed with an iPhone Distribution Certificate. (-19011)
これ。
Certification関係らしいのだけど。。。

ちなみに下記のエラーはグーグル先生が沢山情報を持っている。
Application failed codesign verification. The signature was invalid, or it was not signed with an Apple submission certificate. (-19011)
こちらは、Distribution なのに、Developer Provisioningファイルが使われている場合のエラー。

今回、何度となくDistribution CertificateをRevokeして、再度リクエストしてを繰り返しましたが結果は変わらず。しかも、Xcode上のオーガナイザーからリフレッシュするとDistributionのProvisioningだけ消えちゃう現象が起こっている。(今も解決していない。Xcode4.2のバグかな?)だから、余計にCertificateに問題があるように思えるのだけど。

結論から言うと、Entitlement.plistにあるiCloudの項目が有効になっていることが原因でした!ターゲットのSummaryからEntitlement.plistのチェックボックスを有効にすると自動でEntitlement.plistが作られますが、iCloudの項目も勝手に追加されるみたい。iCouldの項目を削除したら、あっさりPassed Validationとなったw

昨日のiconの件といい、Entitlement.plistの件といい、全て見落としといえばそうなんだけど、知らないと気がつくまで時間がかかるわ、これ。


Icon specified in the Info.plist not found under the top level app wrapper:

  • Posted by: goron
  • 2011年11月 1日 00:27
  • iPad | iPhone

"Icon specified in the Info.plist not found under the top level app wrapper:"でむっちゃ悩みました。

iOS4時代では、info.plistのIcon filesに記載した文字が、大文字にしていない、とか、スペルミスが原因でこのエラーが出ていたみたいですが、
iOS5ではIcon files(iOS5)に問題が隠されていました。
というか気付かなかった。数時間悩みましたよ。ほんと。

対処法は、
Icon files(iOS5) > Primary Icon > Icon files のitemを確認すればよい。
プロジェクトのSummaryタブでApp Iconにドラッグとかでファイルを追加すると、Item0に空の項目が入るみたい。これを削除すれば解決。
それと、もう一つ、同じ項目で
Icon files(iOS5) > NewsstandIcon が勝手に追加されているときもあるみたい。
これまた、Newsstand App=true にしろとエラーが困る原因。
こちらは、単純にNewsstandを使わないのなら、その項目を削除すれば良いだけ。

ということで、個人アプリを初めてSubmitしてみました。
リリースが決まったら、ブログでお知らせします。


iOS5でアプリケーションアイコンの光沢を消す

  • Posted by: goron
  • 2011年10月25日 09:28
  • iPad | iPhone

iOS5専用のアプリを作っていて、
今まで通り、info-plistにIcon already includes gloss effect を
追加してYESにしていたのだけど、一向に光沢が消えなかった。
info-plistをよく見てみると、Icon filesとIcon files(iOS5)という2つの項目があったw

iOS5でアイコンの光沢を消すには、
Icon files(iOS5) > Primary Icon > Icon already includes gloss effect をYESにする。


iPhone NSString/CFStringRef の変換

  • Posted by: goron
  • 2011年9月28日 17:27
  • iPad | iPhone

ちょっと分からなかったので調べてみた。
つうかキャストするだけだったw オゥ

NSStringからCFStringRefに変換

CFStringRef aCFString = (CFStringRef)aNSString;

CFStringRefからNSStringに変換
NSString *aNSString = (NSString *)aCFString;


参考サイト
How to convert CFStringRef to NSString?


それと、4月には完成していたアプリが先日リリースされましたw
ClipCM oneといいます。
1枚の写真からテキストやフレームをつけてGIFアニメを作るアプリです。
無料なのでDLしてみてください。
1枚写真で作れるClipCM one App

カテゴリ: ライフスタイル

価格: 無料


あと、地味にClipCMもバージョンアップしています。
新しいプラグインが3つ追加になっています。


iPhone UIScrollViewで画面サイズより小さい領域でPagingする

  • Posted by: goron
  • 2011年8月26日 22:50
  • iPad | iPhone

新しいiMac買いました。メモリも安いので買いました。
でも雪豹のまま使うことにしますw

さて、UIScrollViewは便利で良く使っています。
UIScrollView.pagingEnabled = YESにすれば、ページ毎にきちっとスナップしてスクロールしてくれます。でも、画面サイズ(W:320px)より小さい要素、例えば画像(W:150px)などをページングするところでハマりました。iPhoneのサファリのタブのようにしたいのです。

ポイントは、ページングはframeのサイズではなくてboundsのサイズということ。
それと、scroll.clipsToBounds = NOにすること。NOにしないと、1枚しか見えない。
なるほど!

例えば、横は150pxの画像とマージンを取ったサイズを1ページとした場合。

UIScrollView *scroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0.0, 0.0, 320.0, 200.0)];
scroll.bounds = CGRectMake(0.0, 0.0, 150.0 + margin, 200.0);
scroll.contentSize = CGSizeMake(150.0*3 + margin*3, 200.0);
scroll.pagingEnabled = YES;
scroll.showsVerticalScrollIndicator = NO;
scroll.showsHorizontalScrollIndicator = YES;
scroll.clipsToBounds = NO;
scroll.delegate = self;
[self.view addSubview:scroll];

これだと、ユーザのタッチ受付の領域が狭いので、hitTestとかで広げるとよいかも。
以下、参照記事。
UIScrollView horizontal paging like Mobile Safari tabs - Stack Overflow

あと、はじめてUIPageControl使ったので、メモ。
UIPageControlはユーザタッチを受け取るのでタッチすると、ドットが1つ移動します。
プロパティのcurrentPageで左右どちらへ移動したか分かります。
また、タッチがあったことを受け取るには、

[UIPageControl addTarget:self 
action:@selector(pageControlDidChange:)
forControlEvents:UIControlEventValueChanged];

をセットしておいて、メソッド内で、currentPageの位置へ下記のようにscrollViewを移動すればOK。
[scrollView setContentOffset:point animated:YES];


Xcode4 "No Packager exists for the type of archive"でipaファイルが作れない場合

  • Posted by: goron
  • 2011年8月24日 16:44
  • iPad | iPhone

iMacを勢いでらいおん様にしてしまい、Xcodeは3を使っていたのだが、ついにXcode4に移行するときがきました。今までちろちろ遊びでは使っていたのですが。。。

そして、いざXcode4で今まで開発していたプロジェクトをAdHocビルドしてみると、Archiveは完了するのだが、"No Packager exists for the type of archive" と出てipaの作成ができない。かなり焦った。

でも普通にAdHocビルドできるXcode3で作ったプロジェクトもある。何コレ。

グーグル先生に聞いてみたところ
Stackoverflowに回答がありました。助かりました。

この状態になるのは、ライブラリなど外部のリンクファイルを使っている場合のようです。自分のアプリでもGDataを使っていたのでそれがひっかかっていました。
解決法は、使用しているライブラリのプロジェクト(ボクの場合はGData)のBuild settingsのSkip InstallをYESにすること。ただし、メインのプロジェクトの方はそのままBuild settingsのSkip InstallはNOのままでOKとのことです。
これで、無事AdHocできました。ふ〜。

XCode4 + iOS 4.3: "No Packager exists for the type of archive"


あと、らいおん様にXcode3を共存させようと、一度削除して再インストールしたら正常にインストールできませんでした。ApplicationフォルダにUtilityフォルダしか作られない。。何度やってもダメでした。


iPhone アプリに空きメモリを表示する

  • Posted by: goron
  • 2011年7月29日 16:56
  • iPad | iPhone

アプリ起動中に端末の空きメモリを表示するクラスを作ったので一応アップしておきます。
元ネタのまま利用させてもらいました。

#include < mach/host_info.h >
#include < mach/mach_init.h >
#include < mach/mach_host.h >
//MBで返す
-(float)freeSize
{
struct vm_statistics a_vm_info;
mach_msg_type_number_t a_count = HOST_VM_INFO_COUNT;
host_statistics( mach_host_self(), HOST_VM_INFO, (host_info_t)&a_vm_info ,&a_count);
return ((a_vm_info.free_count * vm_page_size)/1024.0)/1024.0;
}

UIViewのサブクラスにしています。AppDelegateでUIWindowへaddSubviewすると最前面にきて良いと思います。

スマートなやり方が分からないので内部でタイマーを使って空きメモリの値を更新しています。(現状は1秒間隔です)ですので、アプリがバックグラウンドへ行くときや、戻ってきたときにタイマーを制御してください。
-(void)memoryCheckStop; //タイマー止める
-(void)memoryCheckStart; //タイマー進める

ソースはこちら


元ネタはこちらです
http://d.hatena.ne.jp/It_lives_vainly/20090325/1237952703


iPhone Objective-Cで構造体を配列や辞書に登録

  • Posted by: goron
  • 2011年7月19日 14:15
  • iPad | iPhone

ちょっと分からなかったのでメモ。

AVFoundationで画面を連続キャプチャしている際に、CMSampleBufferRef型のデータを一時的に配列へ保管したかったので調べてみました。

NSValueに構造体を入れればよかったのですね。


CMSampleBufferRef imageDataSampleBuffer;
// CMSampleBufferRefをNSValueにする
NSValue *sample = [NSValue value: &imageDataSampleBuffer
withObjCType:@encode(CMSampleBufferRef)];

//CMSampleBufferRefに戻す
CMSampleBufferRef imageDataSampleBuffer;
[sample getValue:&imageDataSampleBuffer];


アップルのドキュメントは以下です。
http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/NumbersandValues/Articles/Values.html


iPhone SDK ターミナルでデバッグ

  • Posted by: goron
  • 2011年4月19日 14:54
  • iPad | iPhone

iPhoneをXcodeにつないでいない時にのみ起きる不思議クラッシュ現象。

なぜかシミュレータでの操作や、Xcodeから実機に直接「ビルドと実行」してデバッグを行ってもクラッシュは起きない。実機にインストール後、アプリを起動した場合のみクラッシュする現象に遭遇しました。(まぁ通常はこの状態で動作するのが正常な訳ですが。。。)
XcodeのデバッグコンソールからNSZombeが出すメッセージもなく、クラッシュするので困っていました。オーガナイザには当然クラッシュログは残っているのですが、

1   myapp                        	0x00020d80 0x1000 + 130432

とこんな感じなのでどこが問題なのか正確に理解できない。

stackoverflowに良い解決法が載っていました!
Crashing app when device not connected to Xcode

やり方は、ターミナルを使って、「0x00020d80」がどこを差しているのか分かれば解決できると。

まず、ターミナルでデバッグしたいプロジェクト内にあるbuildディレクトリへ移動。
そこで、以下のコマンドを入力。

atos -arch armv6 -o myapp.app/myapp 	0x00020d80

すると、ターミナルがクラッシュしたクラスとメソッド、および行数を教えてくれます。

助かったぁー、オブジェクトをリリースするタイミングの問題でした(汗


iPhone UIPickerView のラベルのフォント変更

  • Posted by: goron
  • 2011年2月 8日 15:37
  • iPad | iPhone

iPhoneでUIPickerViewを使ってシステムのフォント一覧を表示します。
せっかくフォントを表示するので、各ラベルのフォントも表示するフォントに合わせようと思ったら少々迷ったのメモします。

通常ですと、UIPickerViewのdelegateメソッドは

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
-(NSInteger)pickerView:(UIPickerView*)pictView numberOfRowsInComponent:(NSInteger)component
-(NSString*)pickerView:(UIPickerView *)pictView titleForRow:(NSInteger)row forComponent:(NSInteger)component

の3つですが、これですとNSStringしか返せません。
ですので、3つ目のメソッドは
- (UIView *)pickerView:(UIPickerView *)pictView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView*)view

を使うと、画像などUIView(UILabel)が使えます。

システムのフォント一覧を表示する場合は以下のようになります。


- (void)viewDidLoad {
[super viewDidLoad];
NSArray *family = [[UIFont familyNames] sortedArrayUsingSelector:@selector(compare:)];
familyNames = [[NSMutableArray alloc]init];
for ( id familyName in family ) {
NSArray* fonts = [[UIFont fontNamesForFamilyName:familyName] sortedArrayUsingSelector:@selector(compare:)];
for (NSString *name in fonts) {
[familyNames addObject:name];
}
}
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}
-(NSInteger)pickerView:(UIPickerView*)pictView numberOfRowsInComponent:(NSInteger)component{
return [familyNames count];
}
/* フォント名のみ返す場合
-(NSString*)pickerView:(UIPickerView *)pictView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
return [NSString stringWithFormat:@"%@", [familyNames objectAtIndex:row]];
}
*/
//UILabelで返す場合
- (UIView *)pickerView:(UIPickerView *)pictView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView*)view{
NSString *fontname = [NSString stringWithFormat:@"%@", [familyNames objectAtIndex:row]];
UILabel* fontlabel = (UILabel*)view;
if (!fontlabel) {
fontlabel = [[[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, ([pictView rowSizeForComponent:component].width - 8.0f), [pictView rowSizeForComponent:component].height)] autorelease];
fontlabel.adjustsFontSizeToFitWidth = YES;
fontlabel.backgroundColor = [UIColor clearColor];
}
fontlabel.text = fontname;
fontlabel.font = [UIFont fontWithName:fontname size:[UIFont labelFontSize]];
return fontlabel;
}

//ピッカーで取得 labelというUILabelへ選んだフォントを表示しています。
- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSString *pickFont = [familyNames objectAtIndex:[thePickerView selectedRowInComponent:0]];
label.font = [UIFont fontWithName:pickFont size:[UIFont labelFontSize]];
label.text = pickFont;
}

- (void)dealloc {
[familyNames release];
[super dealloc];
}


サンプルソース


iPhoneでFacebookへの対応 (photo upload)

  • Posted by: goron
  • 2011年2月 1日 11:26
  • iPad | iPhone

iPhoneアプリで、写真共有サイトへのアップロードが必要になり
テストでいくつかプロジェクトを作成してみました。
facebookへの写真アップロードの部分でつまづいたのでメモです。

まず、facebookはiOS用のSDKは以下で配布されています。
https://github.com/facebook/facebook-ios-sdk

開発者登録、アプリ登録も必要です。
http://www.facebook.com/developers/createapp.php

組み込み方法はFacebookのdeveloperページにあります。
http://developers.facebook.com/docs/guides/mobile/

その他、参考にしたサイト。超簡単Facebook実装
http://www.slideshare.net/MakotoIto/facebook-6054768


僕は、自分のプロジェクトにsrcフォルダをコピーして、
facebook-ios-sdk.xcodeprojを立ち上げて、FBConnectフォルダを自分のプロジェクトへドロップしました。

SDKのサンプルフォルダにあるDemoAppを見れば大体作りが分かると思います。
自分のプロジェクトの場合は
1.自分のcontrollerに #import "FBConnect.h" する。
2.app idを入力する static NSString* kAppId = @"***********";(15桁の数字)
3.info.plistに URL Types > URL Shcemes に "fb" と 上記のapp idを加えた文字列を入れる

あと、忘れてはいけないのは、
自分のプロジェクトのappDelegateに下記を入れる。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [[controller facebook] handleOpenURL:url];
}


これが入っていなくて、
The operation couldn't be completed. (facebookErrDomain error 101.)
というエラーで悩みました。
同じapp idで Demoでは動くのに、自分のプロジェクトで動かないことになっていました。
しかもInvalid API key となるので、謎でした。


写真アップロードに関して。
キャプションをつけて写真をアップロードしたい場合は、
paramsに@"caption"の項目を追加すればよいです。
グーグル先生では@"message"となっているのですが、これでは反映されません。


-(void)upload{
UIImage *img = [UIImage imageNamed:@"img.jpg"];
//キャプション入れる時
NSMutableDictionary * params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
img, @"picture",
@"ここにキャプションをいれる", @"caption", nil];
[_facebook requestWithMethodName:@"photos.upload" andParams:params andHttpMethod:@"POST" andDelegate:self];
}


あと、アプリを毎回ログインさせない方法は模索中です。。


iPhone UILabel 高さをテキストの量で決める

  • Posted by: goron
  • 2011年1月28日 21:20
  • iPad | iPhone

UILabelに量が可変するテキストを流し込む時など、
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode
を使うと高さが分かるので便利です。

TEXT_SIZE に使用するフォントサイズ
TEXT_WIDTH にUILabelの横幅
を設定しておけば、文字列を渡せば高さが帰ってきます。

#define TEXT_SIZE 14.0
#define TEXT_WIDTH 230.0
-(float)textHeight:(NSString*)text{
	CGSize boundingSize = CGSizeMake(TEXT_WIDTH, CGFLOAT_MAX);
	//文字の横幅から高さを算出
	CGSize labelsize = [text sizeWithFont:[UIFont systemFontOfSize:TEXT_SIZE]
						   constrainedToSize:boundingSize
							   lineBreakMode:UILineBreakModeWordWrap];
	return labelsize.height;
}

iPhone/iPad @protocolで自前のDelegate

  • Posted by: goron
  • 2011年1月24日 21:00
  • iPad | iPhone

やっと、@protocolを自前で実装するやり方が分かったのでメモ。初歩的ですが。

今までというか、protocolを使う前は、初期化の時にdelegateととして呼び出し元のインスタンスを渡していました。
例えば、こんな感じ。

id delegate;(.hで変数宣言)
-(id)intWithDelegate:(id)del;

それでインスタンスを作成する時に

object *obj = [object alloc] initWithDelegate:self];

とやっておいて、呼び出し元へアクセスするときは、
performSelectorを使っていました。
[delegate performSelector:@selector(imgDidFinish:) withObject:data];

これでもいいとは思うのですが、スマートではないのかもしれません。

そこで、protocolを使ってみます
まず、ヘッダー。UIViewControllerクラスを使った場合。
UIImagePickerを使って画像選択して、トリミング終了後にdelegateで戻ってくるイメージです。
ImgSelectControllerというクラスの
-(void)imgDidFinish; (作業終了後に呼ばれる)と
-(void)imgSelectCancel; (作業キャンセル時に呼ばれる)
がdelegateメソッドになります。(今回関係ない変数、メソッドなどは省略しています)


#import <UIKit/UIKit.h>
@protocol ImgSelectControllerDelegate;
@interface ImgSelectController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> {
id <ImgSelectControllerDelegate> delegate;
}
@property (nonatomic, assign) id<ImgSelectControllerDelegate> delegate;
@end
@protocol ImgSelectControllerDelegate <NSObject>
@optional
-(void)imgDidFinish:(UIImage*)image;
-(void)imgSelectCancel;
@end

@interface前に@protocol ImgSelectControllerDelegate;を宣言して
変数 id <ImgSelectControllerDelegate> delegate; とプロパティの
@property (nonatomic, assign) id<ImgSelectControllerDelegate> delegate;
を宣言する、

後は、delegateメソッドを記入する。

.m ファイルの方では、@synthesize delegate; 追加しておく。


#import "ImgSelectController.h"
@implementation ImgSelectController
@synthesize delegate;
- (id)initWithID:(int)num media:(int)photo{
self = [super init];
if (self != nil ){
myID = num;
mediaNum = photo;
}
return self;
}

//画像選択ピッカー
-(void)openPhotoLib{
UIImagePickerControllerSourceType souceType;
//カメラ使用可能か
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
if (mediaNum == 0) {
souceType = UIImagePickerControllerSourceTypeCamera;
}else {
souceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
}else {
souceType = UIImagePickerControllerSourceTypePhotoLibrary;
}
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = souceType;
[self presentModalViewController:picker animated:YES];
[picker release];
}

//画像選択後の処理
-(void)imagePickerController:(UIImagePickerController*)picker
didFinishPickingMediaWithInfo:(NSDictionary*)info
{
//モーダルを戻す
[self dismissModalViewControllerAnimated:YES];
//選択した画像の取得
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
//===ここでトリミングなどの処理をして===//
//処理完了後、デリゲート先へ通知
if ([delegate respondsToSelector:@selector(imgDidFinish:)]) {
[delegate performSelector:@selector(imgDidFinish:) withObject:image];
}
}

//画像選択キャンセル
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
//デリゲート先へ通知
if ([delegate respondsToSelector:@selector(imgCancel)]) {
[delegate performSelector:@selector(imgCancel)];
}
}

- (void)viewDidLoad {
[super viewDidLoad];
[self openPhotoLib];
}

- (void)dealloc {
[super dealloc];
}
@end

.mは大分処理を端折っています。。。

これらを使う場合は、使用するクラスで、
普段使うDelegateと同じで
.hの

@interface UIViewController : UIViewController <ImgSelectControllerDelegate>

にprotocol <ImgSelectControllerDelegate> を追加

.mの方で、

ImgSelectController *imgSel = [[ImgSelectController alloc] init];
imgSel.delegate = self;

として、メソッドを実装すればdelegateが使えます。


iPhone等で再生するm4vへのファイル変換

  • Posted by: goron
  • 2010年12月14日 14:01
  • iPad | iPhone

アプリのスプラッシュムービーにm4vファイルを使いたいことがあると思います。
変換面倒くさいなあと思っていたのですが、iTunes使えば簡単でしたね。

QTやAviなど動画ファイルを用意します。
動画ファイルをiTunesへドロップ。
ムービー一覧を開いて、変換したいファイルを選択。
メニューの「詳細」から「iPod/iPhoneバージョン作成」または「iPad/AppleTVバージョン作成」
ムービー一覧に変換されたファイルが現れるので、右クリックで「Finderで表示」

でm4vファイルがゲットできます。

携帯変換君とか使う必要は全然なかったですね。。


iPhone NSKeyedArchiver で構造体をエンコードする

  • Posted by: goron
  • 2010年10月25日 15:55
  • iPhone

NSKeyedArchiver で構造体を入れたNSValueでエンコードしてみたら、
iOS4では問題はないのだが、iOS3では以下のエラーが出てエンコードできないらしい。

-[NSKeyedArchiver encodeValueOfObjCType:at:]: this archiver cannot encode structs'

今回入れてみた構造体は、CGAffineTransformとCGRect
下記がエンコードするサンプルのDictionary


NSMutableDictionary *dict = [[[NSMutableDictionary alloc]init]autorelease];
[dict setObject:[NSValue valueWithCGAffineTransform:fViewtransform] forKey:@"fViewtransform"];
[dict setObject:[NSValue valueWithCGRect:fViewRect] forKey:@"fViewRect"];

上記はiOS4では問題なく動いてる

解決法は、NSStringFromCGAffineTransform() / NSStringFromCGRect()
を使えば良いと。


[dict setObject:NSStringFromCGAffineTransform(fViewtransform) forKey:@"fViewtransform"];
[dict setObject:NSStringFromCGRect(fViewRect) forKey:@"fViewRect"];

これで、iOS3でも動きました。
こちらの方がシンプルでしたね。。


iPhone GData-objectivec-client 使用時注意点 

  • Posted by: goron
  • 2010年10月 6日 11:12
  • iPhone

GData-objectivec-client の version 1.10で意外と気づきにくい注意点について。
iPhone3Gでのみ起動時できない不具合が出る。
厄介なのは、Debugビルドで端末へインストールすると問題はなく正常に動作しますが、ReleaseやDistributionでビルドした場合は、iPhone3Gのみ起動時にクラッシュするので気づきにくい!?

クラッシュログは以下のようになります。
Thread 0 Crashed:
0 MyApp 0x0004f4ac GDataCreateStaticDictionary + 40
1 MyApp 0x0004f662 +[GDataObject load] + 2


解決策は、
GDataのプロジェクトの設定で「アーキテクチャ」がarm7になっているので
Standard (arm6 arm7)に変更してGDataをビルドし直せば解決です。


以下、参考サイト
http://groups.google.com/group/gdata-objectivec-client/browse_thread/thread/1d077fbb8c4374de?pli=1


iPhone gdata-objectivec-client でYouTubeへ動画をアップ

  • Posted by: goron
  • 2010年8月31日 21:49
  • iPhone

iPhoneアプリからYouTubeへの動画アップを実装しました。
その際、かなりつまずいたので解決策をメモしておきます。

つまづいたポイント


  1. YouTubeアカウント ID&PWが通らない

  2. アップロード中、エラーで中断する

まず、gdata-objectivec-client ライブラリは下記からDLしてください。
http://code.google.com/p/gdata-objectivec-client/

ビルドするのにかなりつまづきました。
ビルドは下記を参考にしました。
Google Data API クライアントライブラリのビルド

その他、基本的なことはgdata-objectivec-client に入っている。
Examples/YouTubeSampleを参照してください。


1.YouTubeアカウント ID&PWが通らない
ある特定のYouTubeアカウントだとなぜか通らないことがあります。

問題は、サンプルの
YouTubeSampleWindowController.m
- (void)uploadVideoFile;

NSString *username = [mUsernameField stringValue];
NSString *clientID = [mClientIDField stringValue];
NSURL *url = [GDataServiceGoogleYouTube youTubeUploadURLForUserID:username  clientID:clientID];

サンプルの通りだとエラーになるアカウントがあります。
これを、

NSURL *url = [GDataServiceGoogleYouTube youTubeUploadURLForUserID:@"default" clientID:@""];

usernameを使わずに@"default"にすると問題は解決されました。

以下参考:
http://code.google.com/p/gdata-objectivec-client/issues/detail?id=22


2.アップロード中、エラーで中断する
次に、何のタイミングでエラーが起きているのかは不明なのですが、
アップロード中に突然中断してしまい、localizedDescriptionには Cannot allocate memory というエラーメッセージがサーバから戻ってくることがありました。
また、NSErrorFailingURLStringKeyにはresume用のアドレスが戻ってきます。
今回検証していて上記のエラー頻発したのは、3GS iOS4でした。(でも3G 3.1.3ではほとんど起きなかった!?)
メッセージの通りメモリか、と。しかし対処法が無いと途方に暮れていたのですが、何とか解決できました。

やはりポイントは
YouTubeSampleWindowController.m
- (void)uploadVideoFile; 内の

サンプルではアップロードする動画ファイルを下記で行っています。


NSData *data = [NSData dataWithContentsOfFile:path];

どうも、これだとメモリを食うらしく、上記を

NSData *data = [NSData dataWithContentsOfMappedFile:path];

にしてやれば、上記のエラーは出なくなりました。
アップロードもどんなに時間がかかっても最後まで無事にできるようになりました。

かなり、ネット上でも情報が乏しかったので、大変でしたが何とか解決出来て良かったです。
また誰かのお役に立てればと思います。


iPhone UISegmentControl の大きさ

  • Posted by: goron
  • 2010年8月 5日 16:55
  • iPhone

UISegmentControlのセグメントはセグメントのテキストを変えると自動で文字数の長さに合わせて大きさを変えてくれます。文字数が少ないと小さいセグメントができちゃう。
その他例えば、タブで画面を切り替えて、セグメントのテキストを入れ替えて使う場合などで、各タブで大きさがマチマチになって気持ち悪い。
そんな時はサイズを固定しちゃいましょう。

たとえば、ボタンが3つあるとして、
それぞれの大きさを60pxに設定して、全体は180pxにします。


//ボタンに使うテキスト
NSArray  *seg = [[NSArray alloc] initWithObjects:@"猫",@"鳥",@"犬",nil];

UISegmentedControl *segment = [[UISegmentedControl alloc]initWithItems:seg];

//各セグメントのサイズを統一
for(int i = 0; i < 3; ++i) {
[segment setWidth:60 forSegmentAtIndex:i];
}

//全体のサイズを設定
CGRect rect = segment.frame;
rect.size.width = 180;
[segment setFrame:rect];

UIBarButtonItem *barButton = [[UIBarButtonItem alloc]initWithCustomView:segment];
self.navigationItem.rightBarButtonItem = barButton;
[segment release];
[barButton release];
[seg release];


iPhone テキストフィールドからフォーカス外す

  • Posted by: goron
  • 2010年8月 3日 15:27
  • iPhone

久々のiPhoneネタ更新です。
viewに複数のテキストフィールがある場合、フォーカスのあたっているテキストフィールドを特定せずにキーボードを隠す方法。

テキストフィールドにフォーカスがあたると、キーボードが自動で出てきます。
iPhone UIKeyboard メモ

このキーボ--ドが出た状態で、UIAlertViewなどが出ると、
ログに"wait_fences: failed to receive reply: 10004003"と出力されます。
特に動作に問題はないようだけど、なんか嫌ですね。
解決法は、UIAlertView等を出す前にキーボードを消せば良いです。
[UITextfield resignFirstResponder] ですね。
テキストフィールドが1つの場合は、これでもいいのですが、もしviewに複数テキストフィールドがある場合は、どのテキストフィールドにフォーカスがあるのか特定しないといけないです。
これは面倒です。

すると、必殺技がありました。
[viewcontroller.view endEditing: YES ];
で、どのテキストフィールドにフォーカスがあっても問題なくキーボードを隠せます。

参考サイト
http://appteam.blog114.fc2.com/blog-entry-99.html


iPhoneアプリ リリース(やっと)

  • Posted by: goron
  • 2010年7月 7日 19:37
  • iPhone

今日 7/7 やっと、携わっているプロジェクトからiPhoneアプリをリリースできました。
無料ですのでiPhoneをお持ちの方はダウンロードしてみてください。
http://www.clipcm.com/iphone.html


今日のAppBankMACお宝鑑定団のBlogにも紹介されたみたいです。


リリース初日で15位に入っております。(7/7 19時現在)
Itunes エンターテインメント 無料アプリ一覧

レビューでの評価も上々のようでなによりなのですが、
「再起動できない」とのコメントがありますね。。。
チェックした限りそのような問題は起こらず、原因不明。
レビューでは環境などが分からないので対応ができないですね。
サポートへ連絡してもらえるといいんですけど。

今後、機能強化も次期アップデートで予定しています。


iOS SDK4.0でのビルド

  • Posted by: goron
  • 2010年6月28日 21:47
  • iPhone

6/5にiPhoneアプリをアップルへ申請してリジェクトもされずに審査通過しました。ありがたや。しかし7/7にアプリリリースと、リリースまでは時間があります。
と、思った矢先、6/22 iOS4が出ましたね。分かっていたことだけど。
いざ、実機でチェックすると、MPMoviePlayerControllerが音は出ているけど、映像が流れないというバグが発生していました。。。
そして、リリース前にすでにアップデートを再度申請することになりました。何とも愚かな。

MPMoviePlayerController では、movieControlModeやMPMoviePlayerContentPreloadDidFinishNotification などが非推奨になっています。
ちなみに上記の映像を表示するには、MPMoviePlayerをaddSubviewする必要がありました。


修正したデータを再度申請に出そうとそのままビルドしたのですが、アップロードできません。
"The binary you uploaded was invalid. The application-identifier entitlement is not formatted correctly; it should contain your 10-character App ID Seed, followed by a dot, followed by your bundle identifier."
と、エラーメッセージがでます。

かなり焦りましたが、グーグル先生に聞いたところ、下記のサイトにたどり着きました。
iOS SDK 4.0でコンパイルしたアプリzipのApp Storeアップロードでエラー

どうも使用しているEntitlement.plistに項目を追加しないといけなかったようです。
自分は上記サイトにもあるように、Entitlement.plistを一旦削除して、新規で作成しました。これで、無事審査に出すことができました。。。


iPhone textureToolが使えない時

  • Posted by: goron
  • 2010年6月 1日 09:34
  • iPhone

OpenGLで圧縮テクスチャを利用する際、
iPhone SDKにはtextureToolというコマンドラインツールがあると書籍にあります。
普通にSDKをインストールすれば、
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/textureTool
にインストールされています。

それで、ターミナルで実行してみたけど、textureToolがありませんと出ちゃう。
-bash: texturetool: command not found

と思ったら、pathを指定しなければいけなかった。。。このことも書籍に書いて欲しかった。
.bash_profileに下記を追加する。

PATH="/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:${PATH}"
export PATH


.bash_profileは
open /Applications/TextEdit.app ~/.bash_profile
でターミナルから開けます。

参考サイト:
http://www.iphonedevsdk.com/forum/iphone-sdk-development/22649-cannot-get-texturetool-work.html


iPhone MPMoviePlayerController再生中にタッチイベント取得してスキップさせる

  • Posted by: goron
  • 2010年4月28日 18:07
  • iPhone

アプリ起動時に、ムービーを表示していて、タッチしてスキップさせる方法がやっと分かりましたのでメモしておきます。
そもそも、MPMoviePlayerController の movieControlMode = YES にしておけばコントローラが出て「完了」ボタンを押せばよい話ですが、このコントローラを出したくないとき(movieControlMode = NO)に使えるのではないでしょうか。

参考にした書籍:iPhoneSDK開発のレシピ

今回はMPMoviePlayerController の上にUIViewを貼付けて、UIViewでタッチイベントを拾うようにします。

まず、起動時にムービーを表示させるのは、下記等を参考にしてください。
[iPhone] メディアプレイヤーで動画再生

ポイントは、keyWindowを取得して、それにUIViewをaddSubviewすることでした。
このkeyWindowの取得方法がなかなか分からなかった。。。

自分が試した方法は、ムービーがプリロードを完了した
- (void) finishPreload:(NSNotificationCenter *) aNotification
が呼ばれた時、MPMoviePlayerController の再生メソッドを呼んだ後にUIViewを作成しaddSubviewする。
(再生メソッドを呼ぶ前だとUIViewがムービーの背面に位置してタッチイベントがとれませんでした)

具体的には


- (void) finishPreload:(NSNotificationCenter *) aNotification {
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerContentPreloadDidFinishNotification object:player];
[player play];

//ムービースキップ用のUIView --SkipView
//SkipView にはタッチイベントを取得して、ムービー停止を呼ぶメソッドがある
skip = [[SkipView alloc]initWithFrame:CGRectMake(0.0, 0.0, 320.0, 480)];
UIWindow *movieWindow;
movieWindow = [[UIApplication sharedApplication] keyWindow];
[movieWindow addSubview:skip];
[skip release];
}

[[UIApplication sharedApplication] keyWindow]でkeyWindowを取得してaddSubviewする。
SkipViewがタッチを取得したら、[player stop] を呼んで、画面遷移すればOK。

書籍では、UIViewを90度回転させていますが、回転させなくても問題ありませんでした。

ちなみに、ムービーは横位置(landscape)で再生されるのですが、縦位置(portrait)で再生したい場合は-90度回転させたムービーを作成すればよいです。(気がつくと当たり前なんですけど。。結構悩んだ)



iPhone UIImageViewのアニメ

  • Posted by: goron
  • 2010年4月22日 22:59
  • iPhone

ちょっとした気づき。
UIImageViewへUIImageの配列を渡すと、コマアニメしてくる。animationImagesプロパティ。
あまり高速ではないけど。


NSArray *imgset =[NSArray arrayWithObjects:img1,img2,img3,nil];
UIImageView *imgView = [UIImageView alloc]init];
imgView.animationImages = imgset;
imgView.animationDuration = 2.0;

とすると、2秒でimgset配列の3枚の画像を再生してくれる。
各画像の秒数を細かく設定はできないみたい。

[imgView startAnimating];
でアニメスタート

[imgView stopAnimating];
でアニメ停止

imgView.animationRepeatCount = 1;
とすると、1回再生して終了。

RepeatCountを設定すると、設定回再生すると最終フレームで止るのかとおもいきや、
画像は消えちゃう。例えば、最終フレームをそのままフリーズさせておきたい場合は、
imgView.image = UIImage 最終フレーム画像
をセットしておけばよい。これに気づくのに時間がかかった。。。


おまけのCore Animation
レイヤーでアニメーションの設定して、アニメーション終了後にレイヤーの状態が
初期状態にもどるため、画面が一瞬フラッシュするようになる。
(メモリが不足してもそうなるみたい)

CABasicAnimation.removedOnCompletion = NO;
CABasicAnimation.fillMode = kCAFillModeForwards;

上記の2つの設定をいれないと、パカっとなります。
CATransform3DMakeRotation等使うとよく分かります。



iPhone UIImageの合成 と 複数のMacで共有できる証明書の書き出し

  • Posted by: goron
  • 2010年4月16日 15:31
  • iPhone

今日はiPhone関連で2つためになったこと。

まず、UIImageの合成。
下記は参考サイトです。下記はUIImageViewを使っています。
create one UIImage from two UIImageView.

image1 は下になる画像です。
image2 はアルファチャネルを持った画像です。
それら2つを合成してresultingImageという合成画像を作ります。
ちなみに両方の画像サイズは一緒のものを想定しています。

imageViewはUIImageView で合成した画像を表示する。

UIGraphicsBeginImageContext(image1.size);  
CGRect rect = CGRectMake(0, 0, image1.size.width, image1.size.height);
[image1 drawInRect:rect];  
[image2 drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0];  
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();  
UIGraphicsEndImageContext();  
[imageView setImage:resultingImage];


ポイントは、
drawInRect:blendMode:alpha:
ですね。blendModeは様々あるので調べてみてください。


そして話しは変わって、先日AdHocで配布したファイルがインストール出来ない謎な現象が発生。残り1週間を切ったdeveloper programではあったけど、なぜか使えなくなったみたい。
なんで〜? プログラムを更新したら問題無くなりました。更新は早めにということですか?

普段はiMacで開発をしていますが、MacBookProを買ったのでノートでも移動時などに開発できればいいなぁと思って、iPhone Provisioning PortalからCertification等々DLしてインストールしてみましたが、使えませんでした。グーグル先生に聞いても分からなかったのですが、教えてもらいました!

キーチェーンアクセスに登録されている証明書を右クリック。
「書き出す」という項目があるので選択。
書き出しファイルを保存するので「証明書.p12」ファイル名で
フォーマットは「個人情報交換(.p12)」で保存。
書き出したファイルを別のマシンにインストールすれば、ビルドできました!


iPadから投稿

  • Posted by: goron
  • 2010年4月15日 00:29
  • iPhone

iPadから投稿してみるナリ。
MTの管理画面にログインしてみるとIMTプラグインのページになる。(iPhoneからも投稿できるプラグイン)
意外と書きやすかもです。寝転がりながらキーボードを打つ感じのスタイルになりますね。

先日、打ち合わせにでかけた際、思いがけずiPadを入手できました。白河では第一号かな?
そして今日、アップルから日本でのiPad発売延期の発表があり、とてもラッキーだったことに感謝しました。
2週間程度のアドバンテージが1月半に伸び、これを生かさない手はないと思ってはいるのですが。。。

今日はiPad用のアプリをせっせと購入してみました。
まだまだUS iTumesアカウント限定のアプリばかりなのでなかなか良いアプリには巡り会えていません。
購入したアプリは、
Magic Piano これはおすすめ。iPhoneで楽器演奏よりは遥かに操作性も良いし楽しい。
TIMES 将来の雑誌の形かな?
Marvelのコミックビューアー スパイダーマンDLした。
Beatiful Planet fod iPad これはよくわからない。
NPR ニュースビューアー
Epicurious レシピ集かな
その他フリーのもの

手書きアプリや、マンダラートのiPad版が僕は欲しいです。
アイデア帳が、iPadは向いている気がします。

まだまだ自分にはiPadの使い道が見えてこないのですが、今後に期待が持てるデバイスだと思います。
でもiPadでYouTubeを見るようになりました。なんでだろう。


iPhone UITextView 改行ボタンを完了ボタンに

  • Posted by: goron
  • 2010年4月 6日 21:48
  • iPhone

久しぶりにiPhoneネタです。
UITextFieldはいろいろ気が利いていて使いやすのですが、
複数行の入力には対応していないみたいです。(残念)
複数行となると、UITextViewを使います。

UITextViewですと、UITextFieldのようにReturnKeyで入力完了を受け取ることができないので、ナビゲーションバーに「完了」ボタン等を付けていました。UITextFieldと同じ動きがクライアントの要求だったのでとても困っていたのですが、すてきな記事を見つけました。

How to Dismiss the Keyboard when using a UITextView

ポイントは、UITextViewDelegateの
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

UITextViewで入力されたキーをキャッチ、改行コード(\n)の場合は、完了とみなす。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
	
    if ([text isEqualToString:@"\n"]) {
	[textView resignFirstResponder];
        return NO;
    }
	return YES;
}


UITextViewをinitした後に、
textview.returnKeyType = UIReturnKeyDone;
textview.scrollEnabled = NO;

としておくと、「改行」ボタンは「完了」ボタンに代わり、スクロールもしなくなります。
あとは、placeholderと×ボタンを付けられれば、textfieldみたいに使えるんだけどなぁ。

追記:ついでに文字数制限
上記のdelegateに付け足せばできる。
追記:ご指摘を頂きまして修正しました。

#define TEXT_LIMIT_NUM 40 //40文字まで(半角全角の判別はしていない)
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
	
    if ([text isEqualToString:@"\n"]) {
	[textView resignFirstResponder];
        return NO;
    }else{
	if (range.location + range.length + [text length] <= TEXT_LIMIT_NUM) {
		if ([textView.text length] + [text length] - range.length <= TEXT_LIMIT_NUM) {
			return YES;
		}else{
			return NO;
		}
    }
}


下記を参考にしました(追記: 間違ってるかもです)
UITextFieldで文字数制限をする


iPhone Core Animation レイヤーアニメーションについて

  • Posted by: goron
  • 2010年3月20日 17:22
  • iPhone

今日MacBookPro届いたよ。整備品だけど。
なぜかDVDの読み込みエラーになる時がある。整備品だからかと疑いたくなる。

あぁぁぁ、ほんとう情報が少ない。。Core Animation。ハマりまくり。
CABasicAnimation で使ってフラッシュでいうTweenerみたいなことをしたいと思っていて。
単純に、1つの動作をさせることは簡単に分かったのですが(例えば、拡大だけとか、回転だけとか)。
でも、拡大しながら回転させたい時はどうするんだよっと。公式ドキュメントやら読んでみたけど、意味不明でした。2つ並べても1つしかアニメされないし。。。

でも、洋書のCore Animationに書いてありました。あっさりと。買っておいて良かった。。。
Core Animation: Simplified Animation Techniques for Mac and iPhone Development (Core Frameworks Series)

知ってみれば答えは、簡単
CATransform3DConcat を使えば良い。

CATransform3D rotateAnim;
CATransform3D transformAnim;
CATransform3D combine;

//1秒で回転しながら拡大
CABasicAnimation *animation =[CABasicAnimation animationWithKeyPath:@"transform"];
animation.duration=1.0;
animation.repeatCount = 0;
animation.delegate = self;

//拡大準備
transformAnim = CATransform3DMakeScale(0.1f, 0.1f, 0.1f);
//回転準備
rotateAnim = CATransform3DMakeRotation(-180 * M_PI / 180.0, 0.0, 0.0, 1.0);
//上記2つを合体させる
combine = CATransform3DConcat(transformAnim, rotateAnim);
//アニメの始まりをセット
animation.fromValue =[NSValue valueWithCATransform3D:combine];

//拡大終了時
transformAnim = CATransform3DMakeScale(1.0f, 1.0f, 1.0f);
//回転終了時
rotateAnim = CATransform3DMakeRotation(0 * M_PI / 180.0, 0.0, 0.0, 1.0);
//上記2つを合体させる
combine = CATransform3DConcat(transformAnim, rotateAnim);
//アニメの終わりをセット
animation.toValue =[NSValue valueWithCATransform3D:combine];

//最後にレイヤーに適用する
[imageLayer addAnimation:animation forKey:@"kRotateKey"];


iPhone UIBarButtonItem ボタンの色を変えたい場合

  • Posted by: goron
  • 2010年3月19日 15:06
  • iPhone

UIBarButtonItemのボタンの色を変えたいときのメモ。
backgroundColorとかtintColorとか試したのですが駄目でした。

下記を参考にしました。
Color image on a UIBarButtonItem on a UIToolBar?

参考サイトのとおり、発想を変えてカスタムUIButtonを貼付ければ良いということです。

//ボタンの画像を用意
UIImage *buttonImage = [UIImage imageNamed:@"someImage.png"];

//画像からボタンを作成
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:buttonImage forState:UIControlStateNormal];

//大きさを指定して
button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height);

//UIBarButtonItemのinitWithCustomView:でinitすればできあがり。
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button];


ここでもう一つメモ。
このcustomBarItemにactionを設定したいですね。
はじめ、
customBarItem.action = @selector(処理);
としていたのですが、セレクタが呼ばれません。。。

解決策は、UIButtonの方にactionをすればよかったのです。
[button addTarget:self action:@selector(処理) forControlEvents:UIControlEventTouchUpInside];

めでたしめでたし。



iPhone UIKeyboard メモ

  • Posted by: goron
  • 2010年3月12日 12:26
  • iPhone

2度ほど忘れたので、UIKeyboardを出す/消すのメモ。


画面表示と同時にキーボードを出す。およびテキストフィールドにフォーカスする。
- (void)viewDidLoad {
 [super viewDidLoad];
 UITextField *textField = [[UITextField alloc]init];
 [self.view addSubview:textField];
 //これでキーボード出す
 [textField becomeFirstResponder];
}


//テキスト編集開始時にリターンキーを設定
//リターンを押すと- (BOOL)textFieldShouldReturn:(UITextField *)textFieldが呼ばれる
- (void)textFieldDidBeginEditing:(UITextField *)textField{
 textField.returnKeyType = UIReturnKeyDone;
}


UITextFieldDelegate プロトコルをヘッダーファイルに追加して
テキスト入力後、リターンキーでキーボードを消す
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
 [textField resignFirstResponder];
 return YES;
}


iPhone メモ 拡大アニメ縮小率0.0だと。。。

  • Posted by: goron
  • 2010年3月11日 12:57
  • iPhone

UIViewの拡大アニメで、時間を取られたのでメモ。

UIViewのアニメーションを使う場合、下記みたいに
beginAnimations:context: 〜 commitAnimations で囲めば
その間に入れたviewオブジェクトがアニメしてくれる訳です。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
//アニメするオブジェクト
viewObj.transform = CGAffineTransformMakeScale(1.0, 1.0);
[UIView commitAnimations];

この例では0.5秒で、viewObjを拡大縮小のプロパティtransformで元のサイズに戻るアニメですね。
このブロックの前で
viewObj.transform = CGAffineTransformMakeScale(3.0, 3.0);
と設定しておけば、3倍の大きさから元サイズへ縮小するアニメーションになる訳です。

つまずいたのは、アラートウインドウのように拡大して現れる設定を下記のようにしたときです。
viewObj.transform = CGAffineTransformMakeScale(0.0, 0.0);

0.0から1.0へと設定したつもりでしたが、なぜか0.0だとアニメしてくれません。
フラッシュやらAfterEffectなどでは0から開始させていたので問題ないと思ったのですが。。。
結果、0.1にしたら問題無く動いていました。
なんでだろう?


iPhone スレッドで処理する

  • Posted by: goron
  • 2010年3月10日 22:23
  • iPhone

自分で書いたブログが役に立った日!
やっぱりログを取っておくべきですね。久々に更新します。
今日はadHocで配信してみましたよ〜。やり方教わりながらだからできたけど、もう一度自分でゼロからやるには大変そう。いずれログにします。

今日はiPhoneで超簡単スレッドの巻。
そもそも自分はスレッドの意味があまり分かっていないのだけど、画像処理している間、フリーズ状態になるので、Active indicatorを出したいな〜と思っていたら、やはり別スレッドで処理しないといけないとのこと。で、グーグル先生に聞いてみると、超簡単なやり方を教えてもらいました。
※追記:detachNewThreadSelector:toTarget:withObject:だとメモリリーク起きてました。。。

[NSThread detachNewThreadSelector:@selector(メソッド) toTarget:ターゲット withObject:オブジェクト];
[self performSelectorInBackground:@selector(メソッド) withObject:オブジェクト];
でメソッドを呼べばよいみたい。

そんでメソッドでは、
-(void)メソッド {
NSAutoreleasePool* pool;
pool = [[NSAutoreleasePool alloc]init];

ここに処理を実装

[pool release];
[NSThread exit];
}

とこれだけだった。
実際、detachNewThreadSelector:toTarget:withObject: performSelectorInBackground:withObject:を呼んですぐにメインループに戻ってきました。すばらしい。

でも、他のサイト見ていると、メモリリークが起こるとか書いてあるページがあったので、要注意かも。まだメモリリークのチェックはしてません。。。NSThreadだとメモリリークおきます。


参考サイト:
http://www013.upp.so-net.ne.jp/tanken/Tanken/no9_MultiThread/no9_MultiThread.html


iPhone UIViewにUITableViewを貼付ける

  • Posted by: goron
  • 2010年2月23日 22:31
  • iPhone

今日気がついたこと。
通常は、ナビゲーションバーを黒くする時、
navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;

とやらずに、
navigationController.navigationBar.tintColor = [UIColor blackColor];
とすると、navigationBarにつけたUIBarButtonItem がクリックしても反転しない。UISegmentedControllはどちらが選択されているかが分からなくなる。色付けると駄目ぽい。
でも、クリック判定は受け付ける。謎。

※toolbarを上に持っていった方が使い勝手が良いよとアドバイスもらいました。


さて、UIViewにUITableViewを貼付けるというのに挑戦しました。
あるUIView内にリストを表示しようと。
当初はUIScrollViewにラベル貼付けで実装しようかと思いましたが、なんてことない、UITableViewを使えばよかった。何となくViewControllerでしか使ったこと無かったので、イメージできませんでした。。。

やり方は簡単。
@interfaceにUITableViewDelegate,UITableViewDataSourceプロトコルを追加すればOK。
こんな感じ。
@interface MyView :UIView < UITableViewDelegate, UITableViewDataSource >

後は、@implement内でUITableViewインスタンスを作成する。
initWithFrame:でUIViewの大きさでframeを作成。
myTableView = [[UITableView alloc]initWithFrame:CGRectMake(15.0, 20.0, 245.0, 230.0)];
myTableView.backgroundColor = [UIColor clearColor];
myTableView.alwaysBounceVertical = YES;
myTableView.showsHorizontalScrollIndicator = NO;
myTableView.dataSource = self;
myTableView.delegate = self;

//セルの高さ、ボーダー設定
myTableView.rowHeight = 28.0;
myTableView.separatorStyle = UITableViewCellSeparatorStyleNone;

はじめdataSouceを設定していなかったので、テーブルに表示されなかった。当たり前かぁ。
後は、UITableViewの下記を追加すればできあがり。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection(NSInteger)section

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


iPhone UIColorの色変換

  • Posted by: goron
  • 2010年2月19日 19:40
  • iPhone

UIColorで色を設定するには、デフォルトで定義されている[UIColor whiteColor]とかを使うか、
initWithRed:green:blue:alpha:でRGBAを設定します。
ここで、使う数値は0.0〜1.0。
0〜255ではないし、0xffとか16進法 色指定でもない。
RGBの場合だと255で割って少数点第3以下は切り捨てればいいけどね。

そんな時、グーグル先生に聞いたら、素敵なサイトがありました。
http://weblog.101proc.com/2009/02/273_rgb-to-uicolor/?wscr=1680x1050

今回、ボタンクリックで色を変化させるコンテンツだったので、
16進法で色指定して配列に持たせておきました。
(CGColorはよく分からない)

サイトでは、下記を定義しておいて、
#define HEXCOLOR(c) [UIColor colorWithRed:((c>>16)&0xFF)/255.0 \
green:((c>>8)&0xFF)/255.0 \
blue:(c&0xFF)/255.0 \
alpha:1.0];


使うときは、
UIColor *color = HEXCOLOR(0xff00ff);
とすれば、16進法の色情報が使えました、と。
これは便利!

追記 おまけ
#define Red(c) ((c>>16)&0xFF)/255.0
#define Green(c) ((c>>8)&0xFF)/255.0
#define Blue(c) (c&0xFF)/255.0

以下のためにバラしました。ただ、バラしただけだけど。。。
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), r, g, b, 1.0);

使い方は、
0xff00ff 色があるとして、

float r = Red(0xff00ff);
float g = Green(0xff00ff);
float b= Blue(0xff00ff);



iPhone UITabBarControllerの移動

  • Posted by: goron
  • 2010年2月18日 22:12
  • iPhone

UITabBarControllerでタブをクリックせずにプログラムで表示内容を変えようという話。
要望としては、TabBarController内で表示しているviewControllerをフリックでもページ切り替えたいというのがあったの調べてみた。

まず、TabBarを作るのは、表示させるviewControllerを配列にいれる。
(ここではtab1とかがviewControllerね)
NSArray *controllers = [NSArray arrayWithObjects:tab1, tab2, tab3, tab4, tab5, nil];

それをsetViewControllers:でセットする。
[self setViewControllers:controllers animated:NO];


selectedIndexで現在表示しているviewControllerのindex番号が取得出来る。
上記の例ではtab1が0。以降1、2、3となる。
このselectedIndexに+1か-1させる。

実際TabBarController内の表示を変えるのは下記でした。
[self.tabBarController.view.subviews objectAtIndex:self.selectedIndex++];

これだけだと、アニメーションしていないので、なんだか気持ち悪い。
フリックさせてなので、動きをつけないといけないですね。

下記は、タブボタンをクリックした時にアニメーションさせる技です。
僕はまだうまくいきません。。。
http://blog.livedoor.jp/tek_nishi/archives/2519449.html


iPhone UIPickerViewの初期値

  • Posted by: goron
  • 2010年2月16日 16:32
  • iPhone

UIPickerViewで初期値を決める方法が判らなかったのでメモ。

[picker selectRow:value inComponent:compNum animated:YES];

selectRow:初期値にしたい値
inComponent:何番目のドラムロールか


今日のおまけ



iPhone カメラで縦位置で撮影した画像のサイズ

  • Posted by: goron
  • 2010年2月15日 22:55
  • iPhone

先日、書いたエントリー「iPhone 画像のリサイズとトリミングなど」で、一部修正が必要なことを発見しました。

ピッカーで画像選択後にCGImageから画像の縦横サイズを取得していました。
CGImageRef imageRef = [image CGImage];
size_t w = CGImageGetWidth(imageRef);
size_t h = CGImageGetHeight(imageRef);

iPhoneのカメラで縦位置に撮影した場合の画像サイズを取得すると縦横が逆になるのです。というか、縦位置で撮影しても横位置で撮影しても、取得した画像サイズは横1600px 縦1200pxとなります。

なので、サイズ取得する前に、縦位置の画像か横位置の画像か判断してから、サイズを取得する必要があります。

[iPhone] カメラロールから読み込んだ画像のサイズに関して

size_t w,h;
if (image.imageOrientation == UIImageOrientationUp || image.imageOrientation == UIImageOrientationDown) {
// 横の場合
w = CGImageGetWidth(imageRef);
h = CGImageGetHeight(imageRef);
} else {
// 縦の場合
w = CGImageGetHeight(imageRef);
h = CGImageGetWidth(imageRef);
}


ここからどちらの辺が長いか判定すれば問題ないかと思います。


iPhone 画像のリサイズとトリミングなど

  • Posted by: goron
  • 2010年2月12日 22:26
  • iPhone

今日の実装
・画像のトリミング
・xml読み込み -> xmlパース
・mp3のストリーミング再生(Core Audio本のクラス使用)
Audio File Stream Servicesを使いこなすようになるには今のスキルでは無理そう・・・

今日は画像トリミングについて
まずimagePickerControllerで取得した画像をリサイズしてから使う方が何かと便利かも。

-(void)imagePickerController:(UIImagePickerController*)picker
didFinishPickingMediaWithInfo:(NSDictionary*)info

ピッカーで画像選択後、infoにNSDictionary型で画像データが格納されているので、

UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];

UIImageを取得する。

まず、リサイズ。縦横比率を保ちながら縮小。
//例えばどちらかの辺(縦か横か)を320pxにする。
CGImageRef imageRef = [image CGImage];
size_t w = CGImageGetWidth(imageRef);
size_t h = CGImageGetHeight(imageRef);

if (w < h) {
     //縦辺が長い場合
resize_w = 320;
resize_h = h * resize_w / w; //横幅と同じ比率
isWidthLong = NO;
} else {
      //横辺が長い場合
resize_h = 320;
resize_w = w * resize_h / h;
isWidthLong = YES;
}

上記で得た画像サイズをUIGraphicsBeginImageContext()にセットして書き込む。

UIGraphicsBeginImageContext(CGSizeMake(resize_w, resize_h));
[image drawInRect:CGRectMake(0, 0, resize_w, resize_h)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

これでimageには、片辺が320pxに縮小された画像が入ります。


次にこの画像の一部を切り抜きたいとします。
僕の場合は320*320の正方形です。
タッチイベントで画像をドラッグさせて、切り抜く場所を選択させました。
isWidthLongはそのドラッグ方向を固定するためのBOOL値です。上下か左右かですね。

ここで1つつまずきました。size_t型。上記ではresize_w = 320;と整数を入れてます。
ドラッグの移動範囲制限する際に、上記のsize_t型のresize_w、resize_hをfloatで比較に使用したときです。はじめ、(320-resize_h)とそのまま計算させていたのですが、当然駄目でした。
一度floatでキャストしないといけないですね。
float rh = (float)resize_h;


そしてリサイズです。w,hには画像の切り抜き開始位置(左上頂点)を入れます。
CGRect rect = CGRectMake(w, h, 320.0, 320.0);
CGImageRef cgImage = CGImageCreateWithImageInRect(image.CGImage, rect);
UIImage *img = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
作られた画像はUIImageのimageWithCGImage:でインスタンス化すればできます。
最後にCGImageRelease(cgImage);で切り抜いたCGImageを開放する。

これで、320*320の切り抜き画像ができあがり。


iPhone開発 本格的に始動です。

  • Posted by: goron
  • 2010年2月10日 23:08
  • iPhone

やっと念願のiPhone開発です。しかもいきなり実践ですから、そりゃ恐ろしい。。。けど嬉しいという複雑な気持ちです。
リファレンス見たり、ネットで調べたりと、本当慣れるまで大変です。。。助けて〜
そんな中、ネットの情報には助けられているので、自分も基本的な開発Tipsをアウトプットしていきたいと思います。(自分用に)

今日やったこと。
・画像のアップロード(POST送信)
・アップロードした画像をダウンロード

まず画像のアップロード。
UIImagePickerController でPhotoLibraryから画像を取得します。
次にpickerで取得した画像をUIImageで取得。
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
ここまでは書籍等に書いてありますね。

取得したUIImageをPOST送信できるようにNSData型に変換します。
NSData* imgData = [[[NSData alloc] initWithData:UIImagePNGRepresentation( image )] autorelease];
こんな感じ。UIImagePNGRepresentation( image )がなかなか出てこなかった。
参考ページ:
http://iphone-dev.g.hatena.ne.jp/tokorom/20100113/1263325674

あとはNSDataをセットして送信と。
NSMutableURLRequest *request;
request = [ NSMutableURLRequest requestWithURL : [ NSURL URLWithString : url ] ];
[ request setHTTPMethod : @"POST" ];
[ request setHTTPBody: imgData ];
connection = [ NSURLConnection connectionWithRequest : request delegate : self ];

これでPOST送信できました。
以下参考ページ:
http://docs.google.com/viewer?a=v&q=cache%3A_Ss3bfZM2IQJ%3Asfjava.net%2Ftranspera%2Fdocuments-transpera-20081027%2FsendPOST-NSURLConnection.pdf+NSURLConnection+POST+to+send+%26+receive+data.&hl=ja&gl=jp&sig=AHIEtbQ1cNdFVlF64Rgbe2dY2u_VDZA6Fg

サーバからの戻り値はデリゲートの
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{}
ですね。

またここでハマったのは、戻り値のNSDataを文字列に変換する方法。
自分の場合は、アップロードした画像のアドレスが文字列で戻るシステムなので文字列を取得しないといけません。答えはこれでした。
NSString *d = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];


今度は、画像のダウンロード。
こちらはとても素敵なライブラリ ImageStore を使わせてもらいました。
http://d.hatena.ne.jp/Psychs/20081024/1224833636
これはむっちゃ簡単。
[imageStore getImage:imageUrl];
とURLをつっこむと、ダウンロード終了でデリゲート通知がありますので、DL後の処理をする感じです。

こうやってみると、今日一日で結構進んだな。


第3回 iPhone Web写真展 へ投稿してみた

  • Posted by: goron
  • 2009年8月 3日 11:35
  • iPhone

Twitterを始めるとブログの更新頻度が少なくなるとか。
http://d.hatena.ne.jp/mizchi/20090711/1247265579
私はもともと更新頻度が低いので関係ないかもしれないけど。あると思います。

Twitterはすごい情報量が増えて、追っていくのが大変だけど、重宝しています。
それと、フォローしている人の生活リズムが分かって面白い。みなさん以外と朝早起きなんですね。朝からバリバリと動いているから、それ相当のバリューがついているのかぁ。自分も時間を無駄にしないで生きなくては。


Apple-Style 「 第3回 iPhone Web写真展 」8/2 (日曜日) ~ 8/6 (木曜日)
へ投稿してみました。goronというハンドルネームです。
http://iphonewebgallery.wordpress.com/2009/08/01/087/


iMapMyRide を使ってみた

  • Posted by: goron
  • 2009年5月25日 14:06
  • iPhone

「iMapMyRide」というiPhoneアプリを使ってみた。GPSで自分の移動した距離や位置を記録できるアプリ。なんと無料。Web上のアカウント作成も無料!他のこれ系有料アプリは結構高いのに。これは無料で機能的には自分は満足。

今回は銀行に寄ったあと、市内を自転車でぐるっと一周してみた。(6.4km!意外にある) 走り初めにこのアプリをスタートする。走り終わった後にストップすると、MapMyRide.comへ自分の走った場所と距離を保存してくれている。(iPhone上でもその記録が見れるが、地図がしょぼいのでどこを走ったのか分からない。グーグルマップはすごい)下記はその記録を吐き出してもらってブログに貼り付けている。

地図上の赤いラインが辿った経路だけど、ほとんど正確。
view Elevation というボタンがあるだけど、これはなんだろう?高低差を表しているようだけど。それも判定できるのなか?

View this Route in 3D (Google Earth)** ってボタンもあって、グーグルアース上で軌跡を表示できる。やってみたけど、白河の詳細画像が間に合っていないようで、どこを走っているか全然わからない...。

これから移動の度に利用してみよう。


ブログがiPhone対応になりました

  • Posted by: goron
  • 2009年5月22日 09:44
  • iPhone
紆余曲折ありまして、やっとブログがiPhone対応になりました。iPhone/iPod touchでアクセスしてみてください。.htaccessの設定で数日ハマッていましたが、スーパーブレインに助けてもらい解決出来ました。ありがとう。本家のHTML版もiPhone/iPod touch対応に近いうちしたいと思います。というか、HP自体をリニューアルしたいな。Progressionを紹介してもらったので、フラッシュ版はProgressionを使いたい...。iPhoneの勉強もあるし、AS3もやらないといけないし、読まないといけない本も溜まっているし、時間が足りないなぁ。

来週は出稼ぎ週間になります。

ブログが...大変なことに

  • Posted by: goron
  • 2009年5月15日 17:17
  • iPhone
IPhone対応にするために、Movable Typeのバージョンアップをしようとしたのですが、データベース移行でみごと失敗。復旧は面倒くさいので新しく作り直すことにしましたとさ。 バージョンが変わったことで、RSSのフィードもatomになってる...。 フラッシュへの読み込みなどXMLパーサーの部分を修正しないといけない。変にやることが増えてしまったよ。

AirMacExpressとiPhoneで

  • Posted by: goron
  • 2009年1月12日 21:13
  • iPhone

iPhoneの音楽ライブラリをスピーカーから出せないものか?
Mac本体からはiTuneライブラリをAirMacExpressのWi-Fi経由で(AirTune)AirMacExpressから光でつないだスピーカーから音を出すことはできる。これと同じことをiPhoneからは出来ないのか?iPhoneのWi-Fi接続はAirMacExpressを通しているからできそうなものなんだけど…。RemotoというMacのiTuneをiPhoneからリモートで制御できるアプリがあるけど、これだと当然Macが立ち上がっていないと再生できないわけで…
知っている方教えて。(無理かな?)


iPhone SDKをゲット!・・・しかし

  • Posted by: goron
  • 2009年1月 7日 19:11
  • iPhone

iPhoneユーザになってホントよかった。
毎日が楽しいよ。Macに感謝です。そして今年の目標ができました。iPhoneのアプリを作ること。
これだけでもウキウキできるMacはすごい。

でも、開発ツールSDKが無償でダウンロードできるのでDLしました。でもよくよく見てみると、OS 10.5以上、しかもIntel マックでないとダメって…。オレのマックはIntelマックがでる1ヶ月ぐらい前にかったPPCなんだよ~。慌てて、OS10.5をアップルストアで注文して明日届くというのに…困った。こりゃ買い替えかぁ?

そこでネットで調べると自己責任ですが、PPCのマックでもSDKがインストールできるらしい。
とりあえず、これで試してだめな場合は、買い替えを検討しよう!


iPhoneにしたよ

  • Posted by: goron
  • 2008年12月25日 15:32
  • iPhone

今年最後の更新でしょうか?
悩みに悩んでAUからソフトバンクへ、iPhoneにしました。iPhoneユーザ4日目突入です。
クリエータならiPhone持たないとと一言いわれてから、調べるうちに本当に欲しくなって。
でも11月中にはAUの新製品を買おうと思い、近所の量販店へ行き物色したが売り切れ。
月の半分は実家の町田に滞在していたので、町田のヨドバでは在庫は大量にあるが、機種変更するとき住所欄に「福島」って書くのが恥ずかしくて、ウジウジして、結局買わずじまい…。結果それで良かったんですけどね。

で、使用感ですが、サイコーです!! 久々にマックユーザに戻ったみたい。マックを購入したときの興奮をまた味わうことができました。なんなんでしょうか、この感覚は?やはり、gmailが見れるのは最高に便利。今まで外出時はノートPC持ち歩いていましたが、特に修正作業など必要ない場合はiPhoneだけで対応できる。これだけでも買った甲斐がある。昨日は一日外出だったのでiPhoneの効果を実感できました。今日もポータブルのHDDを買いに量販店へ行ったのですが、買う前に価格comの評価や金額を参考にして購入できた。

ただ、難はバッテリーの持ちでしょうか。一日外出でiPodで音楽聴いて、電話もまあまあかけて、メールチェックしてとなると、音楽聴く時間は2時間ぐらいなのかなぁ?昨日も新幹線で1時間ぐらい聴いて、家に着いたら、バッテリーは残り20%だった。ほぼ新品でこの状態だからね~。まぁそれを差し引いても良い買い物だったけど。オススメです。


Index of all entries

Home > iPhone Archive

Profile

iPhone/iPad開発 web制作:平野百貨店
iPhone/iPad開発・web制作・映像制作をしている平野百貨店の店長個人の覚書です。
ご意見・ご感想などお問合せはコチラからどうぞ。

Search
iPhone Apps
MyBook Shelf
RSS
リンク
のこぎりそうの日記

Return to page top