[ios] Add annotation view initializer with annotation and reuse id (#9029)

This commit is contained in:
Jesse Bounds
2017-05-19 09:35:09 -07:00
committed by GitHub
parent 7612e23dff
commit 554b1cf3e2
4 changed files with 43 additions and 8 deletions

View File

@@ -17,6 +17,7 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
### Annotations
* Added a new initializer to `MGLAnnotationView` so that it is possible to create a new instance with an associated annotation object. ([#9029](https://github.com/mapbox/mapbox-gl-native/pull/9029))
* Fixed an issue causing a view-backed annotation to disappear immediately instead of animating when the annotation’s `coordinate` property is set to a value outside the current viewport. ([#8565](https://github.com/mapbox/mapbox-gl-native/pull/8565))
* Fixed an issue in which `MGLMapView` overrode the tint colors of its annotation views. ([#8789](https://github.com/mapbox/mapbox-gl-native/pull/8789))

View File

@@ -73,6 +73,36 @@ typedef NS_ENUM(NSUInteger, MGLAnnotationViewDragState) {
*/
- (instancetype)initWithReuseIdentifier:(nullable NSString *)reuseIdentifier;
/**
Initializes and returns a new annotation view object.
Providing an annotation allows you to explicitly associate the annotation instance
with the new view and, in custom subclasses of `MGLAnnotationView`, customize the view
based on properties of the annotation instance in an overridden initializer. However,
annotation views that are reused will not necessarily be associated with the
same annotation they were initialized with. Also, annotation views that are in
the reuse queue will have a nil value for the annotation property. Passing an annotation
instance to the view is optional and the map view will automatically associate annotations
with views when views are provided to the map via the `-[MGLMapViewDelegate mapView:viewForAnnotation:]`
method.
The reuse identifier provides a way for you to improve performance by recycling
annotation views as they enter and leave the map’s viewport. As an annotation
leaves the viewport, the map view moves its associated view to a reuse queue.
When a new annotation becomes visible, you can request a view for that
annotation by passing the appropriate reuse identifier string to the
`-[MGLMapView dequeueReusableAnnotationViewWithIdentifier:]` method.
@param annotation The annotation object to associate with the new view.
@param reuseIdentifier A unique string identifier for this view that allows you
to reuse this view with multiple similar annotations. You can set this
parameter to `nil` if you don’t intend to reuse the view, but it is a good
idea in general to specify a reuse identifier to avoid creating redundant
views.
@return The initialized annotation view object.
*/
- (instancetype)initWithAnnotation:(nullable id<MGLAnnotation>)annotation reuseIdentifier:(nullable NSString *)reuseIdentifier;
/**
Called when the view is removed from the reuse queue.

View File

@@ -19,12 +19,20 @@
@implementation MGLAnnotationView
- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
self = [self initWithFrame:CGRectZero];
+ (BOOL)supportsSecureCoding {
return YES;
}
- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier {
return [self initWithAnnotation:nil reuseIdentifier:reuseIdentifier];
}
- (instancetype)initWithAnnotation:(nullable id<MGLAnnotation>)annotation reuseIdentifier:(nullable NSString *)reuseIdentifier {
self = [super initWithFrame:CGRectZero];
if (self)
{
_lastAppliedScaleTransform = CATransform3DIdentity;
_annotation = annotation;
_reuseIdentifier = [reuseIdentifier copy];
_scalesWithViewingDistance = YES;
_enabled = YES;
@@ -32,10 +40,6 @@
return self;
}
+ (BOOL)supportsSecureCoding {
return YES;
}
- (instancetype)initWithCoder:(NSCoder *)decoder {
if (self = [super initWithCoder:decoder]) {
_reuseIdentifier = [decoder decodeObjectOfClass:[NSString class] forKey:@"reuseIdentifier"];

View File

@@ -85,7 +85,7 @@ static NSString * const MGLTestAnnotationReuseIdentifer = @"MGLTestAnnotationReu
if (!annotationView)
{
annotationView = [[MGLAnnotationView alloc] initWithReuseIdentifier:MGLTestAnnotationReuseIdentifer];
annotationView = [[MGLAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:MGLTestAnnotationReuseIdentifer];
}
_annotationView = annotationView;