Dotykové události a gesta v Xamarin.iOS

Je důležité porozumět dotykovým událostem a dotykovým rozhraním API v aplikaci pro iOS, protože jsou centrální pro všechny fyzické interakce se zařízením. Všechny interakce dotykového UITouch ovládání zahrnují objekt. V tomto článku se dozvíte, jak používat UITouch třídu a její rozhraní API k podpoře dotykového ovládání. Později se podíváme na naše znalosti a dozvíme se, jak podporovat gesta.

Povolení dotykového ovládání

UIKit Ovládací prvky v – ty podtříděné z UIControl – jsou tak závislé na interakci uživatele, že mají gesta integrovaná do UIKitu, a proto není nutné povolit touch. Je už povolený.

Mnoho zobrazení v UIKit nich ale ve výchozím nastavení nemá povolené dotykové ovládání. Existují dva způsoby, jak povolit dotykové ovládání ovládacího prvku. Prvním způsobem je zaškrtnout políčko Povolená interakce uživatelů v oblasti vlastností iOS Designeru, jak je znázorněno na následujícím snímku obrazovky:

Check the User Interaction Enabled checkbox in the Property Pad of the iOS Designer

Můžeme také použít kontroler k nastavení UserInteractionEnabled vlastnosti true u UIView třídy. To se vyžaduje, pokud je uživatelské rozhraní vytvořené v kódu.

Následující řádek kódu je příkladem:

imgTouchMe.UserInteractionEnabled = true;

Dotykové události

Existují tři fáze dotykového ovládání, ke kterým dochází, když se uživatel dotkne obrazovky, přesune prst nebo odebere prst. Tyto metody jsou definovány v UIResponder, což je základní třída pro UIView. iOS přepíše přidružené metody na UIView dotykovém ovládání a UIViewController ovládání:

  • TouchesBegan – Volá se, když se obrazovka poprvé dotkne.
  • TouchesMoved – To se volá, když se změní umístění dotykového ovládání, když uživatel posune prsty po obrazovce.
  • TouchesEnded nebo TouchesCancelledTouchesEnded je volána, když jsou prsty uživatele zvednutí z obrazovky. TouchesCancelled se zavolá, když iOS zruší dotykové ovládání – například když uživatel posune prst mimo tlačítko a zruší stisknutí.

Dotykové události cestují rekurzivně dolů prostřednictvím zásobníku UIViews, abyste zkontrolovali, jestli je událost dotykového ovládání v mezích objektu zobrazení. To se často označuje jako hit-testování. Nejprve budou volána na nejvyšší UIView úrovni nebo UIViewController se pak budou volat na UIView a UIViewControllers pod nimi v hierarchii zobrazení.

Objekt UITouch se vytvoří pokaždé, když se uživatel dotkne obrazovky. Objekt UITouch obsahuje data o dotykovém ovládání, například když došlo k dotyku, kde k němu došlo, pokud byl dotyk potáhnutím prstem atd. Události dotyku se předají dotkování vlastnosti – NSSet obsahující jeden nebo více dotyků. Tuto vlastnost můžeme použít k získání odkazu na dotyk a určení odpovědi aplikace.

Třídy, které přepíší jednu z dotykových událostí, by měly nejprve volat základní implementaci a pak získat UITouch objekt přidružený k události. Pokud chcete získat odkaz na první dotyk, zavolejte AnyObject vlastnost a přetypujte ji jako znázorněnou UITouch v následujícím příkladu:

public override void TouchesBegan (NSSet touches, UIEvent evt)
{
    base.TouchesBegan (touches, evt);
    UITouch touch = touches.AnyObject as UITouch;
    if (touch != null)
    {
        //code here to handle touch
    }
}

iOS automaticky rozpozná po sobě jdoucí rychlé dotyky na obrazovce a všechny je shromáždí jedním klepnutím v jednom UITouch objektu. To usnadňuje kontrolu vlastnosti poklepáním TapCount , jak je znázorněno v následujícím kódu:

public override void TouchesBegan (NSSet touches, UIEvent evt)
{
    base.TouchesBegan (touches, evt);
    UITouch touch = touches.AnyObject as UITouch;
    if (touch != null)
    {
        if (touch.TapCount == 2)
        {
            // do something with the double touch.
        }
    }
}

Vícedotykový

U ovládacích prvků není ve výchozím nastavení povolený vícedotykový ovládání. V iOS Designeru je možné povolit vícedotykové ovládání, jak je znázorněno na následujícím snímku obrazovky:

