2015-06-19 22 views
26

Tôi muốn áp dụng nhiều biến đổi cho một số UIView (hoặc phân lớp của UIView), chẳng hạn như dịch, xoay và chia tỷ lệ. Tôi biết rằng hai biến đổi có thể được áp dụng với CGAffineTransformConcat, nhưng làm cách nào để tôi thực hiện điều đó nếu tôi có từ ba biến trở trở lên?Cách áp dụng nhiều biến đổi trong Swift

Tôi đã thấy những câu hỏi này:

nhưng những câu hỏi này đang yêu cầu một cái gì đó khác nhau, và câu trả lời được đưa ra chỉ nói về việc áp dụng hai biến đổi với CGAffineTransformConcat. Ngoài ra, họ sử dụng Objective-C thay vì Swift.

Trả lời

73

Bạn có thể áp dụng nhiều phép biến đổi bằng cách xếp chồng chúng lên nhau.

var t = CGAffineTransform.identity 
t = t.translatedBy(x: 100, y: 300) 
t = t.rotated(by: CGFloat.pi/4) 
t = t.scaledBy(x: -1, y: 2) 
// ... add as many as you want, then apply it to to the view 
imageView.transform = t 

Hoặc gọn hơn (nhưng không nhất thiết là có thể đọc được):

imageView.transform = CGAffineTransform.identity.translatedBy(x: 100, y: 300).rotated(by: CGFloat.pi/4).scaledBy(x: -1, y: 2) 

Đây là loạt các biến đổi tạo ra hình ảnh bên phải:

enter image description here

Nhờ this answer cho việc giảng dạy tôi làm thế nào để làm điều đó.

Ghi chú

  • Thứ tự mà bạn áp dụng các biến đổi vấn đề này. Ví dụ, nếu các biến đổi được thực hiện theo thứ tự ngược lại nó sẽ tạo ra kết quả sau.

    t = t.scaledBy(x: -1, y: 2) 
    t = t.rotated(by: CGFloat.pi/4) 
    t = t.translatedBy(x: 100, y: 300) 
    

enter image description here

Xem thêm

Câu trả lời này đã được thử nghiệm với Swift 4

+0

Bạn có phiền expounding về "các vấn đề trật tự"? Tôi nhận ra đã hơn 2 năm kể từ khi bạn trả lời. –

+1

@ClayEllis, xem cập nhật của tôi – Suragch

13

Trong Swift 3, những đã được thay thế bởi các chức năng trên CGAffineTransform bản thân, có thể được xích.

extension CGAffineTransform { 
    public func translatedBy(x tx: CGFloat, y ty: CGFloat) -> CGAffineTransform 
    public func scaledBy(x sx: CGFloat, y sy: CGFloat) -> CGAffineTransform 
    public func rotated(by angle: CGFloat) -> CGAffineTransform 
} 

ví dụ như vậy

let transform = CGAffineTransform(scaleX: 1.0, y: 3.0).translatedBy(x: 12, y: 9).rotated(by: 17.0) 
Các vấn đề liên quan