【问题标题】:Custom Rendering on IOS a CardView from Frame在 IOS 上自定义渲染来自 Frame 的 CardView
【发布时间】:2016-11-14 16:36:46
【问题描述】:

我正在尝试通过子类化 Frame 并制作自定义渲染器来在 IOS Xamarin Forms 上制作 CardView。我想实现这样的目标:

在查看有关设置阴影的 API 后,我已经这样做了:

[assembly: ExportRenderer(typeof(CardView), typeof(CardViewRenderer))]
namespace TrabbleMobile.iOS.CustomRenderers
{
    public class CardViewRenderer : FrameRenderer
    {
        public override void Draw(CGRect rect)
        {
            var cardView = (CardView)this.Element;

            using (var context = UIGraphics.GetCurrentContext())
            {
                //nfloat cornerRadius = 2;
                float shadowOffsetWidth = 2;
                float shadowOffsetHeight = 4;
                var shadowColor = new CGColor(0, 0, 0, (nfloat)0.5);
                var boxColor = new CGColor(255, 255, 255);
                var shadowBlur = (float)0.5;
                var offset = new CGSize(shadowOffsetWidth, shadowOffsetHeight);

                context.SetShadow(offset, shadowBlur, shadowColor);

但是,它并没有按应有的方式渲染,而且根本没有阴影。

【问题讨论】:

标签: ios xamarin xamarin.forms uigraphicscontext


【解决方案1】:

我已经这样做了,我这样做的方式是通过 IOS 上的自定义渲染,这里是自定义渲染器代码:

    public class CardViewRenderer : FrameRenderer
    {

        public override void Draw(CGRect rect)
        {
            SetupShadowLayer();
            base.Draw(rect);
        }

        void SetupShadowLayer()
        {
            Layer.CornerRadius = 2; // 5 Default
            if (Element.BackgroundColor == Xamarin.Forms.Color.Default)
            {
                Layer.BackgroundColor = UIColor.White.CGColor;
            }
            else
            {
                Layer.BackgroundColor = Element.BackgroundColor.ToCGColor();
            }

            Layer.ShadowRadius = 2; // 5 Default
            Layer.ShadowColor = UIColor.Black.CGColor;
            Layer.ShadowOpacity = 0.4f; // 0.8f Default
            Layer.ShadowOffset = new CGSize(0f, 2.5f);

            if (Element.OutlineColor == Xamarin.Forms.Color.Default)
            {
                Layer.BorderColor = UIColor.Clear.CGColor;
            }
            else
            {
                Layer.BorderColor = Element.OutlineColor.ToCGColor();
                Layer.BorderWidth = 1;
            }

            Layer.RasterizationScale = UIScreen.MainScreen.Scale;
            Layer.ShouldRasterize = true;
        }
    }

【讨论】:

  • 这行得通,但是如果您单击并滚动到 CardView Renderer 列表视图,CardView Renderer 将返回其原始状态。
猜你喜欢
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多