まず、私はまだ 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 の両方が使用されていましたが、まだ希望どおりに動作していません。さらに情報が必要な場合はお知らせください。ありがとうございます。
編集:
ここに私が目指しているものを示すスクリーンショットがあります -
「写真」は、撮影または選択され、ボタンのサイズに合わせて拡大縮小された写真を表すと想定されています。