Iphone UIButton图像未更改/更新
首先,我对objective-c还是一个新手,仍然在尽可能多地学习,所以请容忍我 现在我有一个UIButton,它是我通过编程创建的。当按下按钮时,会弹出一张UIActionSheet,选择“照相机”、“选择照片”或“取消”。然后,按钮图像会变为拍摄的图像(如果选择了照相机)或拾取的图像(如果选择了照相机卷) 我的问题是UIImagePicker被解除后按钮的图像没有改变。起初,按钮是作为tableView的子视图创建的,当我滚动tableView时,它刷新了按钮,图像也发生了变化(当然,这不是我希望它的行为方式)。但是,如果用户决定更改或删除图像,他们只需再次按下按钮,UIActionSheet就会显示第三个选项“删除照片”。滚动tableView后,我意识到按钮图像根本没有更改,但是,在旧按钮的基础上创建了一个新按钮,因此我将UIButton代码改为viewDidLoad(基于stackoverflow上的一些信息)。我还删除了tableView的滚动功能,因为我不需要滚动它 几天来,我一直在尝试解决这个问题,在UIImagePicker或UIActionSheet被解除后,如何正确刷新按钮或视图。我曾尝试使用setNeedsLayout和setNeedsDisplay,但这些都无法解决我的问题(我可能把它们放错了位置)。希望有人对此有见解,可以指导我正确的方法,使这项工作。还提供了我的代码:Iphone UIButton图像未更改/更新,iphone,objective-c,ios5,Iphone,Objective C,Ios5,首先,我对objective-c还是一个新手,仍然在尽可能多地学习,所以请容忍我 现在我有一个UIButton,它是我通过编程创建的。当按下按钮时,会弹出一张UIActionSheet,选择“照相机”、“选择照片”或“取消”。然后,按钮图像会变为拍摄的图像(如果选择了照相机)或拾取的图像(如果选择了照相机卷) 我的问题是UIImagePicker被解除后按钮的图像没有改变。起初,按钮是作为tableView的子视图创建的,当我滚动tableView时,它刷新了按钮,图像也发生了变化(当然,这不是
- (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"]];