2009-03-22 34 views
8

Xin lỗi nếu điều này là hiển nhiên hoặc được bảo hiểm ở nơi khác, nhưng tôi đã googling cả ngày và đã không tìm thấy một giải pháp mà thực sự làm việc.Tôi có thể di chuyển nguồn gốc khi thực hiện chuyển đổi xoay trong Quartz 2D cho iPhone không?

Sự cố của tôi như sau: Tôi hiện đang vẽ hình ảnh ở chế độ toàn màn hình UIView, ví dụ vì chúng tôi sẽ nói hình ảnh ở góc dưới cùng bên phải của UIView. Tôi muốn làm một biến đổi xoay (CGAffineTransformMakeRotation) ở trung tâm của hình ảnh đó, tuy nhiên, theo mặc định lệnh xoay quay xung quanh trung tâm của UIView nó tự. Kết quả là, hình ảnh của tôi di chuyển xung quanh màn hình khi tôi xoay thay vì nó ở tại chỗ và xoay quanh trung tâm của chính nó.

Từ những gì tôi đã thu thập, tôi cần dịch ngữ cảnh của mình để gốc (trung tâm của UIView) ở giữa hình ảnh của tôi, Xoay và sau đó khôi phục ngữ cảnh bằng cách dịch trở lại vị trí ban đầu.

Sau đây là điều gần nhất tôi đã nhận được để làm việc, nhưng vấn đề là trong khi hình ảnh đang quay, nó di chuyển xuống trong khi nó quay. Tôi nghĩ rằng đây là do hoạt hình Tweening bước 1 dịch và bước thứ 3 dịch thay vì chỉ nhận ra rằng sự khởi đầu và kết thúc điểm trên dịch sẽ là như nhau ...

// Before this i'd make a call to a function that draws a path to a passed in context 
CGAffineTransform inverseTranslation = CGAffineTransformMakeTranslation(transX, transY); 
CGAffineTransform translation = CGAffineTransformMakeTranslation(-transX, -transY); 
CGAffineTransform rot = CGAffineTransformMakeRotation(3.14); 
CGAffineTransform final = CGAffineTransformConcat(CGAffineTransformConcat(inverseTranslation, rot), translation); 
// Then i apply the transformation animation like normal using self.transform = final etc etc 

Tôi cũng đã thử những thứ như thế CGContextTranslateCTM và CGContextSaveGState/UIGraphicsPushContext, nhưng chúng dường như có ít ảnh hưởng.

Tôi đã chiến đấu với điều này trong nhiều ngày và giải pháp hiện tại của tôi có vẻ gần gũi, nhưng tôi không có đầu mối làm thế nào để thoát khỏi dịch tweening đó. Có ai có một giải pháp cho điều này hay một cách tốt hơn để đi về điều này?

[cập nhật] Hiện tại tôi đang vẽ hình ảnh của mình ở giữa trung tâm UIview và sau đó đặt thuộc tính UIView.center thành nguồn gốc mà tôi muốn xoay và sau đó thực hiện lệnh xoay. Có vẻ như một chút của một hack, nhưng cho đến khi tôi có thể nhận được các dịch thực sự làm việc đó là sự lựa chọn duy nhất của tôi. Cảm ơn!

Trả lời

14

Câu trả lời của duncanwilcox là câu trả lời đúng, nhưng anh ấy bỏ phần mà bạn thay đổi vị trí neo của lớp của khung nhìn đến điểm bạn muốn xoay quanh.

CGSize sz = theview.bounds.size; 
// Anchorpoint coords are between 0.0 and 1.0 
theview.layer.anchorPoint = CGPointMake(rotPoint.x/sz.width, rotPoint.y/sz.height); 
[UIView beginAnimations:@"rotate" context:nil]; 
theview.transform = CGAffineTransformMakeRotation(45./180. * M_PI); 
[UIView commitAnimations]; 

Đây là tài liệu ở đây: http://developer.apple.com/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html

+2

nhận xét nhanh- được chỉnh sửa để cho thấy rằng bạn nên sử dụng hằng số math.h khi làm việc với các giá trị pi. M_PI_4, M_PI_2, M_PI tốt hơn và chính xác hơn tất cả các lỗi làm tròn :) –

2

Xoay vòng xảy ra xung quanh điểm neo của lớp của chế độ xem. Mặc định cho anchorPoint là trung tâm (0.5, 0.5), do đó, việc quay một mình mà không có bản dịch là đủ.

Đã làm một kiểm tra nhanh chóng và các công trình này cho tôi:

[UIView beginAnimations:@"rotate" context:nil]; 
self.transform = CGAffineTransformMakeRotation(45./180. * 3.14); 
[UIView commitAnimations]; 
+0

lẽ mô tả của tôi hơi gây hiểu lầm. Tôi vẽ một cái gì đó trên một bối cảnh (tôi gọi nó là một hình ảnh, nhưng nó chỉ là một cái gì đó tôi rút ra bằng cách sử dụng lệnh ngữ cảnh) và nó không phải là ở cetner của bối cảnh. Tôi muốn xoay như thể trung tâm của bối cảnh là trung tâm của "hình ảnh" của tôi. – Skyler

+0

nhận xét nhanh- được chỉnh sửa để cho thấy rằng bạn nên sử dụng hằng số math.h khi làm việc với các giá trị pi. M_PI_4, M_PI_2, M_PI tốt hơn và chính xác hơn tất cả các lỗi làm tròn :) –

1

Nếu bạn không muốn một hình ảnh động để xảy ra, nhưng chỉ cần đặt vòng xoay cảng mới, bạn có thể sử dụng này:

CGFloat newRotation = 3.14f 

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.0]; // no tweening 
CGAffineTransform transform = CGAffineTransformMakeRotation(newRotation); 
self.transform = transform; 
[UIView commitAnimations]; 

Xoay vòng thực sự sẽ diễn ra xung quanh trung tâm của UIView. Đặt animationDuration thành số không garantees không có tweening nên xảy ra.

Hãy chắc chắn rằng bạn không làm điều này 60 lần một giây. Nó rất hấp dẫn để tạo ra trò chơi như hình ảnh động với những công cụ này. Những loại hình ảnh động này không chính xác có ý nghĩa cho một khung hình dựa trên khung hình, "rất nhiều trò chơi bay lượn khắp mọi nơi".

Vì điều đó - và tôi đã đi xuống con đường đó - cách duy nhất để đi, là OpenGL.

+0

Tôi cũng muốn hoạt ảnh cho xoay, có lẽ tôi có thể sử dụng thời lượng 0 giây của bạn cho bản dịch trước và sau vì CGContextTranslateCTM dường như không hoạt động. .. – Skyler

+0

Đảm bảo bạn lưu trạng thái CGContext trước khi thực hiện CGContextTranslateCTM. Sau đó khôi phục trạng thái. Nó không có hiệu lực (rõ ràng) nếu bạn chỉ dịch CTM sau khi vẽ trong ngữ cảnh của bạn. – Kriem

7

Đây cũng là một lựa chọn: một sự thay đổi đơn giản của cơ sở ;-)

CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); 
transform = CGAffineTransformRotate(transform, angle); 
transform = CGAffineTransformTranslate(transform,-x,-y); 

nơi (x,y) là trung tâm luân chuyển bạn thích

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