2013-03-17 42 views
7

Tôi đang cố gắng tạo hoạt ảnh trong ứng dụng iOS của mình, nơi chế độ xem mới chiếu trên màn hình từ bên trái trong khi chế độ xem chính trượt sang phải để nhường chỗ cho nó. Chế độ xem chính là chế độ xem con của chế độ xem trên của trình điều khiển chế độ xem của tôi và chế độ xem bên trang trình bày được tải từ một tệp xib riêng biệt.Cố gắng tạo hiệu ứng đồng thời hai UIViews, chỉ một lần di chuyển

Trong trường hợp nó có liên quan, đây là mã của tôi cho tải giao diện bên, gọi là từ phương pháp viewDidLoad xem điều khiển chính của tôi:

sideViewController = [[SideViewController alloc] init]; 
[sideViewController loadView]; 

sideView = sideViewController.topView; 
[self.view addSubview:sideView]; 
sideView.hidden = YES; 
sideView.frame = CGRectMake(-200, 0, 200, 460); 

Và đây là đoạn code mà được gọi để animate hai quan điểm:

sideView.hidden = NO; 
[UIView animateWithDuration:0.25f 
       animations:^{       
        mainView.frame = CGRectMake(200, 0, 320, 460); 
        sideView.frame = CGRectMake(0, 0, 200, 460); 
       }]; 

Điều này dường như đủ đơn giản. Nhưng đối với một số lý do, chỉ có hoạt ảnh sideView - mainView không di chuyển bất cứ đâu. Và để làm cho mọi thứ trở nên khó hiểu hơn, nếu tôi nhận xét dòng trong khối hoạt hình di chuyển sideView, hoạt ảnh cho mainView bắt đầu hoạt động.

Có ai biết điều gì sai? Từ tất cả các tìm kiếm và tài liệu tôi đã đọc, những gì tôi đang làm phải hoạt động tốt. Những gì tôi nghĩ sẽ là một hoạt hình đơn giản đã biến thành những giờ thất vọng. Bất kì sự trợ giúp nào đều được đánh giá cao!

Chỉnh sửa:

Tắt đề xuất của Guo Luchuan Tôi đã thử làm động các đặc tính khác nhau của hai UIViews. Hầu hết đều có cùng một kết quả, mặc dù hoạt ảnh cả hai thuộc tính biến đổi của chúng đều là gần như hoạt động. Trong trường hợp đó cả hai UIViews hoạt hình, nhưng mainView chỉ làm điều sai: hoạt hình của nó bắt đầu với nó ở một vị trí khác và kết thúc ở vị trí sai. Dường như nó thực hiện các dịch Tôi hướng dẫn nó để làm, nhưng bắt đầu từ vị trí này thể hiện trong tính toán vector:

starting_point - 0.5 * total_translation 

nghĩa là nó kết thúc vào:

starting_point + 0.5 * total_translation 

Các Sideview, tuy nhiên, sinh động một cách chính xác.

Điều này thật đáng buồn. Tôi đã không nhận ra hình động hoạt hình trên iOS theo cách này đã bị hỏng. Điều tiếp theo tôi sẽ thử là sử dụng CABasicAnimation, mặc dù tôi không hài lòng nhưng tôi phải sử dụng API mức thấp như vậy cho một thứ đơn giản như vậy.

Trả lời

3

Sự cố là tôi đã tự động bật cho các tệp xib của mình. Ngay sau khi tôi tắt nó, mã hoạt hình gốc của tôi hoạt động hoàn hảo.

+0

Tôi gặp sự cố tương tự và cũng đã bật tính năng autoLayout. Tắt nó đã không giúp tôi bất cứ điều gì không may .... mặc dù tôi có thể đã bỏ lỡ nơi bạn tắt nó trên toàn cầu (Tôi đang xây dựng màn hình của tôi với mã). Một giải pháp mà tôi tìm thấy là nhúng cả hai chế độ xem trong chế độ xem vùng chứa chính và chỉ tạo hiệu ứng đó. – avance

4

Tôi đã gặp một vấn đề rất giống với bạn.

Khi tôi đặt 2 lượt xem cùng một thuộc tính (như frame hoặc transform) cùng một lúc, trong UIView animation block, nó sẽ không hoạt động cho những gì tôi mong đợi.

Vì vậy, tôi đặt chế độ xem frame và đặt chế độ xem khác transform, sau đó nó hoạt động tốt, nhưng tôi không biết tại sao nó lại như vậy.

Tôi nghĩ rằng nó sẽ hoạt động tốt cho bạn.

sideView.hidden = NO; 
[UIView animateWithDuration:0.25f 
       animations:^{       
        mainView.frame = CGRectMake(200, 0, 320, 460); 
        sideView.transform = CGAffineTransformMakeTranslation(200,0); 
       }]; 

Và tôi nghĩ bạn có thể làm 2 CABasicAnimation và sau đó thêm chúng vào CAAnimationGroup.Nó cũng có thể làm việc cho bạn

+0

