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
