Iphone UIButton图像未更改/更新

Iphone UIButton图像未更改/更新,iphone,objective-c,ios5,Iphone,Objective C,Ios5,首先,我对objective-c还是一个新手,仍然在尽可能多地学习,所以请容忍我 现在我有一个UIButton,它是我通过编程创建的。当按下按钮时,会弹出一张UIActionSheet,选择“照相机”、“选择照片”或“取消”。然后,按钮图像会变为拍摄的图像(如果选择了照相机)或拾取的图像(如果选择了照相机卷) 我的问题是UIImagePicker被解除后按钮的图像没有改变。起初,按钮是作为tableView的子视图创建的,当我滚动tableView时,它刷新了按钮,图像也发生了变化(当然,这不是

首先,我对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都被使用了,但仍然不能按我所希望的方式工作。如果需要更多信息,请告诉我,谢谢

编辑:

这里有一些截图来显示我的目标-


假设“图片”表示拍摄或选择的图片,然后缩放以适应按钮大小。

viewdiload
代码移动到
imagePickerController:didfishpickingMediaWithInfo:
的末尾。此外,如果你能发布一些截图,这将有助于准确解释正在发生的事情,以及你的期望。这可能是一个裁剪问题,这就是为什么我建议发布屏幕截图。

没有测试它,但是如果您将您的
cameraButton
作为
UiViewController的成员,以便您可以在需要时访问,您可以在计算
resizedImage
后立即调用
设置图像:forState:
-无需
图片呈现。我认为
setNeedsDisplay
也不需要

编辑:

在视图控制器头文件中,执行以下操作

...
@interface MyViewController : UIViewController
{
   ...
   UIButton * cameraButton;
   ...
}
... 
在实现文件中的某个地方(viewDidiLoad是可以的),执行以下操作:

然后实现您所做的所有其他工作,并在
didFinishPickingMediaWithInfo
中更改代码,如下所示:

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

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

正如我所说,我没有测试它,但我认为它应该有效。

很久以来,我一直在寻找答案。现在,这里有一些:

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

[button.imageView setHighlighted:YES];
[button.imageView setHighlightedImage:[UIImage imageNamed:@"mypic.png"]];
[button.imageView setImage:[UIImage imageNamed:@"mypic.png"]];
…例如。在viewDidLoad中


希望对您有所帮助……

我尝试将按钮代码移动到imagePickerController:didFinishPickingMediaWithInfo:中,但加载此屏幕时,该按钮不起作用,因此我已将其移回其原始位置。您能否进一步解释将其作为UIViewController成员的含义。对不起,我对iOS和obj-c编程还是新手。我明天会的。现在正在打电话。在一周的时间里,我一直在想这个问题,你的代码解决了这个问题。谢谢你这么简单,但很好的解决方案。
[button.imageView setHighlighted:YES];
[button.imageView setHighlightedImage:[UIImage imageNamed:@"mypic.png"]];
[button.imageView setImage:[UIImage imageNamed:@"mypic.png"]];