我试图在地图上的叠加层上添加模糊效果.我实际上需要在地图上的一个圆圈上的模糊效果,我使用的方法不是那么重要.
我有一个类从MKCircleRenderer扩展,我想在它覆盖的地图上添加一个模糊效果.
我正在尝试使用-fillPath:inContext:方法,但是我对Core Graphics和Core Image的无知导致我无处不在,我真的很失落了这个问题.
我试图使用CIFilter,因此我需要一个CIImage,我试图从上下文创建.但是我发现没有办法从上下文创建一个CGBitmapContext,CGImage和任何其他类.我尝试的任何方法导致了NULL,没有进一步的细节为什么.我不记得我试过的所有,所以我很抱歉没有指出任何事情.
我的课程目前实现一个不太重要的方法:
- (instancetype)initWithOverlay:(id<MKOverlay>)overlay {
if (self = [super initWithOverlay:overlay]) {
self.strokeColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1];
self.fillColor = [UIColor colorWithRed:0.4 green:0.2 blue:0.2 alpha:0.1];
self.linewidth = 1;
}
return self;
}
另一种可能是使用自定义MKAnnotation,并使用UIVisualEffectView在视图中添加模糊效果.这种方法的难点在于缩放时会增大/减小大小.
这应该适用于iOS 8
编辑
在这种情况下,圆圈内侧的地图应该模糊
解决方法
有两种方法可以做到这一点.
一个很简单,你可以使用图像
您可能会发现以下图像很有用:
并在viewForAnnotation中使用它们的代码:
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
// ... get the annotation delegate and allocate the MKAnnotationView (annView)
if ([annotationDelegate.type localizedCaseInsensitiveCompare:@"NeedsBluePin"] == NSOrderedSame)
{
UIImage * image = [UIImage imageNamed:@"blue_pin.png"];
UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
[annView addSubview:imageView];
}
}
其他方法以编程方式进行[让自己圈]
这是代码可以帮助你.
import UIKit
import AddressBook
import AddressBookUI
import MapKit
import CoreLocation
import MessageUI
import Social
class ViewController: UIViewController,ABPeoplePickerNavigationControllerDelegate,MFMailComposeViewControllerDelegate,MKMapViewDelegate {
@IBOutlet weak var name: UILabel!
@IBOutlet weak var email: UILabel!
@IBOutlet weak var photo: UIImageView!
@IBOutlet weak var map: MKMapView!
let locMan:CLLocationManager=CLLocationManager()
// Blurring Code
@IBOutlet weak var labelBackground: UIView!
var backgroundBlur: UIVisualEffectView!
@IBAction func newbfF(sender: AnyObject) {
let picker: ABPeoplePickerNavigationController =
ABPeoplePickerNavigationController()
picker.peoplePickerDelegate = self
presentViewController(picker,animated: true,completion: nil)
}
@IBAction func sendEmail(sender: AnyObject) {
var emailAddresses:[String]=[self.email.text!]
var mailComposer:MFMailComposeViewController =
MFMailComposeViewController()
mailComposer.mailComposeDelegate=self;
mailComposer.setToRecipients(emailAddresses)
presentViewController(mailComposer,completion: nil)
}
func mailComposeController(controller: MFMailComposeViewController!,didFinishWithResult result: MFMailComposeResult,error: NSError!) {
dismissViewControllerAnimated(true,completion: nil)
}
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,didSelectPerson person: ABRecord!) {
let friendName:String = ABRecordcopyValue(person,kABPersonFirstNameProperty).takeRetainedValue() as String as String
name.text=friendName
let friendAddressSet:ABMultiValueRef = ABRecordcopyValue(person,kABPersonAddressproperty).takeRetainedValue()
if ABMultiValueGetCount(friendAddressSet)>0 {
let friendFirstAddress: Dictionary = ABMultiValuecopyValueAtIndex(friendAddressSet,0).takeRetainedValue() as NSDictionary
showAddress(friendFirstAddress)
}
let friendEmailAddresses:ABMultiValueRef = ABRecordcopyValue(person,kABPersonEmailProperty).takeRetainedValue()
if ABMultiValueGetCount(friendEmailAddresses)>0 {
let friendEmail: String = ABMultiValuecopyValueAtIndex(friendEmailAddresses,0).takeRetainedValue() as String
email.text=friendEmail
}
if ABPersonHasImageData(person) {
photo.image = UIImage(data: ABPersoncopyImageData(person).takeRetainedValue())
}
}
func showAddress(fullAddress:NSDictionary) {
let geocoder: CLGeocoder = CLGeocoder()
geocoder.geocodeAddressDictionary(fullAddress,completionHandler:
{(placemarks: [AnyObject]!,error: NSError!) -> Void in
let friendplacemark:CLPlacemark = placemarks[0] as CLPlacemark
let mapRegion:MKCoordinateRegion =
MKCoordinateRegion(center: friendplacemark.location.coordinate,span: MKCoordinateSpanMake(0.2,0.2))
self.map.setRegion(mapRegion,animated: true)
let mapPlacemark: MKPlacemark = MKPlacemark(placemark: friendplacemark)
self.map.addAnnotation(mapPlacemark)
})
}
func mapView(aMapView: MKMapView!,viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
let pinDrop:MKPinAnnotationView = MKPinAnnotationView(annotation: annotation,reuseIdentifier: "myspot")
pinDrop.animatesDrop=true
pinDrop.canShowCallout=true
pinDrop.pinColor=MKPinAnnotationColor.Purple
return pinDrop
}
@IBAction func sendTweet(sender: AnyObject) {
let geocoder: CLGeocoder = CLGeocoder()
geocoder.reverseGeocodeLocation(map.userLocation.location,error: NSError!) -> Void in
let myPlacemark:CLPlacemark = placemarks[0] as CLPlacemark
let tweetText:String =
"Hello all - I'm currently in \(myPlacemark.locality)!"
let tweetComposer: SLComposeViewController =
SLComposeViewController(forServiceType: SLServiceTypeTwitter)
if SLComposeViewController.isAvailableForServiceType(SLServiceTypeTwitter) {
tweetComposer.setinitialText(tweetText)
self.presentViewController(tweetComposer,completion: nil)
}
})
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view,typically from a nib.
//let locMan:CLLocationManager=CLLocationManager()
locMan.requestWhenInUseAuthorization()
let blur: UIBlurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light)
backgroundBlur = UIVisualEffectView (effect: blur)
backgroundBlur.frame = labelBackground.frame
view.insertSubview(backgroundBlur,belowSubview: labelBackground)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// dispose of any resources that can be recreated.
}
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIStatusBarStyle.LightContent
}
}