xamarin 如何为每个IOS元素制作焦点事件/效果?

c90pui9n  于 2022-12-07  发布在  iOS
关注(0)|答案(1)|浏览(147)

我已经为Xamarin.forms.Android做了如下的焦点效果,所以当键盘聚焦在元素上时,它会在它周围显示蓝色的矩形。:

protected override void OnAttached()
    {
        try
        {
            OriginalBackground = Container.Background;
            if(Control != null)
            {
                Control.FocusChange += Control_FocusChange;
            }
            else
            {
                Container.FocusChange += Control_FocusChange;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message);
        }
    }

    protected override void OnDetached()
    {
    }

    protected override void OnElementPropertyChanged(System.ComponentModel.PropertyChangedEventArgs args)
    {
        base.OnElementPropertyChanged(args);
    }

    private void Control_FocusChange(object sender, FocusChangeEventArgs e)
    {
        if(Control != null)
        {
            if (Control.HasFocus)
            {
                Control.SetBackgroundColor(Android.Graphics.Color.Transparent);
                Control.SetBackgroundResource(Resource.Drawable.focusFrame);
            }
            else
            {
                Control.SetBackground(OriginalBackground);
            }
        }
        else
        {
            if (Container.HasFocus)
            {
                Container.SetBackgroundColor(Android.Graphics.Color.Red);
                Container.SetBackgroundResource(Resource.Drawable.focusFrame);
            }
            else
            {
                Container.SetBackground(OriginalBackground);
            }
        }
    }

有人能告诉我如何在Xamarin.Forms.IOS上实现同样的效果吗?我尝试了下面的代码,但是它在聚焦应用程序方面并不像Android那样有效。不知何故,没有一个事件,或者我错过了IOS的事件:

UIColor backgroundColor;
    UIView  view;
    public Func<Brush, CALayer> OriginalBackground { get; private set; }

    protected override void OnAttached()
    {
        try
        {
            OriginalBackground = Container.GetBackgroundLayer;
            if (Container != null)
            {
                this.Container.DidUpdateFocus()
                CreateRectange();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message);
        }
    }

    private void CreateRectange()
    {
        view = new UIView();
        view.BackgroundColor = UIColor.Clear;
        view.Frame = new CGRect(30, 100, 36, 36);
        var maskLayer = new CAShapeLayer();

        UIBezierPath bezierPath = UIBezierPath.FromRoundedRect(view.Bounds, (UIRectCorner.TopLeft | UIRectCorner.BottomLeft), new CGSize(18.0, 18.0));

        maskLayer.Path = bezierPath.CGPath;
        maskLayer.Frame = view.Bounds;

        maskLayer.StrokeColor = UIColor.Black.CGColor; //set the borderColor
        maskLayer.FillColor = UIColor.Red.CGColor;   //set the background color
        maskLayer.LineWidth = 1;  //set the border width

        view.Layer.AddSublayer(maskLayer);

        Container.AddSubview(view);
    }

    protected override void OnDetached()
    {
    }

    protected override void OnElementPropertyChanged(PropertyChangedEventArgs args)
    {
        base.OnElementPropertyChanged(args);

        try
        {
            if (args.PropertyName == "IsFocused")
            {
                Control.AddSubview(view);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message);
        }
    }
pepwfjgg

pepwfjgg1#

首先,框架的大小应该适合控件。然后,您需要将maskLayer.FillColor设置为UIColor.Clear.CGColor,以使控件的内容能够正确显示。
您可以尝试以下代码:

UIView view;
    float width,height;
    public Func<Brush, CALayer> OriginalBackground { get; private set; }

    protected override void OnAttached()
    {
    }

    private void CreateRectange()
    {
        height = (float)Control.Frame.Height;
        width = (float)Control.Frame.Width;
        view = new UIView();
        view.BackgroundColor = UIColor.Clear;
        view.Frame = new CGRect(0,0,width,height);
        var maskLayer = new CAShapeLayer();
        UIBezierPath bezierPath = UIBezierPath.FromRoundedRect(view.Bounds, (UIRectCorner.TopLeft | UIRectCorner.BottomLeft), new CGSize(0,0));
        maskLayer.Path = bezierPath.CGPath;
        maskLayer.Frame = view.Bounds;
        maskLayer.StrokeColor = UIColor.Red.CGColor; //set the borderColor
        maskLayer.FillColor = UIColor.Clear.CGColor;  //set the background color
        maskLayer.LineWidth = 1;  //set the border width
        view.Layer.AddSublayer(maskLayer);
    }

    protected override void OnDetached()
    {
    }

    protected override void OnElementPropertyChanged(PropertyChangedEventArgs args)
    {
        base.OnElementPropertyChanged(args);   
        try
        {
            if (args.PropertyName == "IsFocused")
            {
                CreateRectange();
                Control.AddSubview(view);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Cannot set property on attached control. Error: ", ex.Message);
        }
    }

相关问题