2012-03-10 28 views
10

Tôi muốn xoay một lớp có hình ảnh ở góc trên bên trái và không phải là trung tâm. Theo tài liệu tôi đặt thuộc tính anchorPoint thành [0, 1]. Chế độ xem quay trong ví dụ của tôi 50 °, nhưng trước khi nó bắt đầu hoạt ảnh, chế độ xem chuyển sang một điểm khác trên màn hình.Làm thế nào để xoay một lớp tại một điểm neo cụ thể mà không bỏ qua?

self.shakeTag.layer.anchorPoint = CGPointMake(0.0f, 1.0f); 
[UIView beginAnimations:@"rotate" context:nil]; 
[self.shakeTag.layer setTransform: 
    CATransform3DRotate(CATransform3DIdentity, 
    radians(50.0), 0.0f, 0.0f, 1.0f)]; 
[UIView commitAnimations]; 

radians() được định nghĩa như thế này:

static inline double radians (double degrees) {return degrees * M_PI/180;} 

Khi tôi sử dụng một hình ảnh mà là 4 lần so với kích thước và có rất nhiều điểm ảnh trong suốt, tôi có thể xoay nó tại điểm neo mặc định [0,5 , 0,5], nhưng tôi không muốn lãng phí không gian cho các điểm ảnh vô hình. Bất kỳ ý tưởng làm thế nào tôi có thể ngăn chặn các lớp nhảy trước khi luân chuyển diễn ra?

+0

Nếu bạn nghĩ rằng câu trả lời là đúng, nó sẽ là tuyệt vời nếu bạn chấp nhận. – Krumelur

+0

bạn cần xem câu trả lời của tôi ở đây: http://stackoverflow.com/a/22188420/550393 – 2cupsOfTech

Trả lời

20

Thay đổi điểm neo ảnh hưởng đến vị trí của chế độ xem của bạn. Bạn sẽ cần thay đổi vị trí của chế độ xem nếu bạn thay đổi điểm neo và nếu bạn muốn giữ nguyên chế độ xem hiện tại của nó. Sử dụng một cái gì đó như thế này (lấy từ đây: Layer Position jumps at start of (Core) Animation) để thiết lập điểm neo của bạn và bồi thường thay đổi vị trí:

-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view 
{ 
    CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y); 
    CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y); 

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform); 
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform); 

    CGPoint position = view.layer.position; 

    position.x -= oldPoint.x; 
    position.x += newPoint.x; 

    position.y -= oldPoint.y; 
    position.y += newPoint.y; 

    view.layer.position = position; 
    view.layer.anchorPoint = anchorPoint; 
} 

Cũng xem ở đây để biết thêm chi tiết: Changing my CALayer's anchorPoint moves the view