Создание подкласса UIView, который использует CAGradientLayer в качестве слоя

1

Я хочу передать это на С#.

Я не знаю, как это сделать:

@property (nonatomic, strong, readonly) CAGradientLayer *layer;

layer является слоем по умолчанию для UIView. У Xamarin уже есть свойство Layer. Как переписать это? Нужно ли его перезаписывать?

Я также попробовал

public CAGradientLayer layer { [Export ("Layer")] get; [Export ("Layer:")] set; }

но приложение сбой (System.Reflection.TargetInvocationException - исключение NullReferenceException при удалении ячейки), если я хочу установить цвета слоя. Кроме того, он должен быть только для чтения.

Затем я увидел в документации, как он может быть преобразован:

public class BlueView : UIView
{
    [Export ("layerClass")]
    public static Class GetLayerClass ()
    {
        return new Class (typeof (BlueLayer));
    }

    public override void Draw (RectangleF rect)
    {
        // Do nothing, the Layer will do all the drawing
    }
}

public class BlueLayer : CALayer
{
    public override void DrawInContext (CGContext ctx)
    {
        ctx.SetFillColor (0, 0, 1, 1);
        ctx.FillRect (Bounds);
    }
}

Это не помогает мне, потому что мне нужно что-то вроде SetFillColors, чтобы я мог использовать CGColor[]. Но такой функции нет.

Как создать мой UIView с моим пользовательским CAGradientLayer в С# с Monotouch?

  • 0
    Пожалуйста, объясните более подробно, почему это не помогает? Какой метод SetFillColors вы хотите использовать, но не можете?
  • 0
    Существует только SetFillColor без s . Доступны разные методы SetFillColor . Один берет float[] components . Еще один CGColor . Не существует метода, который принимает CGColor[] .
Показать ещё 2 комментария
Теги:
xamarin
xamarin.ios
cagradientlayer

1 ответ

3
Лучший ответ

Этот замечательный пост (iOS Programming Recipe 20: Использование CAGradientLayer в пользовательском представлении) указал мне в правильном направлении:

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.CoreAnimation;
using MonoTouch.CoreGraphics;
using MonoTouch.ObjCRuntime;

namespace SampleApp
{
    public class GradientView : UIView
    {
//      public new CAGradientLayer Layer { get; private set; }
        private CAGradientLayer gradientLayer {
            get { return (CAGradientLayer)this.Layer; }
        }

        public GradientView ()
        {
        }


        [Export ("layerClass")]
        public static Class LayerClass ()
        {
            return new Class (typeof(CAGradientLayer));
        }

        public void setColors(CGColor[] colors){
            this.gradientLayer.Colors = colors;
        }

//      public override void Draw (RectangleF rect)
//      {
//          // Do nothing, the Layer will do all the drawing
//      }
    }
}

И здесь я создаю и настраиваю свой фоновый вид:

GradientView background = new GradientView ();
background.setColors (new CGColor[] {
    UIColor.FromRGB (18,200,45).CGColor,
    UIColor.White.CGColor,
    UIColor.White.CGColor
});

Теперь это работает. Использование специального свойства (включительно) и отдельный метод сделали трюк. Конечно, вы можете написать полный доступ. Это был простой тест.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню