2017-02-10 18 views
17

Tôi có một MKMapView với 2 nút trên đó: phóng to và thu nhỏ.setRegion: MKMapView không phản hồi

Tôi nhận thấy rằng khi tôi sử dụng chúng, tôi không thể kéo bản đồ để thu phóng nữa cho đến khi hoạt ảnh được thực hiện.

Tôi có các nút của mình được gắn vào setRegion trên một khoảng nhỏ hơn hoặc lớn hơn so với hiện tại.

Tôi đã thử thêm UIPinchGestureRecognizer vào bản đồ của mình để dừng hoạt ảnh và cho phép pinch hoạt động. Đây là cách tôi đã làm điều đó:

Tôi đã thêm một biến số Bool giữ cho dù bản đồ hiện có đang hoạt ảnh từ một lần nhấn trên các nút hay không.

func pinchRecognized() { 
    if animating { 
     var region = self.region 
     region.span.latitudeDelta += 0.001 
     setRegion(region, animated: false) 
     animating = false 
    } 
} 

tôi ghi đè setRegion như thế này:

override func setRegion(_ region: MKCoordinateRegion, animated: Bool) { 
    if (animated) 
    { 
     animating = true 
     super.setRegion(region, animated: animated) 

     perform(#selector(noLongerAnimating), with: nil, afterDelay: 1) 
    } 
    else 
    { 
     super.setRegion(region, animated: animated) 
    } 
} 

func noLongerAnimating() { 
    animating = false 
} 

Những công việc trong việc ngăn chặn các hình ảnh động, nhưng nhúm không được công nhận bởi bản thân bản đồ để phóng to, mặc dù tôi làm điều này:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 

Tôi đoán số setRegion trong số pinchRecognized vi phạm, nhưng tôi không biết cách khác để dừng hoạt ảnh.

Theo yêu cầu, mã nút, cả hai nút sử dụng phương pháp này, phóng to sử dụng 0,5, thu nhỏ sử dụng 2:

func zoomTo(delta: Double, animated: Bool) { 
    var region = self.region 
    var span = region.span 

    span.latitudeDelta *= delta 
    span.longitudeDelta *= delta 
    if (span.latitudeDelta < 180 && span.longitudeDelta < 180) 
    { 
     region.span = span 
     setRegion(region, animated: animated) 
    } 
} 

Edit: tôi đã cố gắng thiết lập các setRegion (một trong đó dừng hoạt hình) trong số gestureRecognizer:shouldRecognizeSimultaneouslyWith:, nhưng ở đó nó không được gọi trong khi làm động bản đồ.

Chỉnh sửa: Sau khi thử những gì @robinb đề xuất, tôi thấy rằng chú thích của tôi cập nhật nhanh hơn bản đồ của tôi, gợi ý rằng khu vực được đặt, nó chỉ chờ đợi một cái gì đó để cập nhật bản đồ.

+0

Bạn có thể gửi nút phương pháp mã của bạn? – CodeChanger

+0

@CodeChanger Cập nhật câu hỏi – vrwim

+0

bất kỳ lý do cụ thể nào cho ghi đè setRegion: chức năng? –

Trả lời

2

Trình nhận dạng cử chỉ không kích hoạt trên các chế độ xem đang được làm động. Giữ các khung nhìn trong một biến/mảng tại ViewController. Sử dụng đoạn mã trong bài viết này để thực hiện các hình ảnh động: https://stackoverflow.com/a/13814789/3970581

Đây là testproject: hình ảnh động https://github.com/DuncanMC/iOS-CAAnimation-group-demo

+0

Tôi nghĩ rằng điều này sẽ hoạt động, nhưng việc sử dụng 'setRegion' trên bản đồ từ trình nhận dạng cử chỉ dường như không cập nhật bản đồ. Bước qua mã không tiết lộ bất kỳ lỗi nào, 'setRegion' được cập nhật với các giá trị đúng, nó chỉ không cập nhật vùng. – vrwim

1

MapView thiết lập isUserInteractionEnabled false khi bắt đầu, Tuy nhiên nếu bạn muốn có hiệu lực đó, bạn có thể phân lớp MKMapView và ghi đè touchesBegan UIView của để phản hồi tương tác của người dùng. Ở đó, trước tiên bạn có thể gọi setCenter/setRegion (giá trị bắt đầu hoặc điểm đến) mà không có hoạt ảnh để ngắt/thoát hoạt ảnh đang diễn ra và đặt isUserInteractionEnabled thành true.

MKMapView sử dụng CATiledLayer và rất tiếc, không có cách nào dễ dàng để lấy khu vực và trung tâm của bản đồ tại thời điểm gián đoạn. Mặt khác, tôi nhận thấy trong suốt thời gian hoạt hình là hằng số mặc dù tin để bạn có thể sử dụng Timer để thực hiện một dự đoán tốt hơn về khu vực của bản đồ khi touchesBegun được gọi

private var isAnimating: Bool = false 

override func setRegion(_ region: MKCoordinateRegion, animated: Bool) { 
    isAnimating = animated 
    ... 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if isAnimating { 
     isAnimating = false 
     let region = // Destination region or the approximate region where the animation reached at this moment (although this is a nightmare todo) 
     setRegion(region: region, animated: false) // or use setCenter 
     isUserInteractionEnabled = true 
    } 
} 
+0

Điều này cho kết quả tương tự, bản đồ sử dụng setRegion(), mà phá vỡ pinch hiện tại bạn vừa mới bắt đầu. – vrwim

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