3

まず、私はまだ Objective-C に不慣れで、できる限り多くのことを学ぼうとしているので、ご容赦ください。

現在、プログラムで作成した UIButton があります。ボタンを押すと、UIActionSheet が表示され、「カメラ」、「写真を選択」、または「キャンセル」を選択できます。ボタンの画像は、撮影された画像 (カメラが選択された場合) または選択された画像 (カメラロールが選択された場合) に変わると想定されます。

私の問題は、UIImagePicker が閉じられた後、ボタンの画像が変化しないことです。最初に、ボタンはtableViewのサブビューとして作成され、tableViewをスクロールすると、ボタンが更新され、画像が変更されました(もちろん、これは私が望んでいた動作ではありません)。ただし、ユーザーが画像を変更または削除することを決定した場合は、ボタンをもう一度押すだけで、UIActionSheet に「写真の削除」という 3 番目の選択肢が表示されます。tableView をスクロールした後、ボタンの画像がまったく変化していないことに気付きましたが、古いボタンの上に新しいボタンが作成されたため、代わりに UIButton コードを viewDidLoad に移動しました (stackoverflow で見つかった情報に基づいて)。スクロールする必要がなかったため、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];
}

さらに、UIButton コーディングを viewDidLoad に移動したので、このコーディングをどこに配置すればよいかわかりません。

{
    if (picturePresent == NO) {

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

    else if (picturePresent == YES) {

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

また、setImage と setBackgroundImage の両方が使用されていましたが、まだ希望どおりに動作していません。さらに情報が必要な場合はお知らせください。ありがとうございます。

編集:

ここに私が目指しているものを示すスクリーンショットがあります -

スクリーン1

スクリーン2

スクリーン3

「写真」は、撮影または選択され、ボタンのサイズに合わせて拡大縮小された写真を表すと想定されています。

4

3 に答える 3

1

テストしませんでしたが、必要なときにいつでもアクセスできるようにcameraButtonメンバーを作成すると、ブール値を計算した直後に電話をかけることができます。ブール値は必要ありません。そして、私も必要ないと思います。UiViewControllersetImage: forState:resizedImagepicturePresentsetNeedsDisplay

編集:

ビューコントローラのヘッダーファイルで、次のような操作を行います

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

実装ファイルのどこか(viewDidiLoadはOKです)で次のようにします。

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

そして、あなたがした他のすべてのものを実装し、次のdidFinishPickingMediaWithInfoようにコードを変更します:

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

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

私が言ったように、それをテストしませんでした、しかし私はそれがうまくいくはずだと思います。

于 2012-04-04T21:27:58.260 に答える
1

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

于 2012-04-04T21:10:24.650 に答える
0

長い間私は答えを探してきました..今ここにいくつか:

ボタンの画像を変更するには、以下のコードが役に立ちました。

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

..例えばviewDidLoadで。

それが役立つことを願っています...

于 2012-05-31T00:13:18.807 に答える