1

これをC#に移植したい。

これをどのように変換すればよいかわかりません:

@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[]。しかし、そのような機能はありません。

Monotouch を使用して C# でUIViewカスタムを作成するにはどうすればよいですか?CAGradientLayer

4

1 に答える 1

3

この素晴らしい投稿 ( iOS プログラミング レシピ 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
});

今ではうまくいくようです。カスタム プロパティ (インクルーシブ キャスト) と別のメソッドを使用するとうまくいきました。もちろん、完全なアクセサを書くこともできます。これは簡単なテストでした。

于 2014-11-10T12:18:43.167 に答える