2012-04-04 26 views
3

まず最初に、私はまだobjective-cの新人ですが、私ができる限り多くのことを学ぼうとしています。UIButtonイメージが変更/更新されていません

今私はプログラムで作成したUIButtonを持っています。ボタンを押すと、「カメラ」、「写真を選択」または「キャンセル」の選択肢が表示されます。ボタン画像は、撮影された画像(カメラが選択された場合)または画像が選択された場合(カメラロールが選択された場合)に変更されると想定されます。

私の問題は、UIImagePickerを終了するとボタンのイメージが変化しないことです。最初はボタンがtableViewのサブビューとして作成され、tableViewをスクロールしたときにボタンが更新され、画像が変更されました(これはもちろん私がそれを動作させたかったわけではありません)。ただし、ユーザーが画像を変更または削除することを決定した場合は、ボタンをもう一度押すだけで、UIActionSheetは「写真を削除」の3番目の選択肢を表示します。 tableViewをスクロールした後、私はボタンイメージが全く変わっていないことに気付きました。新しいボタンが古いボタンの上に作成されたので、代わりにviewDidLoadにUIButtonコードを移動しました。また、スクロールする必要がないので、tableViewのスクロール機能も削除しました。

私はこの問題を数日間解決しようとしていますが、UIImagePickerが終了したか、UIActionSheetが終了した後、ボタンまたはビューを適切にリフレッシュする方法がありました。私はsetNeedsLayoutとsetNeedsDisplayを使用しようとしましたが、これらは私の問題を解決するために働いていません(私は間違った場所にこれらを置いているかもしれません)。うまくいけば、誰かがこれについての洞察力を持っており、この仕事をするための適切な方法で私を導くことができます。さらに

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    // Creates camera button and connects to camera menu UIActionSheet 
    UIButton *cameraButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [cameraButton addTarget:self action:@selector(showActionSheet:) forControlEvents:UIControlEventTouchUpInside]; 
    cameraButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap; 
    cameraButton.titleLabel.textAlignment = UITextAlignmentCenter; 
    cameraButton.frame = CGRectMake(9, 230, 80, 80); 
    [self.view addSubview:cameraButton]; 

    picturePresent = NO; 
    NSLog(@"picturePresent = %@", picturePresent); 
} 

-(void)showActionSheet:(id)sender { 
    if (picturePresent == NO) { 
    UIActionSheet *cameraMenuSheet = [[UIActionSheet alloc] initWithTitle:@"Add Photo" 
                   delegate:self 
                 cancelButtonTitle:@"Cancel" 
                destructiveButtonTitle:nil 
                 otherButtonTitles:@"Camera", @"Choose Photo", nil]; 
    [cameraMenuSheet showFromTabBar:self.tabBarController.tabBar]; 
    } 
    else if (picturePresent == YES) { 
    UIActionSheet *cameraMenuSheet = [[UIActionSheet alloc] initWithTitle:@"Add Photo" 
                   delegate:self 
                 cancelButtonTitle:@"Cancel" 
                destructiveButtonTitle:nil 
                 otherButtonTitles:@"Remove Photo", @"Camera", @"Choose Photo", nil]; 
    [cameraMenuSheet showFromTabBar:self.tabBarController.tabBar]; 
    } 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSString *title = [actionSheet buttonTitleAtIndex:buttonIndex]; 

    // Initialize UIImagePickerController 
    if ([title isEqualToString:@"Camera"]) { 
     // Camera 
     UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
     imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; 
     imagePicker.delegate = self; 
     imagePicker.allowsEditing = NO; 
     imagePicker.showsCameraControls = YES; 
     imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil]; 

     [self presentModalViewController:imagePicker animated:YES]; 
     newMedia = YES; 
    } 
    else if ([title isEqualToString:@"Choose Photo"]) { 
     // Photo library 
     UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
     imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; 
     imagePicker.delegate = self; 
     imagePicker.allowsEditing = NO; 
     imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil]; 
     [self presentModalViewController:imagePicker animated:YES]; 
     newMedia = NO; 
    } 
    else if ([title isEqualToString:@"Remove Photo"]) { 
    picturePresent = NO; 

    } 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex { 
    [self.view setNeedsDisplay]; 
    } 

