Objective C (iphone/ipad) - carousel coding best practice - iphone

I need to build a scroll view (with 10 items for example) that can be continuously scrolled (with paging enabled). In other words as you keep scrolling to the right, you see the item you started with once to get to the end, and it just keeps looping.
I'm looking for recommendations on how to a approach this. I will be receiving an array of images. I can lay them out next to each other no problem. My main concern is how/when to move the images so they keep appearing in a loop as you scroll. Thanks!

Append the first picture as the last picture. Just as you move further right from the last picture, jump to the first.
And vice versa of course.

Use -(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView; delegate to know when someone's moving through your scroll view.
When you get to the last page you need to move the first image view in the scroll view to the end. ie:
for(UIImageView *image in myscrollview){
if(image.frame.origin.x == 0){
// move to the end...
}
else{
// move your image a scroll view's width to the left...
}
}
obviously it will be much more complicated than this, you will have to work out which way the user is scrolling and sort it out like that, but this gives you a basis to start with. :)

Related

Vertical and horizontal scoll at a time in gridview with infinite scrolling IOS

How can one enable horizontal and vertical scrolling at same time in a grid view?
If I have a 4x4 grid of thumbnail images, I want to implement swiping in both directions, left/right and top/bottom. Currently I am done with left and right swipe, but if I select the second cell and swipe towards the top, the 2nd row should be scrolled like a Rubik's cube.
Please share if any one have any idea.
It's been quite a while since your question but as I've been struggling with the same thing I'm gonna answer it for future reference...
Sadly I could not find a good solution anywhere so after a lot of hours of experimenting I came up with this: https://github.com/AlvinNutbeij/DWGridController
It's still a work in progress but very usable for your purpose I'd say!
How have you currently implemented what you have? Your mention of 'cell' makes it sound like you are using a UITableView. You won't manage to make one of those scroll in both directions, you'll need to work with a UIScrollView.
I suggest you watch "Designing apps with Scroll Views" from WWDC 2010, then "Advanced Scrollview Techniques" from WWDC 2011. That'll teach you about how you implement tiling and infinite scrolling.
Essentially what you want to do is implement some kind of view recycling yourself, that works like the way UITableView recycles its cells. When things are scrolled off one side of the scroll view, you remove the views for the things that just scrolled off screen and put them in a queue. When things scroll onto the screen, you pull views out of the queue (or create new ones if the queue is empty) and lay those views out in the correct place.
To do the infinite scrolling, you fake it: when your scroll view gets near its edge, you reposition everything inside it, you move the scroll view's content offset to where you've repositioned the views, and then you continue from there: it's all done at once so the user never notices.
The videos will explain these techniques better than I can sum up here: watch those as your first point of call.

Swipe through UITableView results

What I do now:
I have a UITableView that displays results from a search query, when I touch a result in the TableView it loads a subview that displays details of that result. I can swipe across that subview to switch between results like next and previous. All it does is change out the displayed data but it uses the same view
What I want to do:
I want it to show an animation when swiping between results, similar to the photos app, however since the number of results can be quite large I seem to be having issues figuring out a simple way to switch views when swiping without loading a new view for each result to start with.
Does anyone know of an easy way to do this? Perhaps Apple has already made this easy and I am just unaware.
Thanks in advance.
Instead of instantiating a new view for each result, you could have an array with a few views (3 for example), and reuse them, kinda like the UITableView. When you swipe, you retrieve from your array a view that is not visible on the screen, replace its content, and display it. I guess at the end of your animation, one view will get out of the screen, so it will be available for reuse later on.
A second idea, which is a little more complex and tricky to code, is to use a UITableView as your subview, rotate it by 90 degrees (so it scrolls horizontally), and rotate all the views you put in its cells by -90 degrees. Then you'll benefit from the tableview's reuse mechanism.

How to achieve 2 dimensional scrolling on iPhone

I am trying to create a excel like view in my app. To do that I wanted to achieve both horizontal n vertical swipes at the same time .i.e., if the vertical scroll would fill with rows and the horizontal with columns.. have no clue hw to begin with.
This is an interesting question. For sure I would say start with UIScrollView, and set the content size bigger than the screen size, exactly how big is up to you.
Next you'll want to make some kind of implementation that efficiently figures out what cells are on screen. If I were you I would do something similar to how UITableView is done, i.e. make a custom object that keeps track of what indexes should be on screen based on the offset of the scroll view.
Next you'll need this custom object to either directly or indirectly get the visible cells to display themselves on screen when they are visible, and remove them from the superview when they aren't. I'd also recommend reusing the views that are offscreen.
This is a moderately challenging thing you are trying to make, so be sure you are very organized and don't be scared to make a few new custom object to perform specific tasks.
Sample interface file:
#protocol doubleTableViewDelegate
-(NSInteger)heightForRow:(NSInteger)row;
-(NSInteger)widthForCol:(NSInteger)col;
-(NSInteger)numberOfRows:(NSInteger)rows;
-(NSInteger)numberOfCols:(NSInteger)cols;
-(UIView *)cellForRow:(NSInteger)row col:(NSInteger)col; //get the custom table view to store and dequeue these, i.e. store them in an NSSet when they go offscreen, and give them back when a certain function is called.
//There's probably a few functions missing here still.
#end
#interface doubleTableView: UIScrollView {
id<doubleTableViewDelegate> infoDelegate;
}
//your functions to show and remove cells as needed
#end
You'll need to work out the rest, but keep updating this page and I'll try to help out.
Good luck with this, let me know how it goes.

How to implement a cyclic UIScrollView?

How to implement a cyclic UIScrollView? That is to say, when you scroll to the very left item then the UIScrollView will show the very right one. Any help would be appreciate.
Sure, you need three views. At any given time you have a left view, a right view and a current view.
This requires notification of each movement through the UIScrollViewDelegate.
If you detect that you moved right, you free left, make left = current, current = right, and make a new right.
If you detect that you moved left, you free right, make right = current, current = left, and make a new left.
Generally speaking, any view that is more than one page away from current is not required. So you need only three pages in total.
Of course you also need to manipulate the position of the UIScrollView so you can make the movements - the net result is you don't move although it looks like you have. When you have done the scroll, and altered the views according to the left/current/right shuffle - you do
[self scrollRectToVisible:(middle frame) animated:NO];
so that you are always looking at the same actual page, with one page each side of it. When the scroll happens it looks like the user can keep scrolling around in a loop - but after each page ticks over, the views are shuffled, the position within the scroll view gets set back to the middle and the user can scroll again.
Getting back to the start is simply a matter of using the view related to whatever object is at the other end of whatever data structure you are using - so if current = [(NSArray)data lastObject] then right = [(NSArray)data objectAtIndex:0].

iPhone: scroll view with arbitrary page/"settling" boundaries?

I'm trying to figure out if I can get what I want out of UIScrollView through some trickery or whether I need to roll my own scroll view:
I have a series of items in row that I want to scroll through. One item should always be centered in the view, but other items should be visible to either side. In other words, I want normal scrolling and edge bouncing, but I want the deceleration when the user ends a touch to naturally settle at some specified stop point. (Actually now that I think of it, this behavior is similar to coverflow in this respect.)
I know UIScrollView doesn't do this out of the box, but does anyone have suggestions for how it might be made to do this, or if anyone's spotted any code that accomplishes something similar (I'm loathe to reimplement all the math for deceleration and edge bounce)
Thanks!
There is not a whole lot of trickery to this. Just use an UIScrollView with paging enabled. Make it the size of one of your items, and locate it where you want that item to appear. Next, disable the "Clip Subviews" option on the scroll view (either in IB, or programmatically), and you are all set.