Đây là một gợi ý tuyệt vời, mặc dù tôi đã thử và nó không hoạt động. Tôi đã thực sự cố gắng tạo ra một số kết hợp các thuộc tính khác nhau và có kết quả tương tự hoặc kết quả sai khác. Tôi sẽ chỉnh sửa bài đăng chính của mình để đi sâu vào chi tiết hơn. – GuyGizmo

0

Nếu sideView là một subview của mainView, sử dụng phương pháp hoạt hình này:

+animateWithDuration:delay:options:animations:completion: 

với tùy chọn:

UIViewAnimationOptionAllowAnimatedContent 
+0

sideView và mainView là anh chị em bên dưới chế độ xem trên của trình điều khiển chế độ xem của tôi, vì vậy điều này không nên áp dụng. Tuy nhiên, điều kỳ lạ là sideView rõ ràng ảnh hưởng đến mainView theo một cách kỳ lạ mà tôi không hiểu, vì vậy tôi đã thử sử dụng tùy chọn này, nhưng nó không tạo ra bất kỳ sự khác biệt nào. – GuyGizmo

+0

Xin lỗi, tôi đã đọc sai Q của bạn. Nếu họ là anh chị em, tôi không biết điều gì đang xảy ra với bạn. – Tricertops

0

cuối cùng tôi đã tìm thấy một giải pháp, và Tôi nghĩ nó khá ghê tởm. Đây là mã hoạt động:

mainView.transform = CGAffineTransformMakeTranslation(400,0); 
CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ]; 
[move setFromValue:[NSNumber numberWithFloat:200]]; 
[move setToValue:[NSNumber numberWithFloat:400]]; 
[move setDuration:0.25]; 
move.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
[[mainView layer] addAnimation:move forKey:@"transform.translation.x"]; 

sideView.center = CGPointMake(100, 230); 
CABasicAnimation *sideMove = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ]; 
[sideMove setFromValue:[NSNumber numberWithFloat:-200]]; 
[sideMove setToValue:[NSNumber numberWithFloat:0]]; 
[sideMove setDuration:0.25]; 
sideMove.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
[[sideView layer] addAnimation:sideMove forKey:@"transform.translation.x"]; 

Trước tiên, nếu tôi không đặt biến đổi của mainView, toàn bộ điều này sẽ không hoạt động và chế độ xem chính sẽ không di chuyển bất cứ nơi nào sau khi hoạt ảnh được thực hiện. Tôi đã thử thiết lập khung và trung tâm của nó, nhưng không có hiệu ứng nào. Chỉ biến đổi làm việc. Chi tiết này tương tự như sử dụng phương thức animateWithDuration.

Thứ hai, và đây là phần khiến tôi bối rối nhất, tại sao những con số đó là gì? Vì lý do nào đó, tôi cần phải bù đắp mainView thêm 200 pixel ở bên phải (chiều rộng của sideView) để làm cho nó xếp hàng đúng cách. Nếu tôi không làm điều đó, nó sẽ động đến chính xác nơi mà nó từng là, mặc dù tôi đã thay đổi sự biến đổi affine từ bản sắc thành một bản dịch 200 pixel ở bên phải. Khi gần như tôi có thể nói, sideView ảnh hưởng đến mainView theo cách lạ, mặc dù chúng là anh chị em trực tiếp dưới chế độ xem cấp cao nhất của trình điều khiển chế độ xem của tôi và không nên có bất kỳ mối quan hệ phân cấp nào. Đoán của tôi là điều này có liên quan đến việc tải sideView từ một xib, nhưng theo như tôi có thể nói, tôi đang làm điều đó một cách chính xác.

Hy vọng rằng giải pháp này sẽ hữu ích cho người khác thấy mình trong tình huống tương tự, và họ sẽ không phải làm chương trình gà chết khó chịu mà tôi vừa làm.

Ngoài ra, nếu có ai có thể đưa ra lời giải thích cho tất cả điều này, tôi sẽ rất cảm kích! Tôi không thích viết mã những thứ mà tôi không hiểu, và tôi rất muốn tìm hiểu tại sao tất cả những điều này lại xảy ra để tôi có thể tránh những tình huống như thế này trong tương lai.

+1

Q thực sự là, ** tại sao ** nó không hoạt động theo cách đơn giản? Nếu bạn có thể cho tôi biết một số điều khác: Từ đâu đang gọi hoạt ảnh? Bạn đang sử dụng tự động hóa hoặc Bố cục tự động trong mã và XIB? – Tricertops

+2

Ôi trời ơi, toàn bộ vấn đề là tôi đã bật chế độ tự động bật. Đây không phải là lần đầu tiên tôi phạm sai lầm đó, nhưng tôi đã quên nó cho đến khi bạn đề cập đến nó. Tôi chỉ cần tắt nó trên cả hai tập tin xib của tôi và tất cả các animateWithDuration đột ngột hoạt động hoàn hảo. Giờ của tôi đã bị mất vì tính năng đó, và không có dấu hiệu cho thấy đó là thủ phạm. – GuyGizmo

+0

Có, khi sử dụng Bố cục Tự động, bạn không sửa đổi trực tiếp các khung hình. Tôi đã không thử hình động dưới Auto Layout, nhưng có lẽ bạn có thể animate 'constant' của các ràng buộc. – Tricertops

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