Как реализовать долгое нажатие в Xamarin Forms для iOS? - PullRequest
0 голосов
/ 05 апреля 2019

Мне нужно было реализовать долгое нажатие в Xamarin Forms для iOS, и я не нашел нужного мне поста.Мой рабочий код ниже.Надеюсь, это кому-нибудь поможет.

1 Ответ

0 голосов
/ 05 апреля 2019

Мой пользовательский класс ImgButton наследуется от Grid.В других случаях вам просто нужно заменить ViewRenderer другим средством визуализации согласно этой [таблице]. [1]

Поскольку я хочу, чтобы долгое нажатие было включено только в определенных случаях, ImgButton имеет свойство EnableLongPress.

using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using UIKit;

[assembly: ExportRenderer (typeof(ImgButton), typeof(ImgButtonRenderer))]
namespace MyApp.iOS.Renderers
{
    public class ImgButtonRenderer : ViewRenderer<ImgButton,ImgButtonRenderer>
    {
        private UILongPressGestureRecognizer longPressGestureRecognizer;

    protected override void OnElementChanged ( ElementChangedEventArgs<ImgButton> e )
    {
        base.OnElementChanged ( e );

        if ( e.NewElement != null ) 
        {
            if ( ! e.NewElement.EnableLongPress )
                return;

            Action longPressAction = new Action ( () => 
            {
                if ( longPressGestureRecognizer.State != UIGestureRecognizerState.Began )
                    return;

                Console.WriteLine ( "Long press for " + e.NewElement.Text );

                // Handle the long press in the PCL
                e.NewElement.OnLongPress ( e.NewElement );
            });

            longPressGestureRecognizer = new UILongPressGestureRecognizer ( longPressAction );
            longPressGestureRecognizer.MinimumPressDuration = 0.5D;
            AddGestureRecognizer ( longPressGestureRecognizer );
        }

        if ( e.NewElement == null ) 
        {
            if ( longPressGestureRecognizer != null ) 
            {
                RemoveGestureRecognizer ( longPressGestureRecognizer );
            }
        }

        if ( e.OldElement == null ) 
        {
            if ( longPressGestureRecognizer != null )
                AddGestureRecognizer ( longPressGestureRecognizer );
        }
    }
}

А в классе ImgButton:

public void OnLongPress ( ImgButton button )
    // Here when a long press happens on an ImgButton
    {
        // Inform current page
        MessagingCenter.Send<ImgButton, ImgButton> ( this, "LongPressMessageType", button );
    }
...