문제

나는 할 수있는 방법을 찾고있다 UIViewAnimationTransitionCurlUp 또는 UIViewAnimationTransitionCurlDown iPhone의 전환이지만 위에서 아래로 전환하는 대신 왼쪽에서 오른쪽으로 (또는 조경 모드의 상단/하단)를 수행하십시오. 나는 이것이 인터넷을 몇 번 묻는 것을 보았지만 답을 얻지 못했습니다. 그러나 나는 이것이 가능하다고 생각합니다.

나는보기의 변환과보기를 바꾸려고 시도했지만, 레이어의 변환은 전환에 영향을 미치지 않았다. 장치가 방향을 변경할 때 전환이 변경되기 때문에 초상화 모드에서 조경 전환을 사용하는 장치를 속이는 방법이 있다고 가정합니다.

도움이 되었습니까?

해결책 2

실제로 UIViewController의 방향을 변경 하여이 효과를 달성했습니다. 이상한 점은 작동하지 않을 때 컨트롤러 Nesten을 다른 컨트롤러에 넣었지만 그를 즉시 뷰 컨트롤러로 설정했을 때 효과가있었습니다.

이를 수행하는 코드 :

내 앱 대의원의 메인 뷰 컨트롤러 인 UIViewController에서는 조경 방향 만 허용합니다 (아래 두 번째 방법에서 볼 수 있듯이)에는 다음이 있습니다.

-(void)goToPage:(int)page flipUp:(BOOL)flipUp {

     //do stuff...

     // start the animated transition
     [UIView beginAnimations:@"page transition" context:nil];
     [UIView setAnimationDuration:1.0];
     [UIView setAnimationTransition:flipUp ? UIViewAnimationTransitionCurlUp : UIViewAnimationTransitionCurlDown forView:self.view cache:YES];

     //insert your new subview
     //[self.view insertSubview:currentPage.view atIndex:self.view.subviews.count];

      // commit the transition animation
      [UIView commitAnimations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

다른 팁

컨테이너 뷰를 사용하여 네 방향 중 하나에서 컬을 할 수 있습니다. 컨테이너 뷰의 변환을 원하는 각도로 설정 한 다음 컨테이너 뷰에 뷰를 추가하여 컬링을 수행합니다.

NSView* parent = viewController.view; // the main view
NSView* containerView = [[[UIView alloc] initWithFrame:parent.bounds] autorelease];
containerView.transform = CGAffineTransformMakeRotation(<your angle here, should probably be M_PI_2 * some integer>);
[parent addSubview:containerView]; 

[UIView beginAnimations:nil context:nil];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:containerView cache:YES];
[containerView addSubview:view];
[UIView commitAnimations];

나는 또한 이것으로 어려움을 겪었다. 컬이 오른쪽 또는 왼쪽에서 오도록하려면 중간보기를 만들어 변환 할 수 있습니다. 그래서, 당신이 전환하는 견해 (myview)가 메인 창 (ParentView)의 자녀라고 가정 해 봅시다.

-parentView
-->myView

사이에 중간보기를 삽입합니다 (인터페이스 빌더에서 쉽게 수행) :

-parentView
-->containerView
--->myView

그런 다음 다음 코드를 사용하여 컨테이너 90도 왼쪽을 뒤집고 전환 된 뷰 90도 오른쪽을 뒤집습니다.

containerView.transform = CGAffineTransformMakeRotation(-M_PI_2);
myView.transform = CGAffineTransformMakeRotation(M_PI_2);

MyView는 여전히 사용자에게 똑바로 나타나지 만 전환은 왼쪽에서 90 도로 적용된다고 생각합니다.

뷰가 자동 스케일링하는 방법에 따라 변환을 적용한 후 프레임 크기를 수정해야 할 수도 있습니다.

  containerView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0);
  myWebView.frame = CGRectMake(0.0, 0.0, 768.0, 1024.0);

도움이 되었기를 바랍니다. UiviewAnimationTranitionCurlleft 및 UiviewAnimationTransitionCurlright에 가장 가까운 곳입니다.

iOS5에서 Fluxa 솔루션을 시도했지만 ([UIView Trans ......]를 사용해야했습니다) 작동하지 않았습니다. 컬이 여전히 위아래로 이동했습니다. 분명히 전환은 이제보기의 변형을 고려하지 않습니다. 따라서 다른 사람이 iOS5에서 동일한 트릭을 원한다면 솔루션은 다른 컨테이너를 추가하고 그 사이에서 전환을 애니메이션하는 것입니다.

여기 내 코드가 있습니다. 왼쪽으로 '위로'말을하고 싶지만 하단 코너 컬링이 있기 때문에 약간 구체적입니다. 마치 노트 책에서 페이지를 찢는 것처럼.

UIView* parent = self.view; // the main view
CGRect r = flipRectSize(parent.bounds);
UIView* containerView = [[UIView alloc] initWithFrame:r];
CGAffineTransform t = CGAffineTransformMakeRotation(-M_PI_2);
t = CGAffineTransformTranslate(t, -80, -80);
containerView.transform = CGAffineTransformScale(t, -1, 1);
[parent addSubview:containerView]; 

UIView* container2 = [[UIView alloc] initWithFrame:r];
[containerView addSubview:container2]; 

UIImageView* v = [[UIImageView alloc] initWithFrame:r];
v.image = [UIImage imageWithCGImage:contents.CGImage scale:contents.scale orientation:UIImageOrientationLeftMirrored];
[container2 addSubview:v];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.001 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [UIView transitionWithView:container2
                      duration:DURATION_CURL_ANIMATION
                       options:UIViewAnimationOptionTransitionCurlUp
                    animations:^{
                        [v removeFromSuperview];
                    } completion:^(BOOL finished) {
                        if (completion) {
                            completion(finished);
                        }
                        [containerView removeFromSuperview];}];});

메모:

  1. 나는 Affine Transform Translate (80,80)가 내 마음에 의미가 없다는 것을 인정해야하지만 iPhone에는 iPad에서 작동하지 않을 것입니다.
  2. Flipsizerect는 직사각형의 너비와 높이를 뒤집습니다 (이미 얻었습니까?)
  3. 컨테이너를 추가 한 다음 계층 구조에서 뷰를 제거하려면 dispatch_after가 필요합니다. 내가 파견을하지 않으면 애니메이션이 없습니다. 가장 좋은 추측은 제거를 애니메이션을 만들기 전에 먼저 시스템이 레이아웃 패스를하도록해야한다는 것입니다.

맞춤 애니메이션을 작성하는 것 이상의 방법이 없다고 생각합니다.

더 중요한 것은 아마도 그것을 시도해서는 안된다는 것입니다. 컬 업 및 컬은 사용자에게 뷰가 들어 올려 지거나 기존보기를 내려 놓고 있음을 알려주는 사용자 인터페이스 문법의 일부입니다. 그것은 끈적 끈적한 음표가 내려 놓고 제거되는 것과 같아야합니다. 왼쪽 <-> 오른쪽 컬은 아마도 책에서 페이지를 찢는 것과 같은 것으로 해석 될 것입니다. 사용자를 혼동합니다.

표준 API가 쉽게 수행하지 않는 인터페이스에서 무언가를하려고 할 때마다, 그러한 새로운 방법이 사용자에게 중요한 것을 전달하는지, 기존 인터페이스 문법과 유사한 지 여부를 스스로에게 물어봐야합니다. 그렇지 않다면, 당신은 귀찮게해서는 안됩니다.

비정상적인 인터페이스에는 초기 와우 요인이 있지만 일상적인 사용에서 좌절과 오류로 이어집니다. 또한 Apple이 앱을 거부 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top