Включение пользовательского свойства для изменения изображения MGLSymbolStyleLayer - PullRequest
0 голосов
/ 13 марта 2019

У меня есть такое перечисление, которое я хотел бы назначить выводам, так что в зависимости от этого значения перечисления, изображение выводов будет другим:

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
}

И я действительно потерял, как включить это свойство type, чтобы установить изображение булавки.Любая помощь, пожалуйста?

1 Ответ

0 голосов
/ 15 марта 2019

Для начала нам нужно иметь переменную, которую можно использовать для доступа к значениям. Чтобы сделать его более читабельным, давайте создадим переменную для наших нужд (позже, например, при выборе булавки), и запись для 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];

Очевидно, что имена ключей должны быть заключены в некоторые константы и т. Д., Но рефакторинг оставлен для читателя, это самое простое рабочее решение.

...