2012-12-15 22 views
5

Tôi có một hoạt ảnh đơn giản, nơi tôi đang mở rộng chế độ xem mới từ trung tâm cũ, trong khi đó mờ dần. Tuy nhiên, các bản xem trước của chế độ xem mới này (một nút và một nhãn) "bay" từ từ phía dưới bên phải màn hình khi chế độ xem mới mở rộng để chiếm toàn bộ màn hình. Tôi đã thử với và không có autolayout bật, và trong khi hai kịch bản cho kết quả khác nhau, cả hai đều sai.Các cuộc phỏng vấn không được định vị chính xác trong khi hoạt ảnh

Các thiết lập được đơn giản, tôi có hai bộ điều khiển xem chưa được nối trong một kịch bản, và sử dụng đoạn mã sau để animate sự thay đổi quan điểm:

-(void)switchViews2:(id)sender { 
    UIWindow *win = self.view.window; 
    YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"]; 
    yellow.view.frame = CGRectMake(0, 0, 1, 1); 
    yellow.view.center = self.view.center; 
    [win addSubview:yellow.view]; 
    CGRect frame = self.view.frame; 
    [UIView animateWithDuration:5 animations:^{ 
     yellow.view.frame = frame; 
     self.view.alpha = 0; 
    } 
      completion:^(BOOL finished) { 
       [self.view removeFromSuperview]; 
       win.rootViewController = yellow; 
     }]; 
} 

Câu hỏi đặt ra là, tại sao không phải là subviews ở lại nơi họ được cho là bên trong superview của họ khi nó hoạt hình.

Trả lời

3

Để phát triển một subview vào đúng vị trí, đặc biệt là khi bằng cách sử dụng Autolayout, nó là đơn giản hơn để animate các biến đổi tài sản thay vì khung. Bằng cách này, thuộc tính giới hạn của subview không thay đổi, do đó, nó không cảm thấy cần phải chuyển tiếp các subviews của nó tất cả các thời gian trong quá trình hoạt hình.

Thêm khung nhìn con của bạn với khung cuối cùng, đặt biến đổi của nó thành biến đổi affin rộng, giả sử 0,1, sau đó tạo hiệu ứng biến đổi đó thành biến đổi nhận dạng. Nó sẽ phát triển từ điểm trung tâm, với tất cả các cuộc phỏng vấn ở vị trí chính xác.

+0

Cảm ơn, tôi không có nhiều kinh nghiệm với các biến đổi, vì vậy tôi có xu hướng quên đi cách làm việc đó. Tôi đoán tôi nên đọc. – rdelmar

1

Vấn đề là do ràng buộc bố cục. Nếu thay vì thiết lập các khung nhìn trong khối hoạt hình, tôi thêm ràng buộc giữa các cửa sổ và quan điểm mới, sau đó gọi layoutIfNeeded trong khối animation nó hoạt động một cách chính xác:

-(void)switchViews2:(id)sender { 
    UIWindow *win = self.view.window; 
    YellowController *yellow = [self.storyboard instantiateViewControllerWithIdentifier:@"Yellow"]; 
    [yellow.view setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    yellow.view.frame = CGRectMake(0, 0, 1, 1); 
    yellow.view.center = self.view.center; 
    [win addSubview:yellow.view]; 

    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeLeading relatedBy:0 toItem:win attribute:NSLayoutAttributeLeading multiplier:1 constant:0]; 
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeTop relatedBy:0 toItem:win attribute:NSLayoutAttributeTop multiplier:1 constant:20]; 
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeTrailing relatedBy:0 toItem:win attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]; 
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:yellow.view attribute:NSLayoutAttributeBottom relatedBy:0 toItem:win attribute:NSLayoutAttributeBottom multiplier:1 constant:0]; 

    [win addConstraints:@[con1,con2,con3,con4]]; 

    [UIView animateWithDuration:1 animations:^{ 
     [win layoutIfNeeded]; 
     self.view.alpha = 0; 
    } 
      completion:^(BOOL finished) { 
       [self.view removeFromSuperview]; 
       win.rootViewController = yellow; 
     }]; 
} 
+0

Lưu ý rằng nếu bạn tình cờ sử dụng biểu mẫu đầy đủ, 'animateWithDuration: delay: options: animations: completion:', bạn có thể chuyển 'UIViewAnimationOptionLayoutSubviews' và nó sẽ làm' layoutIfNeeded' cho bạn. –

+0

@robmayoff, thực sự không hoạt động trong tình huống này. Tôi không có hoạt ảnh nếu tôi đưa vào tùy chọn đó - nó nhảy đến điều kiện cuối cùng. – rdelmar

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