2010-08-18 46 views
10

Tôi có một chế độ xem mà tôi muốn được chia tỷ lệ và dịch sang một vị trí mới bằng cách làm động nó. Tôi đã cố gắng đạt được điều đó với mã sau:Hoạt ảnh UIVIew - Chia tỷ lệ + Dịch

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:kDurationForFullScreenAnimation]; 
[[self animatingView] setFrame:finalRect]; 
[UIView commitAnimations]; 

Hiệu ứng của mã này là, lần đầu tiên thay đổi kích thước nội dung của nó thành finalRect rồi chuyển nó sang vị trí mới. tức là phần mở rộng không bao giờ hoạt ảnh. Chế độ xem chỉ được chuyển thành kích thước mới và sau đó được dịch.

Vấn đề này đã được thảo luận trong một số chủ đề khác nhưng không ai trong số họ đưa ra kết luận. Tuy nhiên, một giải pháp tồn tại, để sử dụng bộ hẹn giờ và đặt khung hình mỗi lần trong gọi lại bộ hẹn giờ, nhưng nó có một nhược điểm về hiệu suất.

Giải pháp thích hợp nhất cho vấn đề này là gì, tại sao trong trường hợp đầu tiên vấn đề này xảy ra?

Cảm ơn

Trả lời

33

Đặt khung không phải là tỷ lệ cũng như bản dịch. Bạn đang sử dụng thuật ngữ sai hoặc bạn đang sử dụng công cụ sai cho công việc. Quy mô và dịch cả hai được thực hiện bằng cách sử dụng biến đổi đồ họa lõi ảnh hưởng khi bạn đang tìm kiếm để ảnh hưởng đến UIView (trái ngược với lớp sử dụng biến đổi hoạt hình lõi).

Để mở rộng tầm nhìn sử dụng

// 2x 
[rotationView setTransform:CGAffineTransformMakeScale(2.0, 2.0)]; 

Để dịch, sử dụng

// Move origin by 100 on both axis 
[rotationView setTransform:CGAffineTransformMakeTranslation(100.0, 100.0)]; 

Để động này, quấn chúng trong một khối hình ảnh động. Nếu bạn muốn chuyển đổi chế độ xem với cả hai loại này, thì bạn cần ghép chúng lại.

Nếu bạn không muốn quy mô và dịch thuật (biến đổi), thì ý của bạn là bạn muốn thay đổi giới hạn và vị trí của khung nhìn. Đây là những thay đổi với các cuộc gọi đến

[view setBounds:newRect]; 
[view setCenter:newCenter]; 

đâu newRectnewCenter là một CGRectCGPoint lần lượt đại diện cho vị trí mới trên màn hình. Một lần nữa, những nhu cầu này được bao bọc trong một khối hoạt hình.

+0

Vấn đề là, nếu tôi làm như thế này, các nội dung của quan điểm và tất cả các tiểu quan điểm của mình đảm nhận newRect ngay lập tức . Chúng không hoạt ảnh với khung mới. Giống như nói rằng bạn có một imageView như một subView để xem animating, hình ảnh trong imageView không được thu nhỏ dần. Thay vào đó, hình ảnh lần đầu tiên được thổi lên newRect và sau đó các giới hạn của khung nhìn sẽ được chia thành + dịch.Thay đổi trung tâm hoạt động trong khối hoạt hình mặc dù, nhưng thay đổi giới hạn không như mong đợi. –

15

Dưới đây là một ví dụ với khối hoạt hình:

CGPoint newCenter = CGPointMake(100.0,100.0); 

[UIView animateWithDuration: 1 
         delay: 0 
        options: (UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
       animations:^{object.center = newCenter ; object.transform = CGAffineTransformScale(CGAffineTransformIdentity, 2.0, 2.0);} 
       completion:^(BOOL finished) { } 
]; 
4

Hãy thử giải pháp này:

CGAffineTransform s = CGAffineTransformMakeScale(0.5f,0.5f); 
    CGAffineTransform t = CGAffineTransformMakeTranslation(100, 0); 
    v2.transform = CGAffineTransformConcat(t,s); // not s,t 

hoạt động này là không giao hoán. Trình tự ngược lại với thứ tự khi sử dụng các chức năng tiện lợi để áp dụng một biến đổi này sang biến đổi khác.

Và bạn có thể sử dụng hoạt động này để: ví dụ (loại bỏ các Scale):

v2.transform = 
    CGAffineTransformConcat(CGAffineTransformInvert(s), v2.transform); 
+2

Câu trả lời hay. Trong tất cả các tìm kiếm của tôi, điều này đã cho tôi chính xác những gì tôi cần để làm cho hoạt hình này hoạt động giống như tôi cần. Tôi đang cố sao chép hoạt ảnh như đã thấy trên Android khi chọn trường văn bản có nhãn thu nhỏ lại và nhỏ hơn và sang trái. Chỉ cần một quy mô biến đổi co lại nhãn, nhưng xuống và bên phải. Các biến đổi dịch cũng là cần thiết, nhưng tôi không thể tìm thấy một cách để có được cả hai để làm việc. CGAffineTransformConcat là chìa khóa. Cảm ơn! – magnusMTB

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