Home > Archives > 2010年2月 Archive
2010年2月 Archive
iPhone UIViewにUITableViewを貼付ける
- 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
Tweet
- Comments: 0
- TrackBacks: 0
iPhone UIColorの色変換
- 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);
Tweet
- Comments: 0
- TrackBacks: 0
iPhone UITabBarControllerの移動
- 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
Tweet
- Comments: 0
- TrackBacks: 0
iPhone UIPickerViewの初期値
- 2010年2月16日 16:32
- iPhone
UIPickerViewで初期値を決める方法が判らなかったのでメモ。
[picker selectRow:value inComponent:compNum animated:YES];
selectRow:初期値にしたい値
inComponent:何番目のドラムロールか
今日のおまけ
Tweet
- Comments: 0
- TrackBacks: 0
iPhone カメラで縦位置で撮影した画像のサイズ
- 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);
}
ここからどちらの辺が長いか判定すれば問題ないかと思います。
Tweet
- Comments: 0
- TrackBacks: 0
iPhone 画像のリサイズとトリミングなど
- 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の切り抜き画像ができあがり。
Tweet
- Comments: 0
- TrackBacks: 0
iPhone開発 本格的に始動です。
- 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 ];
サーバからの戻り値はデリゲートの
- (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後の処理をする感じです。
こうやってみると、今日一日で結構進んだな。
Tweet
- Comments: 0
- TrackBacks: 0
- Profile
-
iPhone/iPad開発・web制作・映像制作をしている平野百貨店の店長個人の覚書です。
ご意見・ご感想などお問合せはコチラからどうぞ。
※最近ツッコミをもらうので一応書いておきます。ブログのタイトル「袖触れ合うも多少の縁」はわざとです。正確には「袖振り合うも多生の縁」が正解です。 - Search
- iPhone Apps
-
- RSS
- リンク
