I need to create a bitmap from a view, like a stack layout for example. Is that possible in iOS? I 've done it in Android already ,using a custom render, but I'm struggling in iOS.
Does anyone have an ideia if that's possible?
Found the solution :
private void NewElement_OnDrawBitmap(object sender, EventArgs e)
{
var formsView = Element;
var rect = new CGRect(0, 0, 400, 400);
var iOSView = FormsViewToNativeiOS.ConvertFormsToNative(formsView, rect);
UiImage = ConvertViewToImage(iOSView);
SaveImage(UiImage);
}
public static UIView ConvertFormsToNative(Xamarin.Forms.View view, CGRect size)
{
var renderer = Platform.CreateRenderer(view);
renderer.NativeView.Frame = size; renderer.NativeView.AutoresizingMask = UIViewAutoresizing.All; renderer.NativeView.ContentMode = UIViewContentMode.ScaleToFill; renderer.Element.Layout(size.ToRectangle()); var nativeView = renderer.NativeView; nativeView.SetNeedsLayout(); return nativeView; }
void SaveImage(UIImage image)
{
var sdCardPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
string pngFilename = System.IO.Path.Combine(sdCardPath, Element.Nome + DateTime.Now.ToString("dd-MM-yyyy_hh:mm:ss:tt") + ".png");
NSData imgData = image.AsPNG();
if (imgData.Save(pngFilename, false, out NSError err))
{
Debug.WriteLine("saved as " + pngFilename);
}
else
{
Debug.WriteLine("NOT saved as " + pngFilename + " because" + err.LocalizedDescription);
}
}
Answers
Same principle in IOS. You can use this to generate the bitmap from a UIView.
what view should i pass as parameter? In the android solution, i use the ViewGroup.GetChildAt(desiredindex) so it draws the view i want
Why not use a
ContentView
and create a custom renderer for it?Create a custom contentView and place Forms controls there:
And the custom renderer for it:
At last you can use this contentView in the page.
Im using a render, LandLu, but as i need to convert a xamarin.form.view to a UIView, nothing seems to work as I wish.
In android im using this:
@LeoOsvald ContentView is rendered as UIView on iOS. You can create your custom content view, put your controls there.
Then the renderer itself is a UIView object.
Found the solution :
private void NewElement_OnDrawBitmap(object sender, EventArgs e)
{
var formsView = Element;
var rect = new CGRect(0, 0, 400, 400);
var iOSView = FormsViewToNativeiOS.ConvertFormsToNative(formsView, rect);
UiImage = ConvertViewToImage(iOSView);
SaveImage(UiImage);
}
public static UIView ConvertFormsToNative(Xamarin.Forms.View view, CGRect size)
{
var renderer = Platform.CreateRenderer(view);
void SaveImage(UIImage image)
{
var sdCardPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
string pngFilename = System.IO.Path.Combine(sdCardPath, Element.Nome + DateTime.Now.ToString("dd-MM-yyyy_hh:mm:ss:tt") + ".png");
NSData imgData = image.AsPNG();
if (imgData.Save(pngFilename, false, out NSError err))
{
Debug.WriteLine("saved as " + pngFilename);
}
else
{
Debug.WriteLine("NOT saved as " + pngFilename + " because" + err.LocalizedDescription);
}
}
var renderer1 = RendererFactory.GetRenderer(view); <= deprecated
var renderer2 = Platform.CreateRenderer(view); <= deprecated
var renderer3 = Platform.CreateRendererWithContext(view, context); <= current
it would be nice if people made their minds up...
see Michael Ridland October 2015
I'm interested to see where the 'context' comes from...
updated with obsolescence removed...
public class NativeButtonRenderer : ButtonRenderer
{
public NativeButtonRenderer(Context context) : base(context)
{
}