Is there a way how can I change callout view when there are multiple annotations at same position? If there is one then just show normal callout and if there is more then I would like to show callout with text like: "3 items at this place" and then I would go to table view and then to detail (with one item at place just go to detail place). Is it possible? What's best way to do this? Thanks
This technique is called clustering. Check out cocoacontrols.com for some approaches for doing this with MapKit.
About 18 minutes into the WWDC 2011 #111 - Visualizing Information Geographically with MapKit video, Apple illustrates an example of how you can prevent overlapping annotations (including some nice animation revealing and hiding more detailed annotations as you zoom in and out). It could easily be adapted to handle the different callouts that you describe, too.
Related
Using UICollectionView and excellent help given on here on StackOverflow, I've been able to build a "Gantt Chart" style control for my iPhone:
Cosmetics aside (I'm doing the functional right now, I've got a graphics designer on tap to look at colors and all that).
Background aside, the spans were relatively straightforward to do with a custom UICollectionViewLayout subclass. Each span is an item.
But I need to add some functionality, and am unsure how to proceed. Where I'm trying to go is illustrated roughly as:
Sketchy cosmetics aside, the point is that I want to "annotate" whatever the currently selected span is with additional information (I promise to find someone to help me look it pretty). And I want them to be active, I'm not sure if it brings up an editing control or does drag, but I want to be able recognize gestures on either the numbers or the bold lines and do things with them, distinct from touching on the span which drives selection.
I can think of (at least) 3 ways to try and implement this:
Use supplementary views. Cause selection to invalidateLayout, detect the selected state in my prepareLayout, and generate additional layout attributes for the two anchors. Implement a subclass of UICollectionReusableView which does the drawing, and adds touchable subviews (or its own gesture recognizers). This feels... wrong. I get the idea that supplementary views are more for headers and footers, not for controls that come and go as the selection state changes. But maybe it's an appropriate extension of the facility?
Use the backgroundView (or selectedBackgroundView, not sure it matters) of my current SpanCell class (which is a subclass of UICollectionViewCell). As long as I disable clipsToBounds, I can draw the annotation around the bounds of the span. I'll have to give it some knowledge of the big picture to find the endpoints, but that's not too offensive. I would just show/hide this view in response to selection changes. This seems like the best way to do it.
Do it in the main backgroundView of the entire UICollectionView. As shown, I've already got a specialized backgroundView which shows the the current time grid, strip style. I could further extend this view to draw annotations and manage touchable sub controls in response to selection changes. This would give me most direct implementation, but it feels like I'll end up with a big monster "doing too many jobs" object for the background.
Question then, for those who have more experience, is which route would you go? Would it be one of the above 3? Or something different? And why?
While your question is very technical with UICollectionView implementation, which I am not very familiar with, this seems like a job for the container (in this case, the collection view). Imagine you need your annotation to consider, in addition to the selected item, other items? Like for example, avoiding collision between annotation lines and another item?
For me, option number 3 seems like the most correct one. If you fear a large class, you can extern it to an annotation controller class, which should be notified whenever the annotations should be updated.
(source: mshcdn.com)
What is this view called?
Its like stacked folders (Cupertino, New York, Austin, Your Location) that when you touch one.
It enlarges and shows more details, is it complicated to create?
And can someone please show me a link, on how to create one?
Thanks.
It looks a lot like an Accordion.
There are a number of Accordion projects on Cocoa Controls and Cocoapods.
This is just using a UITableView and customising what happens when you tap cells.
You don't need UIKit Dynamics for something like this. Nor would I put multiple UIViews on top of each other as if there are more than a handful you'll run into memory issues.
The transition to the next screen is a custom transition. You can read more about these in WWDC 2013 video. I think it's session 218.
Or possibly in the tech talk videos available from the http://developer.apple.com website.
The iOS weather app uses a similar concept. I'm about 30% through trying to reverse engineer it. I believe it uses a UICollectionView with a layout-to-layout transition.
This is not a standard view controller layout. I think you could call this "Stacked View Controllers", as it is not per se a navigation controller (no push/pop), nor a tab bar controller, nor anything known.
I am creating a word search game for the iPhone and am having trouble figuring out what is the best approach to take for the main component of the game (the word search puzzle).
I am currently using a collection view to display the puzzle. However I am having trouble figuring out how to track the users touch on the collection view to highlight letter as they slide their finger across the puzzle.
Iv looked into collection views's selection and highlight features but they don't seem to provide the functionality that I need.
So basically my question are as follows:
Is a collection view the best approach for this type of game (word search)?
If it is, then how do I go about tracking the user input to highlight and return the cells they slide their fingers over?
And if it is not the best approach what are some other options, that make it easier to track users input on a grid like display?
I tired posting images of what I am talking about but can't due so, so hopefully my problem is clear, if not please let me know and I will try to be more specific.
Thank you in advance for any advice and suggestions.
A way to go about this would be to add a pan gesture recognizer to the collection view. Then, you can use indexPathForItemAtPoint: and cellForItemAtIndexPath: to get the correct cell as the user pans. You can then do whatever you want with the individual cells.
There is a great SDK for iOS called HeatMap. You can get more info HERE. I have read lots of good stuff about the developer and the service. Lets you track touch events on selective views.
Here is a screenshot from the demo on that site:
I have been searching for a UI Control and don't know what its called, which makes it tough to find right? What UI Control in iOS 5 or 6 provides a view overlay that can swipe away? Kind of the opposite of a slide-out nav view. I am looking at the TouchArcade app as an example, where you tap an item and this slides out an overlay with an article or review. Its also possible to have several overlay's that can swipe to the right for removal. Is this a custom control? I know this must be an easy question, I just don't know what its called, and therefore, my terms don't help much in Google. The closest thing I have found is ShinobiControls Overlays: http://www.shinobicontrols.com/shinobiessentials/
I'd rather just make my own than rely an somebody else's library I have to keep up to date. On the other hand, that one does look pretty good and would save me time.
Edit:
Picture of TouchArcade as an example overlay view.
You see how the article is presented over the list view below? What controls do that in iOS? It also allows multiple overlays as you click further into each item. You dismiss them by swiping them to the right, dragging them out of view.
I have two annotations with the same coordinates. And I have to display them on the map. When I add these annotations on the map I see just one pin. How can I display two annotations instead of one? Or how can I display a annotations list by clicking on the pin? Can anybody help me?
Thanks in advance.
Igor
When you try to display multiple annotations at the same coordinate on a map using MapKit, generally it will actually place two different pins, but they will be in the exact same location. You can compare the difference in the shadow strength to see the difference, however; look at a single pin's shadow, then look at your double-pin shadow, and you should see the latter appear darker.
In terms of indicating to your user that there are multiple pins, there are several ways you could do that. You might consider implementing the title or subtitle properties on your annotations to display the number of annotations at the same coordinates (e.g. set subtitle to the string #"(and two more)" or similar). Then, when the callout accessory view is tapped, push (onto a navigation controller stack) a table view of annotations at that location.