2015-01-05 5 views
0

2 NSArrays 있습니다. 1 - 이미지가있는 배열입니다. 2 - URL이있는 배열.NSArray에서 UIImageView UIImage 변경

내가 원하는 것은 이미지 배열 (각각 3 초)을 전환하는 것으로, 사용자가 특정 이미지를 클릭하면 해당 색인의 URL에 액세스하기 위해 클릭 한 이미지에서 동일한 색인을 원합니다.

예를 들어 : 인덱스 1에 이미지가 현재 표시되고있는 경우 해당 이미지에 사용자가 클릭 (인덱스 1) 나는 앱이 인덱스에있는 URL로 이동하려면 1. 다음

내입니다 코드 : 뭔가 명확하지 않은 경우, 또는 코드가 이해가되지 않을 경우

#import <QuartzCore/QuartzCore.h> 
... 

NSArray *images = [[NSArray alloc] initWithObjects: @"myimage1", @"myimage2", nil]; 

NSArray *urls = [[NSArray alloc] initWithObjects: @"www.google.com", 
                @"www.stackoverflow.com", nil]; 

imageView.image = [UIImage imageNamed:images]; 

CATransition *transition = [CATransition animation]; 
transition.duration = 3.0f; 
transition.timingFunction = [CAMediaTimingFunction 
          functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionFade; 

[imageView.layer addAnimation:transition forKey:nil]; 

내가이 꽤 새로운 해요, 그래서 나에게 너무 가혹하지 마십시오.

감사합니다. 당신이 함께 그룹화 관련 데이터를 보존 할 수 있도록

는, 단일있는 NSDictionary에 두 NSArrays를 확인하고 인덱스 번호에 대해 걱정할 필요가 없습니다 :

NSDictionary * imageToURLMapping = @{ @"urlString1" : image1, @"urlString2" : image 2 ... etc.}; 
+0

이미지를 터치하여 응답하려면 UIControl 클래스를 사용해야합니다. 할 수있는 일은 UIImageView와 동일한 CGRect로 UIControl 뷰를 만들고 UIControl에 UIImageView를 추가하는 것입니다. 이 작업을 완료하면 이미지를 터치 할 때 호출 할 메서드를 만들 수 있습니다. – davetw12

답변

0

나는 몇 가지 생각을 이러한 방식으로

보다 쉽게 ​​참조하고 이미지의 URL을 호출 할 수 있습니다

imagesView.image = imageToURLMapping[@"urlString2"]; 
마찬가지로 지금까지 천이/클릭으로 ... 난 당신의로 실행할 수 있습니다 생각하고

ome 누군가가 전환 중간 중간에 이미지를 클릭하려고하면 문제가 발생합니다 (예 : 이전 URL 또는 전환 URL로 등록됩니까?). 어쩌면 콜렉션 뷰와 같을 수도 있고 페이지 뷰가있는 scrollView가 해당 인터페이스에 대한 최선의 방법 일 수도 있습니다.

아무리 이미지를 선택했는지에 관계없이 궁극적으로 이미지를 구현하는 방법에 따라 달라집니다.

+0

openURL : SelectedURL]이 (가) 충돌 함으로 충돌합니다. 호환 가능한 포인터가 아닙니다. –

+0

아, 참으로 URL은 문자열이 아니라 URL이어야합니다. 그래서'[NSURL URLWithString : selectedURL]'을 추가하십시오. 위의 코드는 준 의사 코드 –

+0

입니다. 인식 할 수없는 선택자가 인스턴스로 전송되었다는 오류가 발생하여 충돌이 발생했습니다. –

1

이 처리 할 수있는 방법이 많이 있습니다 D : 약간의 도움이 적어도 난이 있었다 희망

NSArray * urlKeys = [imageToURLMapping allKeys]; 
    for(NSString * url in urlKeys){ 
     // iterate over all of the images and add an action 
     [imageToURLMappaing[url] addTarget:self 
            action:@selector(goToURL:) 
          forControlEvent:UIControlEventTouchUpInside]; 
    } 

