UIButton图像不更改/更新

时间:2012-04-04 21:05:17

标签: iphone objective-c ios5

首先,我仍然是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,但仍然没有按照我想要的方式工作。如果需要更多信息,请告诉我,谢谢!

编辑:

以下是一些截图,展示了我的目标 -

screen1

screen2

screen3

“图片”用于表示拍摄或选择的照片,然后缩放以适合按钮尺寸。

3 个答案:

答案 0 :(得分:1)

viewDidLoad代码移至imagePickerController:didFinishPickingMediaWithInfo:的末尾。此外,如果您可以发布一些屏幕截图,它将有助于准确解释发生了什么,以及您期望什么。这可能是一个裁剪问题,这就是我建议发布截图的原因。

答案 1 :(得分:1)

未对其进行测试,但如果您成为cameraButton的{​​{1}}成员,以便在需要时可以访问,则可以在计算{{1}之后立即调用UiViewController } - 不需要setImage: forState: bool。我认为resizedImage也不需要。

编辑:

在视图控制器头文件中执行类似

的操作
picturePresent

您的实现文件中的某个位置(viewDidiLoad确定)执行:

setNeedsDisplay

然后实现您所做的所有其他操作,并更改... @interface MyViewController : UIViewController { ... UIButton * cameraButton; ... } ... 中的代码,如下所示:

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

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

答案 2 :(得分:0)

很长一段时间我都在搜索答案..现在这里有一些:

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

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

.. e.g。在viewDidLoad。

希望有所帮助...