2013-12-11 13 views
7

Tôi đang cố gắng chuyển đổi rất đơn giản: một chế độ xem di chuyển nửa màn hình sang trái trong khi chế độ xem thứ hai ("đến") di chuyển trong nửa màn hình.Nhấp nháy trong quá trình chuyển đổi bộ điều khiển chế độ xem tùy chỉnh iOS 7

Tôi có hoạt ảnh hoạt động, nhưng khi tôi đảo ngược hoạt ảnh, tôi thấy một nhấp nháy. Chế độ xem "to" (tức là chế độ xem gốc) hiển thị ở gốc 0,0 mặc dù tôi đã đặt khung khác.

Tôi đã đổ phân cấp chế độ xem. Các khung hình được đặt chính xác (-100 0; 320 480 cho chế độ xem), tuy nhiên nó được hiển thị ở mức 0,0. Ảnh chụp màn hình của chế độ xem có được lưu vào nơi nào đó cho hoạt ảnh không?

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 

UIView *container = [transitionContext containerView]; 

CGRect offsetCoverRect = CGRectMake(-100.0, 0.0, 320, 480); 
CGRect detailsRect  = CGRectMake(-100.0 + 320.0, 0.0, 320, 480); 
CGRect detailsOutsideRect = CGRectMake(320.0, 0.0, 320, 480); 

CGRect normalRect = CGRectMake(0.0, 0.0, 320, 480); 


if (self.revealDetails) 
{ 
    toViewController.view.frame = detailsOutsideRect; 
    [container addSubview:toViewController.view]; 
} 
else 
{ 
    [container insertSubview:toViewController.view belowSubview:fromViewController.view]; 

    // reversing… set the frame to the original offset (shows at 0,0 for a moment) 
    toViewController.view.frame = offsetCoverRect; 
} 

[UIView animateKeyframesWithDuration:2 delay:0 options:0 animations:^{ 

    if (self.revealDetails) 
    { 
     fromViewController.view.frame = offsetCoverRect; 
     toViewController.view.frame = detailsRect; 
    } 
    else 
    { 
     fromViewController.view.frame = detailsOutsideRect; 
     toViewController.view.frame = normalRect; 
    } 
} completion:^(BOOL finished) { [transitionContext completeTransition:finished]; }]; 
} 

Cập nhật:

Có vẻ như có liên quan đến UIModalPresentationCustom. Tôi cần phải sử dụng điều này để chế độ xem không bị xóa khi quá trình chuyển đổi hoàn tất. Tuy nhiên, có vẻ như giả định rằng bộ điều khiển xem từ cho quá trình chuyển đổi ngược bắt đầu từ 0,0.

Cập nhật 2:

Rất dễ dàng để tái tạo với đoạn mã sau:

UIView *snapshot = [containerView snapshotViewAfterScreenUpdates:NO]; 
[containerView addSubview:snapshot]; 

trên sẽ hiển thị để xem các clip tập trung vào màn hình, không có vấn đề gì trung tâm khung hình thực tế hay tôi đặt trước các hình ảnh động.

+0

Điều này có liên quan đến 'initialFrameForViewController:' của phiên bản 'UIViewControllerContextTransitioning' không? – Mark

+0

Bạn có vấn đề này bằng cách sử dụng thiết bị hoặc chỉ trong mô phỏng? – MatterGoal

+0

@MatterGoal cũng có trên thiết bị. Có vẻ như lượt xem bắt đầu từ 0,0 bất kể tôi đặt gì. – Mark

Trả lời

-2

Điều này là do phương thức animateTransition của bạn đang được gọi từ nền. Gọi phương pháp của bạn theo cách này

dispatch_async(dispatch_get_main_queue(),^
       { 
        [self animateTransition]; // your method goes here 
       }); 

Bạn không bao giờ nên gọi cho bất kỳ hoạt hình hoặc bất kỳ phương pháp UI liên quan về chủ đề nền

+0

animateTransition: được gọi bởi khung công tác. –

2

Tôi biết đây là một câu hỏi cũ, nhưng tôi chạy vào cùng một vấn đề và sau giờ làm của đấu tranh, cuối cùng đã đưa ra một giải pháp:

trong khối hoàn thành phim hoạt hình hiện nay,

  1. Tạo một bản chụp của fromView view controller
  2. Thực hiện thay đổi khung hình/biến đổi trên ảnh chụp
  3. Thêm ảnh chụp với containerView
  4. Tháo xem fromViewController từ giao diện chứa
  5. Trong khối hoàn thành hoạt hình miễn nhiệm (hoặc bất cứ nơi nào nếu một mình sa thải ?), xóa ảnh chụp nhanh khỏi vùng chứa

Bằng cách loại bỏ chế độ xem fromViewController khỏi chế độ xem vùng chứa, nó không được đặt lại vị trí ban đầu vì nó không còn ở bên trong chế độ xem vùng chứa.

Các vấn đề liên quan