如果您想了解如何在Swift中实现GMUClusterRenderer的相关知识,那么本文是一篇不可错过的文章,我们将对swift怎么运作进行全面详尽的解释,并且为您提供关于android–Defau
如果您想了解如何在Swift中实现GMUClusterRenderer的相关知识,那么本文是一篇不可错过的文章,我们将对swift怎么运作进行全面详尽的解释,并且为您提供关于android – DefaultClusterRenderer getMarker()在缩放时返回null、com.vaadin.ui.renderers.ClickableRenderer.RendererClickListener的实例源码、import – 如何在Swift中定义自定义UIGestureRecognizer?、ios – 如何在swift中创建UnsafeMutablePointer对象的有价值的信息。
本文目录一览:- 如何在Swift中实现GMUClusterRenderer(swift怎么运作)
- android – DefaultClusterRenderer getMarker()在缩放时返回null
- com.vaadin.ui.renderers.ClickableRenderer.RendererClickListener的实例源码
- import – 如何在Swift中定义自定义UIGestureRecognizer?
- ios – 如何在swift中创建UnsafeMutablePointer对象
如何在Swift中实现GMUClusterRenderer(swift怎么运作)
我正在使用iOS的Google Maps
API,并想使用标记聚类实用程序。我想出了如何显示聚簇标记,但是我想自定义标记。有人可以解释如何设置/更改每个标记或群集标记的图标和标题吗?示例代码将非常有帮助。
class POIItem: NSObject, GMUClusterItem { var position: CLLocationCoordinate2D var name: String! init(position: CLLocationCoordinate2D, name: String) { self.position = position self.name = name }}class MyRenderer: NSObject, GMUClusterRenderer { var mapView: GMSMapView var clusterIconGenerator: GMUClusterIconGenerator var clusterManager: GMUClusterManager init(mapView: GMSMapView, clusterIconGenerator: GMUClusterIconGenerator, clusterManager: GMUClusterManager) { self.mapView = mapView self.clusterIconGenerator = clusterIconGenerator self.clusterManager = clusterManager } func renderClusters(clusters: [GMUCluster]) { } func update() { }}
到目前为止,这就是我所拥有的。我不知道该如何处理renderClusters和更新函数。
答案1
小编典典在 Swift 4上 ,我找到了一种针对聚簇标记的干净解决方案,可以为聚簇使用自定义图像,并在其中包含聚簇数:
class MapClusterIconGenerator: GMUDefaultClusterIconGenerator { override func icon(forSize size: UInt) -> UIImage { let image = textToImage(drawText: String(size) as NSString, inImage: UIImage(named: "cluster")!, font: UIFont.systemFont(ofSize: 12)) return image } private func textToImage(drawText text: NSString, inImage image: UIImage, font: UIFont) -> UIImage { UIGraphicsBeginImageContext(image.size) image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)) let textStyle = NSMutableParagraphStyle() textStyle.alignment = NSTextAlignment.center let textColor = UIColor.black let attributes=[ NSAttributedStringKey.font: font, NSAttributedStringKey.paragraphStyle: textStyle, NSAttributedStringKey.foregroundColor: textColor] // vertically center (depending on font) let textH = font.lineHeight let textY = (image.size.height-textH)/2 let textRect = CGRect(x: 0, y: textY, width: image.size.width, height: textH) text.draw(in: textRect.integral, withAttributes: attributes) let result = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return result! }}
比集群管理器的设置:
private func setupClustering() { guard let mapView = self.mapView else { return } let iconGenerator = MapClusterIconGenerator() let renderer = MapClusterRenderer(mapView: mapView, clusterIconGenerator: iconGenerator) let algorithm = GMUNonHierarchicalDistanceBasedAlgorithm() clusterManager = GMUClusterManager(map: mapView, algorithm: algorithm, renderer: renderer)}
我还使用了自定义群集渲染器MapClusterRenderer
。
android – DefaultClusterRenderer getMarker()在缩放时返回null
@Override onClusterClick(Cluster<MyObject> cluster) { Marker marker = renderer.getMarker(cluster); marker.setIcon(....); }
对于一种情况,这很好用:当我放大或缩小时,簇标记的数量不会改变.例如,如果我有一个15集群和一个5集群,然后放大或缩小一个级别,保留相同的两个集群.现在单击其中一个renderer.getMarker(cluster)将返回null.如果它们在缩放后重新聚类,则getMarker不为null.
我的DefaultClusterRenderer在下面.我检查了onClusteredRendered上的标记,它永远不会为空.这是DefaultClusterRenderer中的错误还是我应该做些什么?
private class MyRenderer extends DefaultClusterRenderer<MyObject> { private IconGenerator iconGenerator; private float density; public MyRenderer(Context context,GoogleMap map,ClusterManager<MyObject> clusterManager) { super(context,map,clusterManager); density = context.getResources().getdisplayMetrics().density; } @Override protected void onBeforeClusterItemRendered(MyObject item,MarkerOptions markerOptions) { markerOptions.icon(BitmapDescriptorFactory.fromresource(R.drawable.my_pin)); } @Override protected void onBeforeClusterRendered(Cluster<MyObject> cluster,MarkerOptions markerOptions) { if(iconGenerator == null) { iconGenerator = new IconGenerator(getActivity()); iconGenerator.setContentView(makeTextView(getActivity())); } iconGenerator.setBackground(makeBackground(false)); markerOptions.icon(BitmapDescriptorFactory.fromBitmap(iconGenerator.makeIcon(String.valueOf(cluster.getSize())))); } @Override protected void onClusterRendered(Cluster<MyObject> cluster,Marker marker) { super.onClusterRendered(cluster,marker); // Marker is never null here } @Override protected boolean shouldRenderAsCluster(Cluster<MyObject> cluster) { return cluster.getSize() > 1; } private ShapeDrawable makeBackground(boolean isClicked) { ShapeDrawable background = new ShapeDrawable(new ovalShape()); background.setColorFilter(ContextCompat.getColor(getActivity(),isClicked ? R.color.cluster_marker_clicked : R.color.cluster_marker_unclicked),PorterDuff.Mode.SRC_ATOP); return background; } private SquareTextView makeTextView(Context context) { SquareTextView squareTextView = new SquareTextView(context); ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(-2,-2); squareTextView.setLayoutParams(layoutParams); squareTextView.setTextColor(ContextCompat.getColor(getActivity(),R.color.white)); squareTextView.setTypeface(Utils.getFontBold(getActivity())); squareTextView.setId(com.google.maps.android.R.id.text); int twelveDpi = (int) (12.0F * density); squareTextView.setPadding(twelveDpi,twelveDpi,twelveDpi); return squareTextView; } public IconGenerator getIconGenerator(boolean isClicked) { iconGenerator.setBackground(makeBackground(isClicked)); return iconGenerator; } }
初始化ClusterManager:
final ClusterManager<MyObject> mClusterManager = new ClusterManager<>(getActivity(),googleMap); mClusterManager.addItems(items); renderer = new Customrenderer(getActivity(),googleMap,mClusterManager); mClusterManager.setRenderer(renderer); mClusterManager.cluster(); mClusterManager.setonClusterItemClickListener(this); googleMap.setonMarkerClickListener(mClusterManager);
@antonio:这个初始化对我有用:
public class MapsActivity extends FragmentActivity implements ClusterManager.OnClusterClickListener<MyObject> { // ... private void setUpClusterer() { googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(51.503186,-0.126446),10)); mClusterManager = new ClusterManager<MyObject>(this,googleMap); mClusterManager.setonClusterClickListener(this); renderer = new MyRenderer(this,mClusterManager); mClusterManager.setRenderer(renderer); googleMap.setonCamerachangelistener(mClusterManager); googleMap.setonMarkerClickListener(mClusterManager); addItems(); } private void addItems() { // Set some lat/lng coordinates to start with. double lat = 51.5145160; double lng = -0.1270060; // Add ten cluster items in close proximity,for purposes of this example. for (int i = 0; i < 10; i++) { double offset = i / 60d; lat = lat + offset; lng = lng + offset; MyObject offsetItem = new MyObject(lat,lng); mClusterManager.addItem(offsetItem); } } @Override public boolean onClusterClick(final Cluster<MyObject> cluster) { Marker marker = renderer.getMarker(cluster); marker.setIcon(BitmapDescriptorFactory.fromresource(R.drawable.my_newpin)); return true; } }
解决方法
Map <Cluster<MyObject>,Marker> clusterMarkerMap = new HashMap<>();
然后在DefaultClusterRenderer回调中添加它们,因为标记在那里永远不为null:
@Override protected void onClusterRendered(Cluster<MyObject> cluster,Marker marker) { super.onClusterRendered(cluster,marker); clusterMarkerMap.put(cluster,marker); }
因为DefaultClusterManager在摄像机位置更改时清除它们,所以在创建新的标记映射之前擦除它们:
googleMap.setonCamerachangelistener(new GoogleMap.OnCamerachangelistener() { @Override public void onCameraChange(CameraPosition cameraPosition) { // Clear the map here because the markers will be recreated // when the manager is notified of a (zoom level) camera change if(zoomLevelChanged) clusterMarkerMap.clear(); mClusterManager.onCameraChange(cameraPosition); } });
现在我可以成功获得标记clusterMarkerMap.get(cluster)
com.vaadin.ui.renderers.ClickableRenderer.RendererClickListener的实例源码
private void addExpandColumnRenderer(Column column) { final TreeNodeExpandButtonRenderer renderer=new TreeNodeExpandButtonRenderer(CellWrapper.class); renderer.addClickListener(new RendererClickListener() { @Override public void click(RendererClickEvent event) { final Object itemId=event.getItemId(); final List<Object>changedItems=container.toogleCollapse(itemId); for(final Object it:changedItems) { final CellWrapper cw=(CellWrapper) container.getItem(it).getItemProperty(expandColumnPropertyId).getValue(); cw.setIsExpanded(container.isItemExpanded(it)); }; } }); column.setRenderer(renderer); }
import – 如何在Swift中定义自定义UIGestureRecognizer?
“UIGestureRecognizerSubclass.h”位于UIKit模块中,但只能在Swift中导入模块,并且无法导入头文件.
如何导入UIGestureRecognizerSubclass并定义自定义UIGestureRecognizer?
编辑:
我在Bridging-Header.h中添加了以下代码,并成功编译了我的自定义手势识别器.
#import <UIKit/UIGestureRecognizerSubclass.h>
但是这段代码可能会为我项目中的每个swift文件导入“UIGestureRecognizerSubclass.h”,所以我认为这不是最好的方法.
这是对的吗?
还有其他合适的解决方案吗
import UIKit.UIGestureRecognizerSubclass
如:
import UIKit import UIKit.UIGestureRecognizerSubclass
ios – 如何在swift中创建UnsafeMutablePointer对象
let pointer:UnsafeMutablePointer<CGPoint> = CGPoint(x: 0,y: 1) as! UnsafeMutablePointer<CGPoint> self.scrollViewWillEndDragging(self.collectionView,withVeLocity: CGPoint(x: 0,y: 1),targetContentOffset: pointer) func scrollViewWillEndDragging(scrollView: UIScrollView,withVeLocity veLocity: CGPoint,targetContentOffset: UnsafeMutablePointer<CGPoint>) { //Some code here }
解决方法
import Foundation var point = CGPoint(x: 10.0,y: 20.0) let p = withUnsafeMutablePointer(&point) { (p) -> UnsafeMutablePointer<CGPoint> in return p } print(p.memory.x,p.memory.y) // 10.0 20.0 point.x = 100.0 print(p.memory.x,p.memory.y) // 100.0 20.0
借助斯威夫特的句法糖
import Foundation var point = CGPoint(x: 10.0,y: 20.0) let p = withUnsafeMutablePointer(&point) { $0 } print(p.dynamicType) // UnsafeMutablePointer<CGPoint>
我们今天的关于如何在Swift中实现GMUClusterRenderer和swift怎么运作的分享就到这里,谢谢您的阅读,如果想了解更多关于android – DefaultClusterRenderer getMarker()在缩放时返回null、com.vaadin.ui.renderers.ClickableRenderer.RendererClickListener的实例源码、import – 如何在Swift中定义自定义UIGestureRecognizer?、ios – 如何在swift中创建UnsafeMutablePointer对象的相关信息,可以在本站进行搜索。
本文标签: