Я создал собственный рендер, основанный на некотором поиске в Google, который позволит Frame
иметь полный контроль над всеми его радиусами углов (слева, сверху, справа, снизу). Однако, несмотря на то, что он установлен на 60, 60, 0, 0
, я не вижу, чтобы он соблюдал эти критерии. На Android работает как положено.
iOS Экран:
![iOS pin screen](https://i.stack.imgur.com/VZ5OS.png)
Android:
![enter image description here](https://i.stack.imgur.com/7ltaM.png)
Во время отладки я ясно вижу, что пользовательский рендер правильно получает данные, то есть радиусы углов передаются соответственно. Вот пользовательский код рендерера:
public override void LayoutSubviews()
{
base.LayoutSubviews();
UpdateCornerRadius();
UpdateShadow();
}
protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
{
base.OnElementChanged(e);
if (e.NewElement == null)
return;
UpdateShadow();
UpdateCornerRadius();
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == nameof(MultiCornerFrame.CornerRadius) || e.PropertyName == nameof(MultiCornerFrame))
{
UpdateCornerRadius();
}
if(e.PropertyName == nameof(MultiCornerFrame.Elevation))
{
UpdateShadow();
}
}
private void UpdateShadow()
{
var materialFrame = (MultiCornerFrame) Element;
// Update shadow to match better material design standards of elevation
Layer.ShadowRadius = materialFrame.Elevation;
Layer.ShadowColor = UIColor.Gray.CGColor;
Layer.ShadowOffset = new CGSize(2, 2);
Layer.ShadowOpacity = 0.80f;
Layer.ShadowPath = UIBezierPath.FromRect(Layer.Bounds).CGPath;
Layer.MasksToBounds = false;
}
// A very basic way of retrieving same one value for all of the corners
private double RetrieveCommonCornerRadius(CornerRadius cornerRadius)
{
var commonCornerRadius = cornerRadius.TopLeft;
if (commonCornerRadius <= 0)
{
commonCornerRadius = cornerRadius.TopRight;
if (commonCornerRadius <= 0)
{
commonCornerRadius = cornerRadius.BottomLeft;
if (commonCornerRadius <= 0)
{
commonCornerRadius = cornerRadius.BottomRight;
}
}
}
return commonCornerRadius;
}
private UIRectCorner RetrieveRoundedCorners(CornerRadius cornerRadius)
{
var roundedCorners = default(UIRectCorner);
if (cornerRadius.TopLeft > 0)
{
roundedCorners |= UIRectCorner.TopLeft;
}
if (cornerRadius.TopRight > 0)
{
roundedCorners |= UIRectCorner.TopRight;
}
if (cornerRadius.BottomLeft > 0)
{
roundedCorners |= UIRectCorner.BottomLeft;
}
if (cornerRadius.BottomRight > 0)
{
roundedCorners |= UIRectCorner.BottomRight;
}
return roundedCorners;
}
private void UpdateCornerRadius()
{
var cornerRadius = (Element as MultiCornerFrame)?.CornerRadius;
if (!cornerRadius.HasValue)
{
return;
}
var roundedCornerRadius = RetrieveCommonCornerRadius(cornerRadius.Value);
if (roundedCornerRadius <= 0)
{
return;
}
var roundedCorners = RetrieveRoundedCorners(cornerRadius.Value);
var path = UIBezierPath.FromRoundedRect(Bounds, roundedCorners, new CGSize(roundedCornerRadius, roundedCornerRadius));
var mask = new CAShapeLayer { Path = path.CGPath};
NativeView.Layer.Mask = mask;
}
XAML, откуда он вызывается, выглядит следующим образом:
<customcontrols:MultiCornerFrame Elevation="48" CornerRadius="60, 60, 0, 0" Grid.Row="1" BackgroundColor="White" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
Дайте мне знать, если мне нужно опубликовать больше кода