Hi,

I want to use gradient backgrounds for my tableview cells
(based upon MonoTouch.Dialog StyledStringElements), and I want to
specify the BackgroundColor of the UITableViews.

After quite some searching and reading I came up with an approach that
builds on two distinct aspects:

1. Nullify the TableView.BackgroundView and set the
TableView.BackgroundColor to the desired color. This is the color that
shows in the border around Grouped tableview cells.

2. Set the BackgroundColor as UIColorFromPatternImage(patternImage) for
all Elements in the UITableView.

My apps allow color selection by the user, so the pattern image is to be
created dynamically (i.e. for the initial default color and whenever the
user chooses a different color).

3. So here's how I create the gradient image:

3.1. Create a CAGradientLayer using White and the user specified color

3.2. Create a tiny (44x44) view, set its BackgroundColor to Clear, and
insert the above gradientLayer as layer 0 using InsertSublLayer.

3.3. I then render the view in the current context and retrieve it as a
UIImage file to be used by step 2 above, i.e. as patternImage.

I created a one source demo project demonstrating these techniques. Feel
free to get it at https://gist.github.com/4677718. Create an empty
project and replace Main.cs by the Main.cs file from the gist.
It works as desired, and you can change it to use UITableViewStyle.Plain
rather than Grouped. It just works.

So here's my problem. I use these techniques in 4 projects for all
DialogViewControllers and it works fine as long as they use
UITableViewStyle.Grouped.

But when using UITableviewstyle.Plain the cells that are visible when
the tableview appears, do not have the GradientColor. It is as if the
BackgroundColor is Clear: they are rendered with the
TableView.BackgroundColor as BackgroundColor.

Scrolling cells that are out of view into view shows them with the
gradient background color. Scrolling 'bad' cells out of view and back
into view shows them with gradient color.

Clicking one of the buttons so that a next controller is shown, and
navigating back from that controller again shows all visible cells
with clear background. Scrolling cells that are out of view into view
renders them with the gradient color.

The RootElement is (re)created in the ViewWillAppear method, so that any
changes selected at a more detailed level can be reflected in the
RootElement. And when populating it in the constructor rather than the
ViewWillAppear, the debugger shows that the Root.TableView does not
exist yet, so its BackgroundView can not be nulled, which is essential
to be able to set the UITableView.BackgroundColor.

I created the little demo project to isolate and hopefully solve this
problem, but in that project the techniques also work with
UITableViewStyle.Plain.

Apparently there's still an aspect that differentiates the demo project
from my apps, but to be honest, I'm out of inspiration.

I hope that some more knowledgeable hacker can suggest something I could
try or investigate to get this solved.

I am eager to provide any additional information that might be useful to
track this problem.


Guido

--
People respond to people who respond.

http://vanhoecke.org ... and go2 places!
_______________________________________________
MonoTouch mailing list
[email protected]
http://lists.ximian.com/mailman/listinfo/monotouch

Reply via email to