[ios, macos] Iterate over point and shape annotations. (#10262)
This commit is contained in:
committed by
GitHub
parent
a614001965
commit
372698aa23
@@ -3776,11 +3776,10 @@ public:
|
||||
queryRect = CGRectInset(queryRect, -MGLAnnotationImagePaddingForHitTest,
|
||||
-MGLAnnotationImagePaddingForHitTest);
|
||||
std::vector<MGLAnnotationTag> nearbyAnnotations = [self annotationTagsInRect:queryRect];
|
||||
BOOL queryingShapeAnnotations = NO;
|
||||
std::vector<MGLAnnotationTag> nearbyShapeAnnotations = [self shapeAnnotationTagsInRect:queryRect];
|
||||
|
||||
if (!nearbyAnnotations.size()) {
|
||||
nearbyAnnotations = [self shapeAnnotationTagsInRect:queryRect];
|
||||
queryingShapeAnnotations = YES;
|
||||
if (nearbyShapeAnnotations.size()) {
|
||||
nearbyAnnotations.insert(nearbyAnnotations.end(), nearbyShapeAnnotations.begin(), nearbyShapeAnnotations.end());
|
||||
}
|
||||
|
||||
if (nearbyAnnotations.size())
|
||||
@@ -3790,54 +3789,57 @@ public:
|
||||
-MGLAnnotationImagePaddingForHitTest,
|
||||
-MGLAnnotationImagePaddingForHitTest);
|
||||
|
||||
if (!queryingShapeAnnotations) {
|
||||
// Filter out any annotation whose image or view is unselectable or for which
|
||||
// hit testing fails.
|
||||
auto end = std::remove_if(nearbyAnnotations.begin(), nearbyAnnotations.end(), [&](const MGLAnnotationTag annotationTag) {
|
||||
id <MGLAnnotation> annotation = [self annotationWithTag:annotationTag];
|
||||
NSAssert(annotation, @"Unknown annotation found nearby tap");
|
||||
if ( ! annotation)
|
||||
// Filter out any annotation whose image or view is unselectable or for which
|
||||
// hit testing fails.
|
||||
auto end = std::remove_if(nearbyAnnotations.begin(), nearbyAnnotations.end(), [&](const MGLAnnotationTag annotationTag) {
|
||||
id <MGLAnnotation> annotation = [self annotationWithTag:annotationTag];
|
||||
NSAssert(annotation, @"Unknown annotation found nearby tap");
|
||||
if ( ! annotation)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
MGLAnnotationContext annotationContext = _annotationContextsByAnnotationTag.at(annotationTag);
|
||||
CGRect annotationRect;
|
||||
|
||||
MGLAnnotationView *annotationView = annotationContext.annotationView;
|
||||
|
||||
if (annotationView)
|
||||
{
|
||||
if ( ! annotationView.enabled)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
MGLAnnotationContext annotationContext = _annotationContextsByAnnotationTag.at(annotationTag);
|
||||
CGRect annotationRect;
|
||||
|
||||
MGLAnnotationView *annotationView = annotationContext.annotationView;
|
||||
|
||||
if (annotationView)
|
||||
|
||||
CGPoint calloutAnchorPoint = MGLPointRounded([self convertCoordinate:annotation.coordinate toPointToView:self]);
|
||||
CGRect frame = CGRectInset({ calloutAnchorPoint, CGSizeZero }, -CGRectGetWidth(annotationView.frame) / 2, -CGRectGetHeight(annotationView.frame) / 2);
|
||||
annotationRect = UIEdgeInsetsInsetRect(frame, annotationView.alignmentRectInsets);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ([annotation isKindOfClass:[MGLShape class]])
|
||||
{
|
||||
if ( ! annotationView.enabled)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
CGPoint calloutAnchorPoint = MGLPointRounded([self convertCoordinate:annotation.coordinate toPointToView:self]);
|
||||
CGRect frame = CGRectInset({ calloutAnchorPoint, CGSizeZero }, -CGRectGetWidth(annotationView.frame) / 2, -CGRectGetHeight(annotationView.frame) / 2);
|
||||
annotationRect = UIEdgeInsetsInsetRect(frame, annotationView.alignmentRectInsets);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
||||
MGLAnnotationImage *annotationImage = [self imageOfAnnotationWithTag:annotationTag];
|
||||
if ( ! annotationImage.enabled)
|
||||
{
|
||||
MGLAnnotationImage *annotationImage = [self imageOfAnnotationWithTag:annotationTag];
|
||||
if ( ! annotationImage.enabled)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
MGLAnnotationImage *fallbackAnnotationImage = [self dequeueReusableAnnotationImageWithIdentifier:MGLDefaultStyleMarkerSymbolName];
|
||||
UIImage *fallbackImage = fallbackAnnotationImage.image;
|
||||
|
||||
annotationRect = [self frameOfImage:annotationImage.image ?: fallbackImage centeredAtCoordinate:annotation.coordinate];
|
||||
return true;
|
||||
}
|
||||
|
||||
// Filter out the annotation if the fattened finger didn’t land
|
||||
// within the image’s alignment rect.
|
||||
return !!!CGRectIntersectsRect(annotationRect, hitRect);
|
||||
});
|
||||
|
||||
MGLAnnotationImage *fallbackAnnotationImage = [self dequeueReusableAnnotationImageWithIdentifier:MGLDefaultStyleMarkerSymbolName];
|
||||
UIImage *fallbackImage = fallbackAnnotationImage.image;
|
||||
|
||||
annotationRect = [self frameOfImage:annotationImage.image ?: fallbackImage centeredAtCoordinate:annotation.coordinate];
|
||||
}
|
||||
|
||||
nearbyAnnotations.resize(std::distance(nearbyAnnotations.begin(), end));
|
||||
}
|
||||
// Filter out the annotation if the fattened finger didn’t land
|
||||
// within the image’s alignment rect.
|
||||
return !!!CGRectIntersectsRect(annotationRect, hitRect);
|
||||
});
|
||||
|
||||
nearbyAnnotations.resize(std::distance(nearbyAnnotations.begin(), end));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -2056,11 +2056,10 @@ public:
|
||||
queryRect = NSInsetRect(queryRect, -MGLAnnotationImagePaddingForHitTest,
|
||||
-MGLAnnotationImagePaddingForHitTest);
|
||||
std::vector<MGLAnnotationTag> nearbyAnnotations = [self annotationTagsInRect:queryRect];
|
||||
BOOL queryingShapeAnnotations = NO;
|
||||
std::vector<MGLAnnotationTag> nearbyShapeAnnotations = [self shapeAnnotationTagsInRect:queryRect];
|
||||
|
||||
if (!nearbyAnnotations.size()) {
|
||||
nearbyAnnotations = [self shapeAnnotationTagsInRect:queryRect];
|
||||
queryingShapeAnnotations = YES;
|
||||
if (nearbyShapeAnnotations.size()) {
|
||||
nearbyAnnotations.insert(nearbyAnnotations.end(), nearbyShapeAnnotations.begin(), nearbyShapeAnnotations.end());
|
||||
}
|
||||
|
||||
if (nearbyAnnotations.size()) {
|
||||
@@ -2069,30 +2068,33 @@ public:
|
||||
-MGLAnnotationImagePaddingForHitTest,
|
||||
-MGLAnnotationImagePaddingForHitTest);
|
||||
|
||||
if (!queryingShapeAnnotations) {
|
||||
// Filter out any annotation whose image is unselectable or for which
|
||||
// hit testing fails.
|
||||
auto end = std::remove_if(nearbyAnnotations.begin(), nearbyAnnotations.end(), [&](const MGLAnnotationTag annotationTag) {
|
||||
id <MGLAnnotation> annotation = [self annotationWithTag:annotationTag];
|
||||
NSAssert(annotation, @"Unknown annotation found nearby click");
|
||||
if (!annotation) {
|
||||
return true;
|
||||
}
|
||||
|
||||
MGLAnnotationImage *annotationImage = [self imageOfAnnotationWithTag:annotationTag];
|
||||
if (!annotationImage.selectable) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Filter out the annotation if the fattened finger didn’t land on a
|
||||
// translucent or opaque pixel in the image.
|
||||
NSRect annotationRect = [self frameOfImage:annotationImage.image
|
||||
centeredAtCoordinate:annotation.coordinate];
|
||||
return !!![annotationImage.image hitTestRect:hitRect withImageDestinationRect:annotationRect
|
||||
context:nil hints:nil flipped:NO];
|
||||
});
|
||||
nearbyAnnotations.resize(std::distance(nearbyAnnotations.begin(), end));
|
||||
}
|
||||
// Filter out any annotation whose image is unselectable or for which
|
||||
// hit testing fails.
|
||||
auto end = std::remove_if(nearbyAnnotations.begin(), nearbyAnnotations.end(), [&](const MGLAnnotationTag annotationTag) {
|
||||
id <MGLAnnotation> annotation = [self annotationWithTag:annotationTag];
|
||||
NSAssert(annotation, @"Unknown annotation found nearby click");
|
||||
if (!annotation) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ([annotation isKindOfClass:[MGLShape class]])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
MGLAnnotationImage *annotationImage = [self imageOfAnnotationWithTag:annotationTag];
|
||||
if (!annotationImage.selectable) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Filter out the annotation if the fattened finger didn’t land on a
|
||||
// translucent or opaque pixel in the image.
|
||||
NSRect annotationRect = [self frameOfImage:annotationImage.image
|
||||
centeredAtCoordinate:annotation.coordinate];
|
||||
return !!![annotationImage.image hitTestRect:hitRect withImageDestinationRect:annotationRect
|
||||
context:nil hints:nil flipped:NO];
|
||||
});
|
||||
nearbyAnnotations.resize(std::distance(nearbyAnnotations.begin(), end));
|
||||
}
|
||||
|
||||
MGLAnnotationTag hitAnnotationTag = MGLAnnotationTagNotFound;
|
||||
|
||||
Reference in New Issue
Block a user