2012-01-24 18 views
5

Tôi có một MKMapView và đang thêm lớp phủ (MKOverlay) vào nó.Lớp phủ màu đen và trắng cho một MKMapView

Tôi muốn lớp phủ làm cho chế độ xem bản đồ bên dưới xuất hiện màu đen & màu trắng (ví dụ: đơn sắc). Có cách nào để làm điều này không?

(Tôi đoán tôi có thể làm cho lớp phủ mờ đen/xám, nhưng đó không phải là ảnh hưởng chính xác tôi muốn.)


Hệ thống chi tiết: phát triển một ứng dụng iOS 5 trong Xcode 4.2.

Trả lời

7

Các tuyến đường thích hợp nhất, mà thật đáng buồn là chưa có sẵn trên iOS sẽ là:

bạn MKOverlay là tại một số điểm được sử dụng để tạo ra một MKOverlayView, mà sẽ có một CALayer vì nó xuống từ UIView. Bạn có thể đính kèm CIFilter s làm compositingFilter s đến CALayer s, quyết định cách chế độ xem được tổng hợp với nền. Bạn có thể đính kèm bộ lọc loại CIColorMonochrome vào đó.

Vì tùy chọn đó không khả dụng, bạn sẽ phải nhảy qua một số trở ngại lớn để thực hiện công việc cho chính mình. Có thể bạn sẽ cần triển khai MKOverlayView tùy chỉnh của riêng mình trong drawView sử dụng các kỹ thuật được đưa ra trong số QA1703 của Apple để lấy nội dung pixel của chế độ xem bản đồ trong khu vực có liên quan (cẩn thận không kết thúc trong vòng lặp đệ quy vô hạn) chuyển đổi chúng thành màu đen và trắng và trình bày chúng dưới dạng chế độ xem của bạn.

Đó có phải là điều đáng để điều tra thêm hoặc bạn có hạnh phúc hơn để thay thế hiệu quả hơn là thực sự nghiên cứu kỹ về nội dung này không?

+0

Có ai đã làm điều này không? Isnt làm bộ lọc như một fucntion? isnt fucntion này chỉ áp dụng cho các lớp phủ và không vào bản đồ bên dưới nó? – subharb

+0

http://developer.apple.com/library/ios/#qa/qa1703/_index.html - liên kết không hoạt động _ (Rất tiếc, không thể tìm thấy trang đó.) _ – Nazir

1

tôi cần thao tác cùng một màu sắc trên bản đồ, và tôi quyết định rằng làm cho toàn bộ đồ màu đen và trắng có thể là giải pháp tốt hơn, đây là cách bạn có thể làm điều này:

  1. tạo imageCGcontex mới
  2. đồ render in new CGcontext
  3. có UIImage từ CGcontext hiện
  4. áp dụng CIFilter để UIImage và có CIImage kết quả
  5. render CIImage trong CIContext và có CGImageRef kết quả
  6. tạo UIImage từ CGImageRef
  7. thêm ImageView sub để xem bản đồ táo
  8. hình ảnh kết quả thiết lập để mà IMAGExem

Dưới đây là một số mã bẩn để làm điều này:

self.drawContext = [[CIContext alloc] init]; 
 
    [self.monochromeSubView removeFromSuperview]; 
 

 
    UIGraphicsBeginImageContext(self.appleMapView.bounds.size); 
 
    UIImage *mySourceImage = UIGraphicsGetImageFromCurrentImageContext(); 
 
    CIImage *newMyCiImage = [[CIImage alloc] initWithImage:mySourceImage]; 
 
    CIFilter *newMyMonochromeFilter = [CIFilter filterWithName:@"CIPhotoEffectTonal"]; 
 
    [newMyMonochromeFilter setValue:newMyCiImage forKey:kCIInputImageKey]; 
 
    CIImage *newMyfilteredCIImage = newMyMonochromeFilter.outputImage; 
 
    
 
    CGImageRef myOutputImageRef = [self.drawContext createCGImage:newMyfilteredCIImage 
 
                 fromRect:newMyfilteredCIImage.extent]; 
 
    UIImage *newMyImage = [[UIImage alloc] initWithCGImage:myOutputImageRef]; 
 

 
    self.monochromeSubView.image = newMyImage; 
 
    [self.appleMapView addSubview:self.monochromeSubView]; 
 

 
    CGImageRelease(myOutputImageRef); 
 
    UIGraphicsEndImageContext();

Ở đây bạn đi - bản đồ có màu đen và w màu sắc. Để làm điều này tự động để di chuyển bản đồ đơn sắc cùng với cử chỉ của người dùng, bạn có thể phân lớp cử chỉ nhận dạng cử chỉ, thêm trực tiếp vào chế độ xem bản đồ. Sau đó, trên mọi cuộc gọi touchesMoved, bạn có thể gọi chức năng vẽ lại này trong khi sử dụng lại ngữ cảnh mà bạn đã tạo.Tôi đã thử điều này với bản đồ táo chiếm 1/3 màn hình và kết quả là hiệu suất cực thấp (khoảng 3 FPS trên iPhone 5s) và có vài lỗi bạn phải sửa, chẳng hạn như: bay bản đồ trên cử chỉ vuốt trong khi hình ảnh đơn sắc tĩnh, tần suất vẽ bản đồ vẽ lại, vẽ lại hoặc tạo hiệu ứng động mỗi cửa sổ bật lên được hiển thị để phản hồi lại khi nhấn. Bạn có thể cố gắng hiển thị bản đồ trong CALayer, không phải trong Context, Apple đề xuất nó để cải thiện hiệu suất, nhưng xem xét tất cả những điều trên tôi cho rằng nếu bạn muốn xem các phần tử lọc động thì tốt hơn là sử dụng bản đồ có thể tùy chỉnh khác: GoogleMap hoặc MapBox.