i'm wondering what is the best way to check - is callout view pressed using mapBox iOS SDK?
The only method that i find is this one
- (void)tapOnCalloutAccessoryControl:(UIControl *)control forAnnotation:(RMAnnotation *)annotation onMap:(RMMapView *)map
but this method checking is accessory pressed in callout view.
Any ideas how to achieve this? Thanks
There is a delegate method called tapOnLabelForAnnotation:onMap in RMMapViewDelegate, you can use this method to get informed about the user tapping the annotation label.
Delegate methods for detecting a press of the callout, instead of just its accessories, do not exist currently.
Related
what I want to do is when I deselect an pin, the pin view change it's UI back to unselected state(e.g change color of background of the pin)
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
//do something;
XLMapItemAnnotation* mapItem = [self annotationForView:view];
[view prepareForReuse];
}
by having this code, when I run the app in iOS 11, if I deselect a pin, the pin disappear in the map view totally. and if I remove the prepareForReuse, everything would be fine.
and the some code if I run the app in iOS 10, everything is fine, no pin get disappeared.
can sbd give me a hint, what could be wrong?
You should not call -prepareForReuse yourself, it's intended for MapKit to call itself.
As #Tim Johnsen said, -prepareForReuse is intended for MKAnnotationView's reuse mechanism, you should not call it yourself.
In iOS 11, MapKit introduce clustering algorithm for MKAnnotationView(But after some try, I found it cause strange behavior sometimes). In this case, MKAnnotationView.isHidden is set as true by default. So after you invoking -prepareForReuse, MKAnnotationView is hidden.
If you want to change color of the pin, just change pinTintColor property directly, or use a function to reset all properties as needed.
I am working on my app using mapbox sdk(MapBox iOS SDK 1.0.3) and installed the framework using steps as described here.
Now when i add the annotation on the map then i am able to show the title,subtitle,left/right accessory views but the accessory view's tap functionality is not working.
I have tried these solutions as described in these discussions but still i am not able to get tap functionality to work on my left and right accessory view and its driving me nuts to why this is happening as this is just a basic functionality.I have read a lot of discussions in mapbox support and tried most of the solutions but to no use.
Please help me on where i am getting wrong.i have looked into this project too- "weekend-pics".but i am not understanding why these two methods -
- (RMMapLayer *)mapView:(RMMapView *)mapView layerForAnnotation:(RMAnnotation *)annotation
and
- (void)tapOnCalloutAccessoryControl:(UIControl *)control forAnnotation:(RMAnnotation *)annotation onMap:(RMMapView *)map
are not being called directly on the contrary the should be called as these are delegate methods and should be triggered when accesory view of callout is tapped.
I have tried using [self mapView:mapView layerForAnnotation:annotations]; then i get the compiler to go into this mehtod-
- (RMMapLayer *)mapView:(RMMapView *)mapView layerForAnnotation:(RMAnnotation *)annotation
but still the - - (void)tapOnCalloutAccessoryControl:(UIControl *)control forAnnotation:(RMAnnotation *)annotation onMap:(RMMapView *)map method doesnot gets called when i try to click on the right accesory view of the annotation.
I have added #import "MapBox/MapBox.h" in my file. do i need to add any other file too for this functionality to work? and i have debugged using Breakpoints but the control never goes inside these two methods as described above.
I am using Mbtile file and using it as an offline map in my app.
Xcode5,ios7
Please guys help me solve this issue.Thanks!!
Are you sure that you are setting your mapView.delegate? These are delegate callback methods. You can do this either in code or in the XIB, if you add your map view that way.
I would like to know how I can make sure that a callout bubble can't get deselected on a MKMapView.
Whenever I press on the map (background), this view:
Turns to:
Which I do not want to allow. Yet I do want to keep the callOutButton support.
You could just programmatically select your annotation whenever annotations get deselected (using the corresponding delegate method). If you don't animate this selection then it looks as if the annotation never got deselected in the first place.
Example:
// MKMapView Delegate
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {
// Replace "myAnnotation" with whichever annotation you need to remain selected
[mapView selectAnnotation:self.myAnnotation animated:NO];
}
I tried this in a test project and it works fine (it doesn't flicker or anything). It's not exactly disabling deselection but the resulting effect is the same, so it might be a good workaround.
When selecting the disclosure button on a callout, the callout animates to the slide over and expand into larger area with more information.
Besides making this component from scratch, does anyone know how to make annotation callouts do this?
According to this: http://www.cocoacontrols.com/controls/gikanimatedcallout
, Apple is using a private API. The link above has code that tries to replicate what Apple does.
you should use below delegate method
(void)mapView:(MKMapView *)mapview annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
then in this delegate method, you should create an disclosure button.
if(buttonType==disclosurebutton) then show custom UIView.
I think that will help overall.
I want to find where user tapped on MapKit. I cannot find a action to make a connection so i am wondering there is an alternate method for the same. please let me know.
As #Disco S2 says, add the instance of MKMapView as a subview to your view. To know where your user tapped on the map, use this method:
- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view
Put the mapkit inside a view and listen for touches in that view. There is then a method to convert the touch in the mapView to a touch in the view and vice versa. I can't remember the method for converting but it will be in the map kit documentation