2009-10-26 60 views
9

Tôi đang tìm cách thực hiện chuyển đổi UIViewAnimationTransitionCurlUp hoặc UIViewAnimationTransitionCurlDown trên iPhone nhưng thay vì từ trên xuống dưới, thực hiện từ trái sang phải (hoặc trên/dưới ở chế độ ngang). Tôi đã nhìn thấy điều này hỏi aroud internet một vài lần nhưng không có sems để có được một câu trả lời. Tuy nhiên tôi cảm thấy điều này là có thể thực hiện được.iPhone Curl Trái và Curl Chuyển tiếp phải

Tôi đã thử thay đổi biến đổi của Chế độ xem và biến đổi của view.layer nhưng điều đó không ảnh hưởng đến quá trình chuyển đổi. Kể từ khi chuyển đổi thay đổi khi thiết bị thay đổi hướng tôi giả sử có một cách để đánh lừa thiết bị để sử dụng chuyển cảnh quan ở chế độ dọc và ngược lại?

Trả lời

4

Tôi thực sự đã quản lý để đạt được hiệu ứng này bằng cách thay đổi hướng của UIViewController của tôi. Điều kỳ lạ là, tôi đã có bộ điều khiển của tôi làm tổ trong một cái khác khi nó không hoạt động, nhưng khi tôi đặt anh ta làm bộ điều khiển xem ngay lập tức, nó hoạt động.

Mã nào đó:

Trong một UIViewController đó là bộ điều khiển giao diện chính trong đại biểu ứng dụng của tôi và chỉ cho phép định hướng phong cảnh (như bạn thấy trong phương pháp thứ 2 dưới đây) Tôi đã điều sau đây:

-(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); 
} 
+0

Còn thanh trạng thái thì sao? - thanh trạng thái sẽ nhìn bên phải - khi sử dụng ứng dụng? –

+3

Điều này dường như không hoạt động. – adib

+0

Đảm bảo rằng Trình điều khiển Chế độ xem của bạn không được lồng vào nhau hoặc nếu nó đảm bảo bố mẹ đang triển khai đúng hướng ... – Dimitris

0

Tôi không nghĩ có cách nào ngoài việc viết hoạt ảnh tùy chỉnh.

Quan trọng hơn bạn có lẽ không nên thử. Curl up và curl down là một phần của ngữ pháp giao diện người dùng cho người dùng biết rằng một khung nhìn đang được nâng lên hoặc đặt xuống trên khung nhìn hiện tại. Nó được cho là giống như một lưu ý dính được đặt xuống và sau đó loại bỏ. Một trái < -> curl phải rất có thể sẽ được hiểu là một cái gì đó như tách một trang ra khỏi một cuốn sách. Nó sẽ gây nhầm lẫn cho người dùng. Bất cứ khi nào bạn thấy mình đang cố gắng làm điều gì đó trong giao diện mà API tiêu chuẩn không dễ dàng, bạn nên tự hỏi liệu một phương pháp mới sẽ truyền đạt điều gì đó quan trọng cho người dùng và liệu nó có tương tự như ngữ pháp giao diện hiện tại hay không. . Nếu không, thì bạn không nên bận tâm.

Giao diện bất thường có yếu tố wow ban đầu nhưng chúng dẫn đến thất vọng và lỗi trong sử dụng hàng ngày. Họ cũng có thể khiến Apple từ chối ứng dụng của bạn.

+0

Nó không phải là bất thường. Nó hoàn toàn giống nhau. Trong thực tế, Apple làm điều đó, chỉ theo hướng ngược lại. Tôi đang tạo một cuốn sách phong cảnh tương tác để tôi tích cực rằng hoạt ảnh này sẽ truyền đạt cảm giác về cuốn sách cho người dùng. Hiệu ứng lên xuống hoạt động cho máy tính xách tay (như ứng dụng ghi chú). Nhưng đối với một cuốn sách thích hợp, tôi cần một cảm giác khác. – Dimitris

+0

