Чтобы настроить внешний вид моего приложения, я реализовал настраиваемое средство визуализации для кнопок, установив для них фоновое изображение градиента. Пока все работает нормально.
Однако, когда я устанавливаю радиус угла, края выглядят очень размытыми. Я думал, что это может быть из-за разницы между координатами экрана и фактическим разрешением, но когда я применяю коэффициент (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);