За да персонализирам външния вид на приложението си, имплементирах персонализирано изобразяване на бутони, като зададох градиентно фоново изображение върху тях. Засега това работи добре.
Въпреки това, когато задам радиус на ъгъла, ръбовете изглеждат много размазани. Мислех, че може да се дължи на разликата между координатите на екрана и действителната разделителна способност, но когато приложа фактор (2 или 3), за да се приспособя към това, той просто напълно прецаква формата (докато все още е замъглена).
Ето екранна снимка, направена на iPhone X (обърнете внимание на разделителната способност на записа и изображенията):
Ето кода, генериращ фона:
private UIImage CreateGradientBackground(Color startColor, Color endColor)
{
var gradientLayer = new CAGradientLayer();
if (Control == null)
return null;
gradientLayer.Bounds = Control.Bounds;
gradientLayer.CornerRadius = (Control.Bounds.Width < Control.Bounds.Height) ?
Control.Bounds.Width / 2 :
Control.Bounds.Height / 2;
gradientLayer.Colors = new CGColor[] { startColor.ToCGColor(), endColor.ToCGColor() };
gradientLayer.StartPoint = new CGPoint(0, 0.5);
gradientLayer.EndPoint = new CGPoint(1, 0.5);
UIGraphics.BeginImageContext(gradientLayer.Bounds.Size);
if (UIGraphics.GetCurrentContext() == null)
return null;
gradientLayer.RenderInContext(UIGraphics.GetCurrentContext());
UIImage image = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return image;
}
Ето как се прилага (за всички различни състояния):
Control.SetBackgroundImage(gradientBackground, UIControlState.Normal);
Някой има ли идея как да поправя това?
Благодаря много!
РЕШЕНИЕ (благодарение на NickSpag!)
1: задайте подходящ мащаб на съдържанието на градиентния слой:
gradientLayer.ContentsScale = UIScreen.MainScreen.Scale;
2: вземете правилния контекст на изображението:
UIGraphics.BeginImageContextWithOptions(gradientLayer.Bounds.Size, false, UIScreen.MainScreen.Scale);