Nếu bạn nhìn vào quá trình chuyển đổi curl, bạn sẽ thấy nó chuyển đổi ba góc của chế độ xem. Một trang đã lật chỉ tách hai. Cuộn tròn di chuyển chế độ xem theo đường chéo trong khi chuyển trang chỉ di chuyển sang trái sang phải. Sự khác biệt là tinh tế nhưng quan trọng đối với kỳ vọng của người dùng. – TechZen

+2

Tôi không nghĩ rằng bạn có thể nhận được chuyển đổi mà bạn muốn bằng một biến đổi đơn giản bởi vì chuyển động chính trong chuyển đổi curl là chuyển động chéo của góc dưới cùng bên phải. Không có vấn đề làm thế nào bạn xoay hoặc chuyển đổi quan điểm, chuyển động đường chéo sẽ vẫn sẽ phá hủy ảo giác của một curl trái sang phải đơn giản. – TechZen

9

Có thể thực hiện các lọn tóc ở bất kỳ trong bốn hướng nào bằng cách sử dụng chế độ xem vùng chứa. Đặt chuyển đổi quan điểm container với góc bạn muốn và sau đó làm curl bằng cách thêm cái nhìn của bạn đến xem container, không giao diện chính của ứng dụng của bạn mà không có một khung chuyển:

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]; 
+0

Chế độ xem bạn đang thêm vào containerView là gì[email protected] –

2

Tôi cũng phải vật lộn với điều này. Để có được curl đến từ bên phải hoặc bên trái, bạn có thể tạo chế độ xem trung gian và biến đổi nó.Vì vậy, chúng ta hãy nói xem bạn đang chuyển (MyView) là con của cửa sổ chính (parentView):

-parentView 
-->myView 

Bạn sẽ chèn một cái nhìn trung gian ở giữa (dễ dàng thực hiện trong giao diện Builder):

-parentView 
-->containerView 
--->myView 

sau đó, sử dụng đoạn mã sau để lật container 90 độ bên trái và xem chuyển 90 độ ngay:

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

myView vẫn sẽ xuất hiện thẳng đứng cho người sử dụng nhưng quá trình chuyển đổi sẽ nghĩ đó là áp dụng ở 90 độ từ bên trái.

Lưu ý rằng tùy thuộc vào cách tự động mở rộng quy mô quan điểm của bạn, bạn có thể phải sửa chữa các kích thước khung hình sau khi áp dụng các thay đổi, ví dụ như

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

Hope this helps. Là gần nhất bạn có thể nhận được để UIViewAnimationTransitionCurlLeft và UIViewAnimationTransitionCurlRight.

+0

Câu trả lời hay! Công thức của bạn hoạt động như một sự quyến rũ. – Bram

2

Tôi đã thử giải pháp của fluXa trên iOS5 (Vì vậy, tôi đã phải sử dụng [UIView trans ......]) nhưng nó không hoạt động: curl vẫn đi lên hoặc xuống dưới. Rõ ràng quá trình chuyển đổi hiện nay không tính đến biến đổi của chế độ xem. Vì vậy, trong trường hợp người khác muốn thực hiện cùng một mẹo trên iOS5, giải pháp là thêm một vùng chứa khác vào giữa và tạo hiệu ứng chuyển tiếp từ đó.

Đây là mã của tôi, có một chút cụ thể vì tôi muốn cuộn tròn 'sang trái', nhưng với góc uốn thấp hơn. Như thể tôi đang xé một trang ra khỏi một quyển sổ ghi chú.

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

Ghi chú:

  1. Tôi phải thừa nhận rằng affine biến đổi dịch (80,80) không có ý nghĩa trong tâm trí của tôi, nhưng nó là cần thiết cho iphone, có lẽ sẽ không hoạt động trên iPad.
  2. flipSizeRect lật chiều rộng và chiều cao của hình chữ nhật (bạn đã có điều đó, phải không?)
  3. dispatch_after là cần thiết vì tôi đã thêm vùng chứa và sau đó muốn xóa chế độ xem khỏi cấu trúc phân cấp. Nếu tôi rời khỏi công văn không có gì hoạt hình. Suy đoán tốt nhất của tôi là trước tiên chúng ta cần phải để cho hệ thống thực hiện việc bố trí vượt qua trước khi chúng ta có thể tạo hiệu ứng động.