I want to create a subclass of UITableView
or UIScrollView
that will have some shading at the top when the content offset is > 0 to indicate that the content is scrollable. (See image attached)
The way I'm implementing it right now is using the UIViewController
that is the delegate of the tableView
. I simply have a GradientView
on top of the tableView
, and I intercept scrollViewDidScroll:
to animate the visibility of that top gradient.
My problem with this implementation is that it's not "clean". I want my UIViewControllers
to take care of logic, and not to deal with applying gradients and stuff. I wish I could just drop a subclass of UITableView
that will do that for me.
The challenge for me is that I can't figure out how the tableView
could add to itself a fixed content on top of the scrollable content.
Another question is what method/s of UIScrollView
should I override to intercept the scrolling event. Obviously I don't want the tableView to be the delegate of itself...
Any ideas?
Thanks!
I've managed to figure out a much simpler way of doing this then what Avraham did.
I use the fact that the UIScrollView calls scrollViewDidScroll: ever pixel the scrolling changes to set the object at the location of the offset. Below is my full code to keep a gray bar at the top of the scrollview as you move around:
Ok, so I found the solution on Apple's WWDC 2011 Session 104 video - Advanced Scroll View Techniques.
There is a whole section in this video about "Stationary Views" inside a scroll view. According to Apple, the way to go here is to override layoutSubviews and put there all the code to position whatever you want - wherever you want.
I tried it and it's actually pretty easy and it's working as expected.
So for example if I would like a shadowed header on top of the table when the content is being scrolled, this is the code I should write:
}
You could try using viewForHeaderInSection method of tableView for the shaded view(and also heightForHeaderInSection)... Make the shaded portion as a header.That way there is a fixed content on top of the scrollable content.