2011-08-29 40 views

Trả lời

18

Đây là một chức năng sử dụng cùng định dạng như CoreGraphics CGAffineTransform Định dạng API.

Công trình này hoạt động chính xác cách các API "RotateAt()" khác hoạt động.

Thao tác tương ứng với đặc điểm kỹ thuật sau: dịch (pt.x, pt.y); xoay (góc); dịch (-pt.x, -pt.y);

CGAffineTransform CGAffineTransformMakeRotationAt(CGFloat angle, CGPoint pt){ 
    const CGFloat fx = pt.x, fy = pt.y, fcos = cos(angle), fsin = sin(angle); 
    return CGAffineTransformMake(fcos, fsin, -fsin, fcos, fx - fx * fcos + fy * fsin, fy - fx * fsin - fy * fcos); 
} 

Giống như với CGAffineTransformMakeRotation(), góc bằng radian chứ không phải độ.

+1

Tôi giả định pt là một trung tâm? – Andy

+0

Tại sao bạn không thể thực hiện 'var t = CGAffineTransformMakeTranslation (-pt.x, -pt.y)' và sau đó thực hiện xoay vòng với 't = CGAffineTransformRotate (t, angel)' và sau đó dịch ngược lại với 'var t = CGAffineTransformTranslate (t, pt.x, pt.y) '? – Adam

+1

@Adam Đó là 3 điều bạn phải làm. Câu trả lời của tôi là một cuộc gọi để làm cả ba. Vô cùng tối ưu. Vui lòng đọc lại câu trả lời của tôi, đặc biệt là dòng thứ 3 trước mã. – Andy

1

Tôi vừa chụp ảnh này. Một cái gì đó như sẽ cung cấp cho bạn những kết quả mà bạn đang tìm kiếm ...

- (void)rotateView:(UIView *)view aroundPoint:(CGPoint)point withAngle:(double)angle{ 
    //save original view center 
    CGPoint originalCenter = view.center; 

    //set center of view to center of rotation 
    [view setCenter:point]; 

    //apply a translation to bring the view back to its original point 
    view.transform = CGAffineTransformMakeTranslation(originalCenter.x, originalCenter.y); 

    //multiply the view's existing rotation matrix (the translation) by a rotation and apply it to the view 
    //thereby making it rotate around the external point 
    view.transform = CGAffineTransformConcat(view.transform, CGAffineTransformMakeRotation(angle)); 
} 

Chỉ cần giải thích lý luận của tôi một chút ...

Những gì chúng tôi về cơ bản làm là thể chất thay đổi quan điểm đến điểm xoay vòng, sau đó áp dụng một bản dịch để làm cho nó trông giống như nó vẫn ở điểm gốc. Sau đó, nếu chúng ta nhân một vòng quay với bản dịch mới của khung nhìn, về cơ bản chúng ta xoay toàn bộ khung nhìn và hệ tọa độ của nó, do đó, nó giống như xoay vòng quanh điểm đã cho. Tôi hy vọng tôi đã giải thích rõ điều đó. : | Nếu không, tôi đề nghị tìm kiếm ma trận chuyển đổi trực tuyến có thể bạn có thể tìm thấy giải thích tốt hơn về cách chúng ngăn xếp ở đó!

2

Đặt anchorPoint của lớp xem hình ảnh thành thứ gì đó bên ngoài (0,0) và (1,1), tức là view.layer.anchorPoint = CGPointMake (2, 2).

+0

Nếu bạn đi với điều này hãy nhớ hai điều: a) điều này sẽ hoàn toàn thay đổi nơi chế độ xem của bạn được vẽ, không chỉ chuyển đổi b) giá trị x và y của anchorPoint là bội số của kích thước khung nhìn. Chúng không nằm trong hệ tọa độ xem chính. – mjisrawi

2

Tôi đã giải quyết theo cách này: Tôi đặt UIImage mà tôi muốn xoay sang chế độ xem khác. Chế độ xem lớn nhất so với chế độ xem hình ảnh để điểm trung tâm của chế độ xem là điểm ngoài uiimage, vì vậy tôi xoay chế độ xem ....

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