2012-04-04 6 views
3

처음에는 여전히 객관적이고 새로운 것을 배우기 위해 노력하고 있습니다.UIButton 이미지가 변경/업데이트되지 않음

지금은 프로그래밍 방식으로 만든 UIButton이 있습니다. 버튼을 누르면 UIActionSheet가 "카메라", "사진 선택"또는 "취소"중에서 선택됩니다. 버튼 이미지는 촬영 한 이미지 (카메라를 선택한 경우) 또는 이미지를 선택한 것으로 변경됩니다 (카메라 롤을 선택한 경우).

내 문제는 UIImagePicker를 닫은 후에 단추의 이미지가 변경되지 않는다는 것입니다. 처음에는 버튼이 tableView의 subView로 만들어졌고 tableView를 스크롤 할 때 버튼이 새로 고쳐지면서 이미지가 변경되었습니다 (이것이 내가 원하는대로 동작하는 방식이 아닙니다). 그러나 사용자가 이미지를 변경하거나 제거하려는 경우 버튼을 다시 누르면 UIActionSheet에 "사진 제거"라는 세 번째 선택 사항이 표시됩니다. tableView를 스크롤 한 후에 버튼 이미지가 전혀 변하지 않았 음을 알았습니다. 대신 새로운 버튼이 이전 버튼 위에 만들어 졌으므로 대신에 UDButton 코드를 viewDidLoad로 이동 시켰습니다 (stackoverflow에서 발견 된 일부 정보를 기반으로 함). 또한 스크롤을하지 않아도 tableView를 스크롤 할 수있는 기능을 제거했습니다.

나는 며칠 동안 UIImagePicker가 해제되거나 UIActionSheet가 해제 된 후 단추 또는보기를 새로 고치는 방법을 지금이 문제를 해결하기 위해 노력 해왔다. 나는 setNeedsLayout과 setNeedsDisplay를 사용해 보았지만 이것들은 내 문제를 해결하지 못했다. (나는 이것을 잘못된 장소에 놓을지도 모른다.) 바라건대 누군가가 이것에 대한 통찰력을 가지고 있으며,이 일을 제대로 수행 할 수 있도록 나를 인도 할 수 있습니다. 지금 내가있는 viewDidLoad 내있는 UIButton 코딩을 이동 한 것을 내가 코딩이 조각 어디에 넣을 것인가 확실하지 오전, 또한

- (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]; 
} 

: 또한

{ 
    if (picturePresent == NO) { 

     [cameraButton setTitle:@"Add\nPhoto" forState:UIControlStateNormal]; 
    } 

    else if (picturePresent == YES) { 

     [cameraButton setImage:resizedImage forState:UIControlStateNormal]; 
    } 
} 

setImage를하고 setBackgroundImage 두 있었다 또한 제공 내 코드입니다 사용하고 아직도 내가 원하는 방식으로 작동하지 않습니다. 더 많은 정보가 필요하면 알려주세요, 감사합니다! 편집

: 여기

내가 목표로하고 무엇을 보여주기 위해 스크린 샷입니다 -

screen1

screen2

screen3

"화상"그림을 표현하기 위해 가정한다 버튼 크기에 맞도록 선택되거나 조정 된 것입니다.

답변

1

는 테스트하지 못했지만, 당신이 필요할 때마다 사용자가 액세스 할 수 있도록 UiViewController의 당신의 cameraButton 구성원으로 만들 경우, 당신은 바로 resizedImage caculating하지 후 setImage: forState:를 부를 수 - 필요 없음 picturePresent 부울합니다. 그리고 나는 setNeedsDisplay도 필요 없다고 생각합니다.

편집 :

뷰 컨트롤러 헤더 파일에서

무언가 어딘가 구현 파일에

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

처럼 (viewDidiLoad가 정상)을 수행 한 후

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

그리고 구현을 모든 다른 작업을 수행하고 didFinishPickingMediaWithInfo의 코드를 다음과 같이 변경하십시오.

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

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

내가 말했듯이 테스트하지는 않았지만 제대로 작동해야한다고 생각합니다. 내가 여기에 몇 가지 answers..now 검색 한

+0

당신이 UIViewController의 멤버가된다는 의미를 더 설명 할 수 있습니까? 미안하지만 iOS 및 obj-c 프로그래밍에 아직 익숙하지 않습니다. – fresh

+0

내일 알겠습니다. 현재 전화로 작업 중입니다. –

+0

이 문제를 해결하기 위해 일주일이 지난 후에 코드가 트릭을했습니다. 그런 것들을 주셔서 감사하지만 간단하지만 훌륭한 솔루션입니다. – fresh

1

viewDidLoad 코드를 imagePickerController:didFinishPickingMediaWithInfo: 끝으로 이동하십시오. 또한 몇 가지 스크린 샷을 게시 할 수 있다면 정확히 무슨 일이 벌어지고 있는지, 그리고 예상 한 바를 설명하는 데 도움이 될 것입니다. 이것은 자르기 문제 일 수 있으므로 스크린 샷을 게시하는 것이 좋습니다.

+0

나는 imagePickerController에 버튼 코드를 이동 시도하고 나는 다시 원래 자리로 다시 이동 한 있도록이 화면을로드 할 때 버튼을 그리지 않습니다. – fresh

0

긴 시간 :

코드 아래 저를 도운 버튼의 이미지를 변경하려면 :

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

..e.g. viewDidLoad에서. didFinishPickingMediaWithInfo을 : 도움이

희망 ...

관련 문제