Skip to content
This repository has been archived by the owner on May 1, 2024. It is now read-only.

[iOS] Remove deprecated BeginImageContextWithOptions #15833

Merged
merged 1 commit into from
Nov 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions Xamarin.Forms.Platform.iOS/Extensions/BrushExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,16 +113,13 @@ public static UIImage GetBackgroundImage(this UIView control, Brush brush)
if (backgroundLayer == null)
return null;

UIGraphics.BeginImageContextWithOptions(backgroundLayer.Bounds.Size, false, UIScreen.MainScreen.Scale);

if (UIGraphics.GetCurrentContext() == null)
return null;

backgroundLayer.RenderInContext(UIGraphics.GetCurrentContext());
UIImage gradientImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
var renderer = new UIGraphicsImageRenderer(backgroundLayer.Bounds.Size, new UIGraphicsImageRendererFormat()
{
Opaque = false,
Scale = UIScreen.MainScreen.Scale,
});

return gradientImage;
return renderer.CreateImage((context) => backgroundLayer.RenderInContext(context.CGContext));
}

public static void InsertBackgroundLayer(this UIView view, CALayer backgroundLayer, int index = -1)
Expand Down
30 changes: 12 additions & 18 deletions Xamarin.Forms.Platform.iOS/Renderers/EntryRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -597,26 +597,20 @@ UIImage GetClearButtonTintImage(UIImage image, UIColor color)

var size = image.Size;

UIGraphics.BeginImageContextWithOptions(size, false, UIScreen.MainScreen.Scale);

if (UIGraphics.GetCurrentContext() == null)
return null;

var context = UIGraphics.GetCurrentContext();

image.Draw(CGPoint.Empty, CGBlendMode.Normal, 1.0f);
context?.SetFillColor(color.CGColor);
context?.SetBlendMode(CGBlendMode.SourceIn);
context?.SetAlpha(1.0f);

var rect = new CGRect(CGPoint.Empty.X, CGPoint.Empty.Y, image.Size.Width, image.Size.Height);
context?.FillRect(rect);

var tintedImage = UIGraphics.GetImageFromCurrentImageContext();
var renderer = new UIGraphicsImageRenderer(size, new UIGraphicsImageRendererFormat()
{
Opaque = false,
Scale = UIScreen.MainScreen.Scale,
});

UIGraphics.EndImageContext();
return renderer.CreateImage((context) =>
{
image.Draw(CGPoint.Empty, CGBlendMode.Normal, 1.0f);
color.ColorWithAlpha(1.0f).SetFill();

return tintedImage;
var rect = new CGRect(CGPoint.Empty.X, CGPoint.Empty.Y, image.Size.Width, image.Size.Height);
context?.FillRect(rect, CGBlendMode.SourceIn);
});
}
}
}
91 changes: 44 additions & 47 deletions Xamarin.Forms.Platform.iOS/Renderers/FormsCheckBox.cs
Original file line number Diff line number Diff line change
Expand Up @@ -171,60 +171,57 @@ internal virtual void DrawCheckMark(UIBezierPath path)

internal virtual UIImage CreateCheckBox(UIImage check)
{
UIGraphics.BeginImageContextWithOptions(new CGSize(_defaultSize, _defaultSize), false, 0);
var context = UIGraphics.GetCurrentContext();
context.SaveState();

var checkedColor = CheckBoxTintUIColor;
checkedColor.SetFill();
checkedColor.SetStroke();

var vPadding = _lineWidth / 2;
var hPadding = _lineWidth / 2;
var diameter = _defaultSize - _lineWidth;

var backgroundRect = new CGRect(hPadding, vPadding, diameter, diameter);
var boxPath = CreateBoxPath(backgroundRect);
boxPath.LineWidth = _lineWidth;
boxPath.Stroke();

if (check != null)
var renderer = new UIGraphicsImageRenderer(new CGSize(_defaultSize, _defaultSize), new UIGraphicsImageRendererFormat()
{
boxPath.Fill();
check.Draw(new CGPoint(0, 0), CGBlendMode.DestinationOut, 1);
}

context.RestoreState();
var img = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
Opaque = false,
Scale = 0,
});

return img;
return renderer.CreateImage((context) =>
{
var checkedColor = CheckBoxTintUIColor;
checkedColor.SetFill();
checkedColor.SetStroke();

var vPadding = _lineWidth / 2;
var hPadding = _lineWidth / 2;
var diameter = _defaultSize - _lineWidth;

var backgroundRect = new CGRect(hPadding, vPadding, diameter, diameter);
var boxPath = CreateBoxPath(backgroundRect);
boxPath.LineWidth = _lineWidth;
boxPath.Stroke();

if (check != null)
{
boxPath.Fill();
check.Draw(new CGPoint(0, 0), CGBlendMode.DestinationOut, 1);
}
});
}


