2012-08-17 20 views
6

Tôi đã làm việc trên bản đồ thay thế trong một thời gian ngắn. Toàn bộ tác phẩm hoạt động với UIScrollView được hỗ trợ bởi CATiledLayer.UIScrollView setZoomScale đặt xoay vòng được áp dụng trở về Zero

Để xoay bản đồ của tôi, tôi xoay chính lớp đó. (Sử dụng CATransform3DMakeRotation) Làm việc khá tốt cho đến nay =)

Nhưng nếu tôi bao giờ gọi setZoomScale phương pháp CATransform3D có nghĩa là sẽ được đệ trình lên lớp của tôi là thiết lập lại xoay để 0.

Câu hỏi của tôi là, là có bất kỳ cách nào để đặt zoomscale của scrollView của tôi mà không mất vòng xoay được áp dụng?

Cùng một vấn đề tồn tại đối với cử chỉ chụm.

// Infos bổ sung

Để xoay quanh Vị trí hiện tại, tôi phải chỉnh sửa điểm neo. Có lẽ đây cũng là một vấn đề cho việc mở rộng quy mô.

- (void)correctLayerPosition { 
    CGPoint position = rootView.layer.position; 
    CGPoint anchorPoint = rootView.layer.anchorPoint; 
    CGRect bounds  = rootView.bounds; 
    // 0.5, 0.5 is the default anchorPoint; calculate the difference 
    // and multiply by the bounds of the view 
    position.x    = (0.5 * bounds.size.width) + (anchorPoint.x - 0.5) * bounds.size.width; 
    position.y    = (0.5 * bounds.size.height) + (anchorPoint.y - 0.5) * bounds.size.height; 
    rootView.layer.position = position; 
} 

- (void)onFinishedUpdateLocation:(CLLocation *)newLocation { 
    if (stayOnCurrentLocation) { 
     [self scrollToCurrentPosition]; 
    } 
    if (rotationEnabled) { 
     CGPoint anchorPoint  = [currentConfig layerPointForLocation:newLocation]; 
     anchorPoint.x    = anchorPoint.x/rootView.bounds.size.width; 
     anchorPoint.y    = anchorPoint.y/rootView.bounds.size.height; 
     rootView.layer.anchorPoint = anchorPoint; 
     [self correctLayerPosition]; 
    } 
} 

Trả lời

7

Bạn có thể thực hiện scrollViewDidZoom: phương pháp đại biểu và nối hai biến đổi để đạt được hiệu quả mong muốn:

- (void) scrollViewDidZoom:(UIScrollView *) scrollView 
{ 
    CATransform3D scale = contentView.layer.transform; 
    CATransform3D rotation = CATransform3DMakeRotation(M_PI_4, 0, 0, 1); 

    contentView.layer.transform = CATransform3DConcat(rotation, scale); 
} 

EDIT

Tôi đã có ý tưởng đơn giản! Làm cách nào để thêm một chế độ xem khác vào cấu trúc phân cấp với biến đổi xoay được đính kèm? Dưới đây là hệ thống phân cấp đề xuất:

  • scrollview
    • contentView - một trong những trở bởi viewForZoomingInScrollView:
      • RotationView - một với luân chuyển
        • MapView - một với tất cả các gạch

Tôi không nghĩ rằng hiệu suất nên là bất kỳ mối quan tâm ở đây và nó có giá trị cố gắng.

+0

Hey Bartosz, trước hết, cảm ơn bạn vì bài đăng đó! Nhưng điều đó không hiệu quả đối với tôi ... Tôi đã chỉnh sửa điểm neo để xoay quanh vị trí hiện tại. Có lẽ đó là vấn đề? Tôi sẽ chỉnh sửa bài đăng của mình và thêm mã đó. –

+0

Vì vậy, nó giữ lại vòng xoay, nhưng trục quay sai, phải không? –

+0

Tôi thực sự không thể nói. Chỉ từ những gì tôi thấy, nó xoay quanh nhiều điểm kỳ lạ. Nhưng trục có vẻ đúng. –