GVKun编程网logo

如何在Swift中实现GMUClusterRenderer(swift怎么运作)

17

如果您想了解如何在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怎么运作)

如何在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

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;
    }
}

解决方法

在上面的情况下,无法让renderer.getMarker(cluster)返回一个标记.解决方法是创建:
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的实例源码

com.vaadin.ui.renderers.ClickableRenderer.RendererClickListener的实例源码

项目:GridTree    文件:GridTree.java   
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?

import – 如何在Swift中定义自定义UIGestureRecognizer?

我想在 Swift中定义自定义UIGestureRecognizer,但是我无法导入UIGestureRecognizerSubclass并且无法覆盖“touchesBegan”,“touchesMoved”等方法.

“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对象

ios – 如何在swift中创建UnsafeMutablePointer对象

我需要调用uiscrollviewdelegate方法,我不知道如何创建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中实现GMUClusterRendererswift怎么运作的分享就到这里,谢谢您的阅读,如果想了解更多关于android – DefaultClusterRenderer getMarker()在缩放时返回null、com.vaadin.ui.renderers.ClickableRenderer.RendererClickListener的实例源码、import – 如何在Swift中定义自定义UIGestureRecognizer?、ios – 如何在swift中创建UnsafeMutablePointer对象的相关信息,可以在本站进行搜索。

本文标签: