UIButton的图片未能更改/更新

3
首先,我还是Objective-C的新手,仍在努力学习尽可能多的知识,请耐心等待。
目前我已经通过编程方式创建了一个UIButton。当按下按钮时,会弹出一个UIActionSheet,选择“相机”,“选择照片”或“取消”。然后,按钮图像应该更改为拍摄的图像(如果选择了相机),或选择的图像(如果选择了相机胶卷)。
我的问题是,在UIImagePicker消失后,按钮的图像没有更改。起初,按钮是作为tableView的子视图创建的,当我滚动tableView时,它刷新了按钮并更改了图像(当然这不是我想要的行为)。但是,如果用户决定更改或删除图像,则只需再次按下按钮,UIActionSheet将显示第三个选项“删除照片”。在滚动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都被使用了,但仍然不能按照我想要的方式工作。如果需要更多信息,请告诉我,谢谢!编辑:以下是一些屏幕截图,展示我想要实现的效果 -“Picture”应该代表已拍摄或选择的图片,然后缩放以适应按钮尺寸。
3个回答

1

没有测试过,但是如果你将你的cameraButton成员变量设置为UiViewController的一部分,这样你就可以在需要时访问它,你可以在计算出resizedImage后立即调用setImage: forState:,不需要picturePresent布尔值。我认为也不需要setNeedsDisplay

编辑:

在你的视图控制器头文件中做一些类似的事情

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

在你的实现文件中(viewDidLoad是可以的)执行以下操作:

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

然后实现你所做的所有其他东西,并像这样更改didFinishPickingMediaWithInfo中的代码:

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

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

就像我说的那样,我没有测试过,但我认为它应该可以工作。


你能进一步解释一下“将其作为UIViewController的成员”的意思吗?抱歉,我还是iOS和obj-c编程的新手。 - fresh
我明天会做。目前在用手机工作。 - Kai Huppmann
经过一周的努力,终于理解了这个问题,你的代码解决了我的困扰。感谢你提供如此简单而又高效的解决方案。 - fresh

1
viewDidLoad 代码移动到 imagePickerController:didFinishPickingMediaWithInfo: 的末尾。如果您能发布一些屏幕截图,将有助于解释正在发生的情况以及您的期望。这可能是一个裁剪问题,因此我建议发布屏幕截图。

我尝试将按钮代码移动到imagePickerController:didFinishPickingMediaWithInfo:中,但是当加载此屏幕时,按钮不会绘制,因此我已将其移回到原始位置。 - fresh

0

我已经寻找答案很久了,现在有一些:

要更改按钮的图像,下面的代码对我很有帮助:

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

例如在viewDidLoad中。

希望这有所帮助...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接