// ---- further down in the code --- // 


-(void) gotToURL:(id)sender 
{ 
    UIImage * selectedImage = (UIImage *)sender; 
    NSString * selectedURL = [[imageToURLMapping allKeysForObject:selectedImage] firstObject]; 
    [[UIApplication sharedApplication] openURL:selectedURL]; 
} 

: 각 이미지는, 예에 대응하기 위해 예를 들어, 대상/액션 메소드를 추가 할 수 있습니다 .

원하는 동작에 대해 명확하게 이해해야합니다. 첫 번째 이미지에서 다음 이미지로 3 초의 페이드를 적용하고 즉시 시퀀스의 다음 이미지로 페이드를 시작하길 원합니 까? 그렇다면 사용자가 클릭 할 때 어떤 애니메이션이 현재 애니메이션인지 어떻게 결정합니까?

대부분의 3 초 동안 하나의 이미지에서 이미지를 유지 한 다음 크로스 페이드가 발생하는 전환 기간 (1/2 초 ~ 1 초)을 갖는 것이 더 좋을 것이라고 생각합니다. 그런 다음 일시 중지 중에 사용자가 클릭하면 현재 이미지가 URL이로드 된 이미지라는 것을 알 수 있습니다. 크로스 페이드가 시작되면 사용자가 클릭하면 새 이미지를 사용하게됩니다.

이 경우 Catransition의 복잡성은 가치가 있다고 생각하지 않습니다. (Core Animation과 레이어는 조금 까다 롭습니다.)

나는 타이머를 실행할 때마다 다음 이미지로 크로스 페이드를 유발하는 3 초 반복 NSTimer를 생성합니다. UIView 애니메이션을 사용하여 뷰의 불투명도를 애니메이션화합니다.

타이머는 현재 이미지 프레임 인덱스를 추적하기 위해 뷰 컨트롤러에서 인스턴스 변수를 사용합니다.

그런 다음 이미지보기에서 사용자 상호 작용 사용 가능 플래그를 YES로 설정하고 탭 제스처 인식기를 연결합니다. 제스처 인식기의 메소드는 타이머를 중지하고 현재 애니메이션 프레임의 색인을 가져와이를 사용하여 새 URL을로드합니다.

github에서(링크)이라는 샘플 프로젝트를 작성했습니다.이 프로젝트는 서로 위에 쌓인 이미지 뷰 쌍을 사용하여 크로스 페이드 애니메이션을 수행합니다. 하단보기에 첫 번째 프레임을 설치하고, 상단보기에 두 번째 프레임을 설치하고 상단보기를 투명하게 만듭니다. 윗면 뷰의 불투명도를 0에서 1.0으로 애니메이션합니다. 그런 다음 맨 아래 이미지보기를 이미지 3으로 전환하고 맨 위보기의 불투명도를 다시 0으로 페이드하여 이미지 3을 순서대로 표시합니다. 그런 다음 프로세스를 반복하여 최상위 이미지보기를 페이드 인/페이 아웃하고 현재 보이지 않는 이미지보기에서 이미지를 바꿔 다음 불투명도 변경으로 새 이미지를 표시합니다.

당신은 번갈아 당신의 페이드 애니메이션 작업을 수행 할 수있는 UIView 클래스 메서드 +transitionFromView:toView:duration:options:completion:

를 사용할 수 있습니다,하지만 당신은 여전히 ​​이미지 뷰의 한 쌍을 가지고와 그들을 교환 관리해야 할 것이다.

+0

몇 가지 코드를 보여줄 수 있습니까? –

+0

코드로 설명해 주시겠습니까? –

+0

작동하는 테스트 코드를 제공하는 프로젝트에 대한 링크를 제공했습니다. –

관련 문제