// Method for saving image to photo album 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { 

    // Access the uncropped image from info dictionary 
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 

    UIImage *scaledImage = [image scaleToSize:CGSizeMake(80.0, 80.0)]; 

     if (newMedia == YES) { 
     // Save image 
     UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); 

     } 

     resizedImage = scaledImage; 
    } 

    picturePresent = YES; 
    [self dismissModalViewControllerAnimated:NO]; 
} 

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 
    [self dismissModalViewControllerAnimated:YES]; 
} 

、今私はのviewDidLoadにコーディング私のUIButtonを移動したことを私はコーディングのこの作品を置く場所がわからないよ::

{ 
    if (picturePresent == NO) { 

     [cameraButton setTitle:@"Add\nPhoto" forState:UIControlStateNormal]; 
    } 

    else if (picturePresent == YES) { 

     [cameraButton setImage:resizedImage forState:UIControlStateNormal]; 
    } 
} 

もsetImageとsetBackgroundImageは両方だった。また、私のコードで提供私はそれが欲しいと思っています。もっと情報が必要な場合は、私に教えてください、ありがとう! EDIT

:ここ

は私が目指していますかを示すためにいくつかのスクリーンショットです -

screen1

screen2

screen3

"ピクチャー" 画像を表現するために仮定されますボタンのサイズに合わせて選択または拡大縮小されます。

答えて

1

はそれをテストしていないが、必要な時にあなたがアクセスできるように、あなたのUiViewControllerのごcameraButtonメンバーを作る場合、あなたは右resizedImage caculatingなかっ後setImage: forState:を呼び出すことができます - 必要に応じて何picturePresent BOOLを。そして、私はsetNeedsDisplayも必要ではないと思います。

EDIT:その後、

... 
cameraButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
...  
[self.view addSubview:cameraButton]; 
... 

そして、すべての実装:あなたのビューコントローラヘッダーファイルで

は、あなたの実装ファイルで

... 
@interface MyViewController : UIViewController 
{ 
    ... 
    UIButton * cameraButton; 
    ... 
} 
... 

どこか(viewDidiLoad OKです)やるような何かを行いますあなたがやったその他のものdidFinishPickingMediaWithInfoのコードを変更する:

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

    ... 
    [cameraButton scaledImage forState:UIControlStateNormal]; 
} 

私が言ったように、テストしなかったが、うまくいくはずだ。私はここにいくつかのanswers..now検索した

+0

あなたはそれをUIViewControllerのメンバにすることによって何を意味するかをさらに説明できますか?申し訳ありませんが、私はまだiOSとobj-cのプログラミングに新しいです。 – fresh

+0

私は明日になります。現時点で電話で作業しています。 –

+0

この問題の周りに私の頭を包み込むことを1週間おきにして、あなたのコードはトリックをしました。そのようなシンプルだが素晴らしいソリューションをありがとう。 – fresh

1

viewDidLoadコードをimagePickerController:didFinishPickingMediaWithInfo:の末尾に移動します。また、いくつかのスクリーンショットを投稿することができれば、何が起こっているのか、またあなたが期待していることを正確に説明するのに役立ちます。これは切り抜きの問題になる可能性があるため、スクリーンショットを投稿することをおすすめします。

+0

...助け

希望。 – fresh

0

長い時間:

ボタンの画像に以下のコードを変更するには、私を助け:

[button.imageView setHighlighted:YES]; 
[button.imageView setHighlightedImage:[UIImage imageNamed:@"mypic.png"]]; 
[button.imageView setImage:[UIImage imageNamed:@"mypic.png"]]; 

..e.g。 viewDidLoad内の。 didFinishPickingMediaWithInfo::と私は、元の場所に戻ってそれを移動しているように、この画面をロードするときにボタンを描画していない私はimagePickerControllerにボタンのコードを動かしてみました

関連する問題