internal UIImage CreateCheckMark()
{
UIGraphics.BeginImageContextWithOptions(new CGSize(_defaultSize, _defaultSize), false, 0);
var context = UIGraphics.GetCurrentContext();
context.SaveState();

var vPadding = _lineWidth / 2;
var hPadding = _lineWidth / 2;
var diameter = _defaultSize - _lineWidth;

var checkPath = CreateCheckPath();

context.TranslateCTM(hPadding + (nfloat)(0.05 * diameter), vPadding + (nfloat)(0.1 * diameter));
context.ScaleCTM(diameter, diameter);
DrawCheckMark(checkPath);
UIColor.White.SetStroke();
checkPath.Stroke();

context.RestoreState();
var img = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
var renderer = new UIGraphicsImageRenderer(new CGSize(_defaultSize, _defaultSize), new UIGraphicsImageRendererFormat()
{
Opaque = false,
Scale = 0,
});

return img;
return renderer.CreateImage((context) =>
{
var vPadding = _lineWidth / 2;
var hPadding = _lineWidth / 2;
var diameter = _defaultSize - _lineWidth;

var checkPath = CreateCheckPath();

context.CGContext.TranslateCTM(hPadding + (nfloat)(0.05 * diameter), vPadding + (nfloat)(0.1 * diameter));
context.CGContext.ScaleCTM(diameter, diameter);
DrawCheckMark(checkPath);
UIColor.White.SetStroke();
checkPath.Stroke();
});
}

protected override void Dispose(bool disposing)
Expand Down
30 changes: 19 additions & 11 deletions Xamarin.Forms.Platform.iOS/Renderers/ImageRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
using Xamarin.Forms.Internals;
using RectangleF = CoreGraphics.CGRect;
using PreserveAttribute = Foundation.PreserveAttribute;
using CoreGraphics;
using System.Drawing;

namespace Xamarin.Forms.Platform.iOS
{
Expand Down Expand Up @@ -279,17 +281,23 @@ public Task<UIImage> LoadImageAsync(
var iconcolor = fontsource.Color.IsDefault ? _defaultColor : fontsource.Color;
var attString = new NSAttributedString(fontsource.Glyph, font: font, foregroundColor: iconcolor.ToUIColor());
var imagesize = ((NSString)fontsource.Glyph).GetSizeUsingAttributes(attString.GetUIKitAttributes(0, out _));

UIGraphics.BeginImageContextWithOptions(imagesize, false, 0f);
var ctx = new NSStringDrawingContext();
var boundingRect = attString.GetBoundingRect(imagesize, (NSStringDrawingOptions)0, ctx);
attString.DrawString(new RectangleF(
imagesize.Width / 2 - boundingRect.Size.Width / 2,
imagesize.Height / 2 - boundingRect.Size.Height / 2,
imagesize.Width,
imagesize.Height));
image = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();

var renderer = new UIGraphicsImageRenderer(imagesize, new UIGraphicsImageRendererFormat()
{
Opaque = false,
Scale = 0,
});

image = renderer.CreateImage((context) =>
{
var ctx = new NSStringDrawingContext();
var boundingRect = attString.GetBoundingRect(imagesize, (NSStringDrawingOptions)0, ctx);
attString.DrawString(new RectangleF(
imagesize.Width / 2 - boundingRect.Size.Width / 2,
imagesize.Height / 2 - boundingRect.Size.Height / 2,
imagesize.Width,
imagesize.Height));
});

if (image != null && iconcolor != _defaultColor)
image = image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal);
Expand Down
37 changes: 21 additions & 16 deletions Xamarin.Forms.Platform.iOS/Renderers/ShellPageRendererTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -325,25 +325,30 @@ UIImage DrawHamburger()

var rect = new CGRect(0, 0, 23f, 23f);

UIGraphics.BeginImageContextWithOptions(rect.Size, false, 0);
var ctx = UIGraphics.GetCurrentContext();
ctx.SaveState();
ctx.SetStrokeColor(UIColor.Blue.CGColor);

float size = 3f;
float start = 4f;
ctx.SetLineWidth(size);
var renderer = new UIGraphicsImageRenderer(rect.Size, new UIGraphicsImageRendererFormat()
{
Opaque = false,
Scale = 0,
});

for (int i = 0; i < 3; i++)
img = renderer.CreateImage((context) =>
{
ctx.MoveTo(1f, start + i * (size * 2));
ctx.AddLineToPoint(22f, start + i * (size * 2));
ctx.StrokePath();
}
context.CGContext.SaveState();
UIColor.Blue.SetStroke();

float size = 3f;
float start = 4f;
context.CGContext.SetLineWidth(size);

ctx.RestoreState();
img = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
for (int i = 0; i < 3; i++)
{
context.CGContext.MoveTo(1f, start + i * (size * 2));
context.CGContext.AddLineToPoint(22f, start + i * (size * 2));
context.CGContext.StrokePath();
}

context.CGContext.RestoreState();
});

_nSCache.SetObjectforKey(img, (NSString)hamburgerKey);
return img;
Expand Down
15 changes: 10 additions & 5 deletions Xamarin.Forms.Platform.iOS/Renderers/SwipeViewRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -750,12 +750,17 @@ UIImage MaxResizeSwipeItemIconImage(UIImage sourceImage, nfloat maxWidth, nfloat

var width = maxResizeFactor * sourceSize.Width;
var height = maxResizeFactor * sourceSize.Height;
UIGraphics.BeginImageContextWithOptions(new CGSize((nfloat)width, (nfloat)height), false, 0);
sourceImage.Draw(new CGRect(0, 0, (nfloat)width, (nfloat)height));
var resultImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();

return resultImage;
var renderer = new UIGraphicsImageRenderer(new CGSize((nfloat)width, (nfloat)height), new UIGraphicsImageRendererFormat()
{
Opaque = false,
Scale = 0,
});

return renderer.CreateImage((context) =>
{
sourceImage.Draw(new CGRect(0, 0, (nfloat)width, (nfloat)height));
});
}

void HandleTouchInteractions(GestureStatus status, CGPoint point)
Expand Down