8

지금은 일련의 뷰를 사용하여 UIScrollView를 채우고 있습니다. UIScrollView를 회전식 슬라이드 쇼처럼 보이게하려면 뷰를 변형해야합니다. 즉 사용자가 스크롤 할 때 원과 같을 필요가 있습니다. 전에 이런 식으로 한 적이 전혀 없지만 CoreAnimation이 문제가 아니며 OpenGL을 사용해야한다고 가정합니다. 이것이 CoreAnimation 또는 Quartz에서 가능하다면 뷰를 왜곡하는 방법에 대한 샘플이 필요하며 나머지는 직접 풀어 낼 수 있지만 OpenGL에 익숙하지는 않습니다. 내 경험에회전식 효과를 위해 CoreAnimation 또는 OpenGL을 사용하여 뷰를 커브/뒤틀림

alt text

+1

100 % 확신 할 수는 없지만,보기의 레이어 속성에 CATransform3D를 적용 할 수 있다고 생각합니다. – jessecurry

+0

그래, 나는 이것에 대해 조금 읽었지 만 나는 그걸 사용 해본 적이 한번도 없다. 샘플을 아십니까? –

답변

6

, 값이 바로 얻을 조금 까다 롭습니다. 뷰 퍼스펙티브를 제공하는 방법은 레이어 변환을 조작하는 것입니다. 나는 비슷한 효과를 위해 transfor을 달성하기 위해 다음과 같은 방법을 사용했다 : 이것은 "플립 페이지"애니메이션을 만들기 위해 이루어졌다

-(CATransform3D)makeTransformForAngle:(CGFloat)angle from:(CATransform3D)start{ 

    CATransform3D transform = start; 


    // the following two lines are the key to achieve the perspective effect 
CATransform3D persp = CATransform3DIdentity; 
    persp.m34 = 1.0/-1000; 

    transform = CATransform3DConcat(transform, persp); 
     transform = CATransform3DRotate(transform,angle, 0.0, 1.0, 0.0); 
    return transform; 
} 

, 당신이 적응해야 할 수 있도록. 이를 사용하려면 다음을 수행하십시오.

flip_page.layer.transform = [self makeTransformForAngle:angle from:CATransform3DIdentity]; 

flip_page는 UIView입니다. 건배!

+0

고마워요! 내 주요 문제는 위와 같이 개별 견해를 왜곡하는 것입니다. 이 일에 대해 어떻게 알아요? –

+2

알겠습니다. 물론 선형 변환만으로는 충분하지 않습니다. OpenGL에서 메쉬를 만들고 텍스처를 두드리는 것이 확실합니다. 그러나 그것은 과잉처럼 보인다. 나는이 질문이 영리한 대답이되기를 바란다;) – fsaint

+0

이것은 내가 필요로하는 관점을 개별적인 관점에 추가 할 수있게 해준다. 그러나 그들은 또한 구부러져 야합니다. –

15

뷰를 왜곡하려면 OpenGL이 필요하거나 Core Animation의 CAShapLayer를 사용하면이 곡선을 포함 할 수있는 베 지어 경로를 지정할 수 있습니다. 그러나 당신이보고있는이 커브는 단지 착시 일 가능성이 있음을 명심하십시오 (위의 이미지에서는 실제 커브처럼 보입니다). 올바른 y 축 회전을 가진 사각형이 충분한 행렬을 이루면 직선적 인 Core Animation으로 원하는 효과를 얻을 수 있다고 생각합니다. 몇 년 전 Apple이 제공 한 Core Animation 데모에서 어떻게 구현되는지는 확실합니다. Core Animation Layer Warping

내가보기의 레이어의 변형 조금 주변에 엉망이 함께했다 :

- (IBAction)sliderDidChange:(id)sender 
{ 
    CGFloat value = [(UISlider*)sender value]; 
    CGFloat xOff = value - 0.5; 

    CATransform3D trans = CATransform3DIdentity; 
    trans.m34 = 1.0f/-1000.0f; 

    trans = CATransform3DRotate(trans, degreesToRadians(xOff * -25.0f), 0.0f, 1.0f, 0.0f); 
    trans = CATransform3DTranslate(trans, 0.0f, 0.0f, 900.0f * fabs(xOff)); 
    [[frameView layer] setTransform:trans]; 

    CGPoint center= [frameView center]; 
    [frameView setCenter:CGPointMake(1024.0 * value, center.y)]; 
} 

내가 함께 a demo project을 던져 그 방법을 보여줍니다 여기에 프리젠 테이션에서 동영상의 스크린 샷입니다 회전은 슬라이더에 대한 응답으로 작동합니다. 스크롤 뷰를 사용하지 않으므로이를 적용해야하지만, 현재 스크롤 오프셋을 추적하고 적절하게 변환을 적용 할 수 있다고 생각합니다. 그것이 도움이되는지 확실하지 않지만 거기에 있습니다.

관련 문제