Je souhaite afficher la photo de profil de l'utilisateur dans mon marqueur personnalisé pour Google Maps. Comme tous les autres, j'ai essayé ce code dans init:
de customMarker
self.location = location position = location icon = UIImage(named: "live location") groundAnchor = CGPoint(x: 0.5, y: 1)
Existe-t-il un moyen possible d'afficher une autre image dans le cercle du icône de marqueur. ex. en utilisant xib.
3 Réponses :
Vous pouvez utiliser deux méthodes données:
let marker = GMSMarker(position: coordinate) marker.icon = drawImageWithProfilePic(pp: imgPP, image: img) marker.appearAnimation = GMSMarkerAnimation.pop marker.map = viewGoogleMap
Ici, pp
est la photo de votre profil et image
est l'icône de la photo.
Vous pouvez définir le cadre de la photo de profil en fonction de vous.
J'ai essayé ceci:
Modifier
func drawImageWithProfilePic(pp: UIImage, image: UIImage) -> UIImage { let imgView = UIImageView(image: image) let picImgView = UIImageView(image: pp) picImgView.frame = CGRect(x: 0, y: 0, width: 30, height: 30) imgView.addSubview(picImgView) picImgView.center.x = imgView.center.x picImgView.center.y = imgView.center.y - 7 picImgView.layer.cornerRadius = picImgView.frame.width/2 picImgView.clipsToBounds = true imgView.setNeedsLayout() picImgView.setNeedsLayout() let newImage = imageWithView(view: imgView) return newImage } func imageWithView(view: UIView) -> UIImage { var image: UIImage? UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0) if let context = UIGraphicsGetCurrentContext() { view.layer.render(in: context) image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() } return image ?? UIImage() }
et voici le résultat:
Où voulez-vous que j'utilise view.addSubview (imageView)
car GMSMarker
ne permet pas d'utiliser addSubview
drawImageWithProfilePic (pp: #imageLiteral (resourceName: "no_pic"), image: #imageLiteral (resourceName: "pin_short"))
renverra une image. Il vous suffit de le définir sur l'icône de votre marqueur.
Vous pouvez créer / concevoir une vue personnalisée en nib
ou par programmation
, puis l’attribuer à votre marqueur comme ceci.
let someView = YourCustomView() someView.markerImageView.image = UIImage(named: "markerImage") someView.userImageView.image = UIImage(named: "userImage") let marker = GMSMarker() marker.map = yourMapView marker.position = somePositionCoordinate; marker.iconView = someView
p>
Il n'y a pas de propriété customView
pour GMSMarker, nous n'avons que iconView
. L'utilisation de iconView
n'aide pas.
//put this code where you get image let url = URL(string: "your_imageUrlString") let data = try? Data(contentsOf: url!) let marker = GMSMarker() marker.position = CLLocationCoordinate2D(latitude: Double(lat)!, longitude: Double(long)!) marker.icon = self.drawImageWithProfilePic(pp: UIImage.init(data:data!)!, image: UIImage.init(named: "red")!) marker.title = location marker.snippet = name + " " + mobile marker.appearAnimation = GMSMarkerAnimation.pop marker.map = self.mapView //put this code in your viewController class func drawImageWithProfilePic(pp: UIImage, image: UIImage) -> UIImage { let imgView = UIImageView(image: image) imgView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) let picImgView = UIImageView(image: pp) picImgView.frame = CGRect(x: 0, y: 0, width: 40, height: 40) imgView.addSubview(picImgView) picImgView.center.x = imgView.center.x picImgView.center.y = imgView.center.y - 7 picImgView.layer.cornerRadius = picImgView.frame.width/2 picImgView.clipsToBounds = true imgView.setNeedsLayout() picImgView.setNeedsLayout() let newImage = imageWithView(view: imgView) return newImage } func imageWithView(view: UIView) -> UIImage { var image: UIImage? UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0) if let context = UIGraphicsGetCurrentContext() { view.layer.render(in: context) image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() } return image ?? UIImage() } //here "red" is dummy background image
Vous pouvez le faire en créant une classe personnalisée de
UIView
.