2009-07-10 24 views
26

Có bất kỳ vấn đề nào khi áp dụng nhiều biến đổi cho UIView và CALDS tương ứng không?Áp dụng nhiều biến đổi cho UIView/CALayer

Cụ thể, bạn có thể "trộn và kết hợp" CATransform3D với CGAffineTransforms mà không gặp sự cố không?

Ngoài ra có bất kỳ vấn đề nào với việc thiết lập một số biến đổi trực tiếp trong khi tạo hoạt ảnh thay đổi biến đổi khác cùng một lúc không?

Có bất kỳ "quy tắc" nào về cách thực hiện việc này hay bất kỳ mẫu thiết kế nào cho điều này không?

Trả lời

38

Tôi nhận thấy điều này không trả lời câu hỏi hoàn toàn (hoặc đến gần), nhưng nếu bạn chỉ làm việc với CGAffineTransforms, bạn có thể sử dụng CGAffineTransformConcat() để kết hợp nhiều biến đổi.

Điều này sẽ chỉ hoạt động tốt khi một số biến đổi là hoạt ảnh và các biến thể khác không hoạt động, miễn là bạn đồng bộ hóa các phép biến đổi đúng cách. Tôi không biết làm thế nào điều này hoạt động khi bạn cũng đang làm biến đổi lớp.

+1

'CGAffineTransformConcat' hoạt động tốt cho hai biến đổi nhưng là một chút akward cho ba hoặc nhiều hơn. Xem [câu trả lời này] (http://stackoverflow.com/questions/30929986/how-to-apply-multiple-transforms-in-swift/30929987#30929987) để làm nhiều hơn hai. – Suragch

31

pix0r là đúng nhưng dưới đây là một số thông tin khác về điều này. The official docs for CGAffineTransformConcat().

Ngoài ra, đây là một ví dụ nhanh:

// Rotate 45 degrees 
CGAffineTransform rotate = CGAffineTransformMakeRotation(45*(M_PI/180)); 
// Move to the left 
CGAffineTransform translate = CGAffineTransformMakeTranslation(-50,0); 
// Apply them to a view 
self.view.transform = CGAffineTransformConcat(translate, rotate); 
+2

Không phải nó là CGAffineTransformConcat (xoay, dịch), cho rằng các điểm là vectơ hàng? – Plumenator

+0

Tôi nghĩ như vậy, nhưng nó xuất hiện các dịch nên được áp dụng đầu tiên. Xoay vòng quanh tâm của hệ tọa độ đã dịch, nhưng nếu bạn xoay đầu tiên thì dịch, bản dịch nằm dọc theo trục của hệ tọa độ xoay. – gamozzii

-1

tôi thành công dịch và xoay một IMAGExem trong cùng một thời điểm, theo cách này:

float scaleFactor_x = 2.8; 
float scaleFactor_y = 2.45; 
imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100); 
CGAffineTransform scaleTrans = CGAffineTransformMakeScale(scaleFactor_x, scaleFactor_y); 
CGAffineTransform translateTrans = CGAffineTransformMakeTranslation(0, 55); 
imgBigBallBasic.contentMode = UIViewContentModeScaleAspectFit; 
imgBigBallBasic.transform = CGAffineTransformConcat(translateTrans, scaleTrans); 
imgBigBallBasic.frame = CGRectMake(112, 20, 100, 100); 
imgBigBallBasic.center = [[imgBigBallBasic window] center]; 
[UIView commitAnimations]; 
1

Cú pháp đã thay đổi một chút với Swift 3. Thích ứng của câu trả lời @ whitehawk của:

// Rotate 45 degrees 
var rotate = CGAffineTransform(rotationAngle: 45 * (.pi/180)) 
// Move to the left 
var translate = CGAffineTransform(translationX: -50, y: 0) 
// Apply them to a view 
self.view.transform = translate.concatenating(rotate) 
Các vấn đề liên quan