我想为iOS的谷歌地图制作一个自定义的信息窗口,如下图所示。是否可以像GMSMarker、GMSPolyline和GMSPolygon do那样扩展GMSOverlay以创建自定义图形?
发布于 2013-05-27 13:59:08
您需要在设置infoWindowAnchor
的同时使用markerInfoWindow
委托方法。
创建标记时,请设置锚点:
GMSMarker *marker = [[GMSMarker alloc] init];
marker.position = MARKER_POSITION;
marker.infoWindowAnchor = CGPointMake(0.44f, 0.45f);
marker.icon = [UIImage imageNamed:@"CustomMarkerImageName"];
然后创建委托方法:
- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
InfoWindow *view = [[[NSBundle mainBundle] loadNibNamed:@"InfoWindow" owner:self options:nil] objectAtIndex:0];
view.name.text = @"Place Name";
view.description.text = @"Place description";
view.phone.text = @"123 456 789";
view.placeImage.image = [UIImage imageNamed:@"customPlaceImage"];
view.placeImage.transform = CGAffineTransformMakeRotation(-.08);
return view;
}
在上面的示例中,我创建了一个xib
然后我加载了xib,返回了结果UIView
。相反,您可以仅使用代码来构造UIView
。
发布于 2013-05-25 15:31:49
您可以将此类型的UIImage作为图标传递,如下所示
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(latitude,longitude);
GMSMarker *location = [GMSMarker markerWithPosition:position];
location.title = @"Location Name";
location.icon = [UIImage imageNamed:@"marker_icon.png"];
location.map = mapView_;
有关更多详细信息,请访问see this Documentation。
如果你想要这种类型的图像后按下标记,你必须有两种类型的图像的单一场所。
仅第一个图像标记图标。
第二张图片是带有位置细节的标记。
标记图标在mapView初始化时加载,就像上面的代码一样。
第二个带有位置细节的图像标记,你必须使用For-Loop
和NSMutablearray
通过检查marker.title
来知道哪个标记被按下,像这样加载内部标记按下的delegate
方法。
- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker
{
}
发布于 2016-03-29 13:39:07
Swift版本,标记自定义类的示例版本:
class CustomMarker: UIView {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var seperator: UIImageView!
@IBOutlet weak var icon: UIImageView!
@IBOutlet weak var descriptionLabel: UILabel!
class func instanceFromNib() -> UIView {
return UINib(nibName: "CustomMarker", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
}}
多亏了How to initialise a UIView Class with a xib file in Swift, iOS,你可以向UIView添加扩展,这样你就不需要强制转换了
protocol UIViewLoading {}
extension UIView : UIViewLoading {}
extension UIViewLoading where Self : UIView {
// note that this method returns an instance of type `Self`, rather than UIView
static func loadFromNib() -> Self {
let nibName = "\(self)".characters.split{$0 == "."}.map(String.init).last!
let nib = UINib(nibName: nibName, bundle: nil)
return nib.instantiateWithOwner(self, options: nil).first as! Self
}
}
在你的代理中:
func mapView(mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
let customMarker:CustomMarker = CustomMarker.loadFromNib()
customMarker.titleLabel.text = marker.title
customMarker.descriptionLabel.text = marker.snippet
return customMarker
}
https://stackoverflow.com/questions/16746765
复制相似问题