Multi-touch enabled in the iOS Designer

Vícedotykové nastavení je také možné nastavit programově nastavením MultipleTouchEnabled vlastnosti, jak je znázorněno v následujícím řádku kódu:

imgTouchMe.MultipleTouchEnabled = true;

Pokud chcete zjistit, kolik prstů se dotkne obrazovky, použijte Count vlastnost UITouch vlastnosti vlastnosti:

public override void TouchesBegan (NSSet touches, UIEvent evt)
{
    base.TouchesBegan (touches, evt);
    lblNumberOfFingers.Text = "Number of fingers: " + touches.Count.ToString();
}

Určení umístění dotykového ovládání

Metoda UITouch.LocationInView vrátí objekt CGPoint, který obsahuje souřadnice dotykového ovládání v daném zobrazení. Kromě toho můžeme otestovat, zda je toto umístění v ovládacím prvku voláním metody Frame.Contains. Následující fragment kódu ukazuje příklad:

if (this.imgTouchMe.Frame.Contains (touch.LocationInView (this.View)))
{
    // the touch event happened inside the UIView imgTouchMe.
}

Když teď máme přehled o dotykových událostech v iOSu, pojďme se seznámit s rozpoznáváním gest.

Rozpoznávání gest

Rozpoznávání gest může výrazně zjednodušit a snížit programovací úsilí na podporu dotykového ovládání v aplikaci. Rozpoznávání gest v iOSu agreguje řadu dotykových událostí do jedné dotykové události.

Xamarin.iOS poskytuje třídu UIGestureRecognizer jako základní třídu pro následující integrované rozpoznávání gest:

  • UITapGestureRecognizer – Toto je pro jedno nebo více klepnutí.
  • UIPinchGestureRecognizer – Připnutí a rozprostření prstů.
  • UIPanGestureRecognizer – Posouvání nebo přetahování
  • UISwipeGestureRecognizer – potáhnutí prstem v libovolném směru.
  • UIRotationGestureRecognizer – Otáčení dvou prstů ve směru hodinových ručiček nebo proti směru hodinových ručiček.
  • UILongPressGestureRecognizer – Stiskněte a podržte, někdy označované jako dlouhé stisknutí nebo dlouhé kliknutí.

Základní vzor pro použití rozpoznávání gest je následující:

  1. Vytvoření instance rozpoznávání gest – nejprve vytvořte UIGestureRecognizer instanci podtřídy. Objekt, který se vytvoří instance, bude přidružen zobrazením a bude uvolňování paměti při odstranění zobrazení. Toto zobrazení není nutné vytvořit jako proměnnou na úrovni třídy.
  2. Nakonfigurujte všechna nastavení gest – dalším krokem je konfigurace rozpoznávání gest. Seznam vlastností, které lze nastavit pro řízení chování UIGestureRecognizer instance, najdete v dokumentaci UIGestureRecognizer Xamarinu a jeho podtřídách.
  3. Nakonfigurujte cíl – vzhledem k jeho Objective-C dědictví Xamarin.iOS nevyvolává události, když rozpoznávání gest odpovídá gestu. UIGestureRecognizer má metodu – AddTarget která může přijmout anonymního delegáta nebo Objective-C selektor s kódem, který se má spustit, když rozpoznávání gest udělá shodu.
  4. Povolte rozpoznávání gest – stejně jako u dotykových událostí se gesta rozpoznávají jenom v případě, že jsou povoleny dotykové interakce.
  5. Přidejte do zobrazení rozpoznávání gest – posledním krokem je přidání gesta do zobrazení voláním View.AddGestureRecognizer a předáním objektu rozpoznávání gest.

Další informace o tom, jak je implementovat v kódu, najdete v ukázkách rozpoznávání gest.

Při zavolání cíle gesta se předá odkaz na gesto, ke kterému došlo. To umožňuje cíli gesta získat informace o gestu, ke kterému došlo. Rozsah dostupnýchinformacích Informace o datech dostupných pro každou UIGestureRecognizer podtřídu najdete v dokumentaci k Xamarinu.

Je důležité si uvědomit, že jakmile se do zobrazení přidá rozpoznávání gest, zobrazení (a jakékoli zobrazení pod ním) neobdrží žádné dotykové události. Pokud chcete povolit dotykové události současně s gesty, CancelsTouchesInView musí být vlastnost nastavena na false, jak je znázorněno následujícím kódem:

_tapGesture.Recognizer.CancelsTouchesInView = false;

