2015-01-13 14 views
15

Tôi đang gặp vấn đề về quy mô và bản dịch CGAffineTransform khi tôi đặt biến đổi trong khối hoạt ảnh trên chế độ xem đã có biến đổi chế độ xem nhảy một chút trước khi hoạt ảnh.CGAffineTransform scale và translation - nhảy trước khi hoạt hình

Ví dụ:

// somewhere in view did load or during initialization 
var view = UIView() 
view.frame = CGRectMake(0,0,100,100) 
var scale = CGAffineTransformMakeScale(0.8,0.8) 
var translation = CGAffineTransformMakeTranslation(100,100) 
var concat = CGAffineTransformConcat(translation, scale) 
view.transform = transform 

// called sometime later 
func buttonPressed() { 
    var secondScale = CGAffineTransformMakeScale(0.6,0.6) 
    var secondTranslation = CGAffineTransformMakeTranslation(150,300) 
    var secondConcat = CGAffineTransformConcat(secondTranslation, secondScale) 
    UIView.animateWithDuration(0.5, animations: {() -> Void in 
     view.transform = secondConcat 
    }) 

} 

Bây giờ khi buttonPressed() được gọi là điểm nhảy đến phía trên bên trái khoảng 10 pixel trước khi bắt đầu chuyển động. Tôi chỉ chứng kiến ​​vấn đề này với một biến đổi concat, chỉ sử dụng một biến đổi dịch hoạt động tốt.

Chỉnh sửa: Kể từ khi tôi đã thực hiện rất nhiều nghiên cứu về vấn đề tôi nghĩ rằng tôi nên đề cập rằng vấn đề này xuất hiện bất kể có hay không bố trí tự động được bật

+0

Nếu bạn sử dụng 'CGAffineTransformTranslate (secondScale, 150,300)' thì sao? –

+0

Kết quả chính xác là – matteok

+0

"Nhảy một chút" nghĩa là gì? Liệu nó có trở lại biến đổi nhận dạng? Liệu nó animate để 'secondConcat' từ nhảy hoặc nhảy nó, trở về concat, _then_ animate để' secondConcat'? –

Trả lời

25

Tôi đã gặp sự cố tương tự nhưng không thể tìm thấy nguồn chính xác của vấn đề. Bước nhảy dường như chỉ xuất hiện trong các điều kiện rất cụ thể: Nếu chế độ xem hoạt ảnh từ biến đổi t1 thành biến đổi t2 và cả hai biến đổi là kết hợp giữa tỷ lệ và bản dịch (chính xác là trường hợp của bạn). Do cách giải quyết sau, điều này không có ý nghĩa với tôi, tôi cho rằng đó là một lỗi trong Core Animation.

Trước tiên, tôi đã thử sử dụng CATransform3D thay vì CGAffineTransform.

Cũ mã:

var transform = CGAffineTransformIdentity 
transform = CGAffineTransformScale(transform, 1.1, 1.1) 
transform = CGAffineTransformTranslate(transform, 10, 10) 
view.layer.setAffineTransform(transform) 

Code mới:

var transform = CATransform3DIdentity 
transform = CATransform3DScale(transform, 1.1, 1.1, 1.0) 
transform = CATransform3DTranslate(transform, 10, 10, 0) 
view.layer.transform = transform 

Các mã mới nên tương đương với một tuổi (tham số thứ tư được thiết lập để 1.0 hoặc 0 để không có mở rộng quy mô/dịch theo hướng z) và trên thực tế, nó hiển thị cùng một bước nhảy. Tuy nhiên, ở đây có ma thuật đen: Trong sự chuyển đổi quy mô, thay đổi z tham số để bất cứ điều gì khác biệt so với 1.0, như thế này:

transform = CATransform3DScale(transform, 1.1, 1.1, 1.01) 

Tham số này sẽ không có hiệu lực, nhưng bây giờ khi nhảy đã biến mất.

+0

Tôi nghĩ câu trả lời này không nhận được đủ tín dụng ... Tôi đã viết mã trong nhiều ngày và không thể sửa lỗi này. – farzadshbfn

0

Thay vì CGAffineTransformMakeScale() và CGAffineTransformMakeTranslation() , tạo ra một biến đổi dựa trên CGAffineTransformIdentity (về cơ bản không biến đổi), bạn muốn mở rộng và dịch dựa trên biến đổi hiện tại của khung nhìn bằng cách sử dụng CGAffineTransformScale() và CGAffineTransformTranslate(), bắt đầu với biến đổi hiện có.

+0

Tôi thực sự cần phải thiết lập một biến đổi tuyệt đối trong hoạt hình có nghĩa là tôi không muốn thêm vào biến đổi hiện tại nhưng thay thế nó hoạt hình – matteok

+1

Ngoài ra tôi chỉ cố gắng sử dụng CGAffineTransformTranslate thay vì CGAffineTransformMakeTranslate và vấn đề vẫn giữ nguyên. – matteok

1

Nguồn của sự cố là thiếu thông tin phối cảnh để chuyển đổi.

Bạn có thể thêm thông tin quan điểm sửa đổi m34 tài sản của 3d của bạn chuyển đổi

var transform = CATransform3DIdentity 
transform.m34 = 1.0/200 //your own perspective value here 
transform = CATransform3DScale(transform, 1.1, 1.1, 1.0) 
transform = CATransform3DTranslate(transform, 10, 10, 0) 
view.layer.transform = transform 
+0

Bạn có thể giải thích thêm một chút và lý do tại sao [this] (http://stackoverflow.com/a/33465048/1971013) 'kỳ diệu' hoạt động? –

2

Trông như Apple UIView hoạt hình lỗi nội bộ.Khi Apple nội suy CGAffineTransform thay đổi giữa hai giá trị để tạo ra hình ảnh động nó nên làm các bước sau:

  • Extract dịch, quy mô và xoay
  • suy chiết xuất giá trị hình thức bắt đầu để kết thúc
  • Lắp ráp CGAffineTransform cho mỗi bước suy

Lắp nên được theo thứ tự sau đây:

  • Dịch
  • Scaling
  • Rotation

Nhưng trông giống như Apple làm cho dịch sau khi mở rộng quy mô và xoay. Lỗi này phải được Apple cố định.

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