Я хочу передать это на С#.
Я не знаю, как это сделать:
@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?
Этот замечательный пост (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
});
Теперь это работает. Использование специального свойства (включительно) и отдельный метод сделали трюк. Конечно, вы можете написать полный доступ. Это был простой тест.
SetFillColor
без s . Доступны разные методыSetFillColor
. Один беретfloat[] components
. Еще одинCGColor
. Не существует метода, который принимаетCGColor[]
.