代码之家  ›  专栏  ›  技术社区  ›  Nat

打开自定义属性以更改MGLSymbolStyleLayer的图像

  •  0
  • Nat  · 技术社区  · 6 年前

    typedef NS_ENUM(NSInteger, MyType) {
        MyTypeUnknown = 0,
        MyTypeOne,
        MyTypeTwo,
    };
    

    我有一个非群集管脚图层:

    MGLSymbolStyleLayer *markerLayer = [[MGLSymbolStyleLayer alloc] initWithIdentifier:@"markerLayerId" source:source];
    markerLayer.predicate = [NSPredicate predicateWithFormat:@"cluster != YES"];
    [style addLayer: markerLayer];
    

    我知道我想添加基于 type 别针的。我唯一确定的是我需要将这些图像添加到图层:

    [style setImage:[UIImage imageNamed:@"img0"] forName:@"img0id"];
    [style setImage:[UIImage imageNamed:@"img1"] forName:@"img1id"];
    [style setImage:[UIImage imageNamed:@"img2"] forName:@"img2id"];
    

    现在我应该设置名称,但我不确定如何设置:

    markerLayer.iconImageName = [NSExpression expressionForConstantValue:@"???"]; // or withFormat..?
    

    @objc class MyPointFeature: MGLPointFeature {
        @objc var type: MyType = .unknown
    }
    

    我真的不知道怎么打开它 属性设置管脚的图像。有什么帮助吗?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Nat    6 年前

    首先,我们需要一个变量,它可以用来访问值。为了使其更具可读性,让我们为我们的需要创建一个变量(稍后,例如在选择一个管脚时)和MapBox需要的条目立即创建:

    @objc class MyPointFeature: MGLPointFeature {
        @objc var type: MyType = .unknown {
            didSet {
                self.attributes = ["myType": MyPointFeature .staticTypeKey(dynamicType: type)]
            }
        }
    
        // This is made without dynamic property name to string cast, because
        // the values shouldn't be changed so easily and a developer without
        // suspecting it's a key somewhere could accidentally create a bug
       // PS. if you have swift-only code, you can make it in MyType enum
       @objc static func staticTypeKey(dynamicType: MyType) -> String {
            switch dynamicType {
            case .one:
                return "one"
            case .two:
                return "two"
            default:
                return "unknown"
            }
        }
    }
    

    现在我们要将图像名称注册到给定的密钥:

    [style setImage:[UIImage imageNamed:@"img0"] forName:@"img0Key"];
    [style setImage:[UIImage imageNamed:@"img1"] forName:@"img1Key"];
    [style setImage:[UIImage imageNamed:@"img2"] forName:@"img2Key"];
    

    最后,让我们使用先前指定的属性绑定图像名称键:

    NSDictionary *typeIcons = @{[MyPointFeature staticTypeKeyWithDynamicType:MyTypeUnknown]: @"img0Key",
                                [MyPointFeature staticTypeKeyWithDynamicType:MyTypeOne]: @"img1Key",
                                [MyPointFeature staticTypeKeyWithDynamicType:MyTypeTwo]: @"img2Key"};
    myLayer.iconImageName = [NSExpression expressionWithFormat:@"FUNCTION(%@, 'valueForKeyPath:', myType)", typeIcons];