Každý UIGestureRecognizer má vlastnost State, která poskytuje důležité informace o stavu rozpoznávání gest. Pokaždé, když se hodnota této vlastnosti změní, bude iOS volat metodu odběru, která jí poskytne aktualizaci. Pokud rozpoznávání vlastních gest nikdy neaktualiuje vlastnost State, odběratel se nikdy nezavolá a vykresluje rozpoznávání gest nepoužitelně.

Gesta se dají shrnout jako jeden ze dvou typů:

  1. Diskrétní – tato gesta se aktivují pouze při prvním rozpoznání.
  2. Nepřetržitě – tato gesta se stále aktivují, pokud jsou rozpoznána.

Rozpoznávání gest existuje v jednom z následujících stavů:

  • Možné – jedná se o počáteční stav všech rozpoznávání gest. Toto je výchozí hodnota State vlastnost.
  • Zahájen – Když je nejprve rozpoznáno nepřetržité gesto, je stav nastaven na Zahájen. To umožňuje přihlášení k odběru rozlišovat mezi tím, kdy se spustí rozpoznávání gest a kdy se změní.
  • Změněno – Po zahájení nepřetržitého gesta, ale ještě není dokončeno, bude stav nastaven na Změněn při každém přesunutí nebo změně dotyku, pokud je stále v očekávaných parametrech gesta.
  • Zrušeno – Tento stav se nastaví, pokud rozpoznávání přešlo ze začátku na změněno a pak se dotyky změnily takovým způsobem, aby se už nevešly vzoru gesta.
  • Rozpoznaný – stav se nastaví, když rozpoznávání gest odpovídá sadě dotyků a informuje odběratele, že toto gesto bylo dokončeno.
  • Ukončeno – jedná se o alias pro rozpoznaný stav.
  • Selhalo – Pokud rozpoznávání gest přestane odpovídat dotykům, na které naslouchá, stav se změní na Selhání.

Xamarin.iOS představuje tyto hodnoty ve výčtu UIGestureRecognizerState .

Práce s několika gesty

Ve výchozím nastavení iOS neumožňuje souběžné spouštění výchozích gest. Místo toho bude každý rozpoznávání gest přijímat dotykové události v ne deterministickém pořadí. Následující fragment kódu znázorňuje, jak spustit rozpoznávání gest současně:

gesture.ShouldRecognizeSimultaneously += (UIGestureRecognizer r) => { return true; };

V iOSu je také možné zakázat gesto. Existují dvě vlastnosti delegáta, které umožňují rozpoznávání gest prozkoumat stav aplikace a aktuální dotykové události, rozhodnout, jak a jestli má být gesto rozpoznáno. Mezi dvě události patří:

  1. ShouldReceiveTouch – Tento delegát je volána přímo před rozpoznáváním gest je předána dotyková událost, a poskytuje příležitost prozkoumat dotyky a rozhodnout, které dotyky se budou zpracovávat rozpoznáváním gest.
  2. ShouldBegin – To se volá, když se rozpoznávatel pokusí změnit stav z Možnosti na jiný stav. Vrácení nepravda vynutí, aby se stav rozpoznávání gest změnil na Neúspěšné.

Tyto metody můžete přepsat silným typem UIGestureRecognizerDelegate, slabým delegátem nebo vytvořit vazbu prostřednictvím syntaxe obslužné rutiny události, jak je znázorněno v následujícím fragmentu kódu:

gesture.ShouldReceiveTouch += (UIGestureRecognizer r, UITouch t) => { return true; };

Nakonec je možné zařadí rozpoznávání gest do fronty, aby byl úspěšný pouze v případě, že selže jiný rozpoznáč gest. Rozpoznávání gest jedním klepnutím by například mělo být úspěšné pouze v případě, že selže rozpoznávání gest poklepáním. Následující fragment kódu obsahuje příklad:

singleTapGesture.RequireGestureRecognizerToFail(doubleTapGesture);

Vytvoření vlastního gesta

I KDYŽ iOS poskytuje některé výchozí rozpoznávání gest, může být nutné vytvořit vlastní rozpoznávání gest v určitých případech. Vytvoření vlastního rozpoznávání gest zahrnuje následující kroky:

  1. Podtřída UIGestureRecognizer .
  2. Přepište příslušné metody dotykové události.
  3. Bublinový stav rozpoznávání prostřednictvím vlastnosti State základní třídy.

Praktický příklad bude popsán v návodu Using Touch v iOSu .