Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir iOS uygulamasındaki dokunma olaylarını ve dokunma API'lerini anlamak önemlidir, bu api'ler cihazla yapılan tüm fiziksel etkileşimlerin merkezinde yer alır. Tüm dokunma etkileşimleri bir UITouch nesne içerir. Bu makalede, dokunmayı desteklemek için sınıfı ve UITouch API'lerini kullanmayı öğreneceğiz. Daha sonra, hareketleri nasıl destekleyeceğinizi öğrenmek için bilgimizi genişleteceğiz.
Dokunmayı Etkinleştirme
UIKit içindeki (UIControl'den alt sınıflanmış olan) denetimler kullanıcı etkileşimine o kadar bağımlıdır ki, UIKit'te yerleşik hareketler vardır ve bu nedenle Dokunma'yı etkinleştirmek gerekli değildir. Zaten etkin.
Ancak, içindeki UIKit görünümlerin çoğunda dokunmatik ekran varsayılan olarak etkin değildir. Bir denetime dokunmayı etkinleştirmenin iki yolu vardır. İlk yol, aşağıdaki ekran görüntüsünde gösterildiği gibi iOS Tasarım Aracı Özellik Bölmesi'nde Kullanıcı Etkileşimi Etkin onay kutusunu işaretlemektir:
Ayrıca bir sınıfta özelliğini true olarak ayarlamak UserInteractionEnabled için bir UIView denetleyici de kullanabiliriz. Kullanıcı arabirimi kodda oluşturulduysa bu gereklidir.
Aşağıdaki kod satırı bir örnektir:
imgTouchMe.UserInteractionEnabled = true;
Dokunma Olayları
Kullanıcı ekrana dokunduğunda, parmağı hareket ettiğinde veya parmağını çıkardığında üç dokunma aşaması vardır. Bu yöntemler, UIView için temel sınıf olan içinde UIRespondertanımlanır. iOS, ve UIViewController üzerindeki UIView ve dokunmayı işlemek için ilişkili yöntemleri geçersiz kılar:
TouchesBegan– Bu, ekrana ilk kez dokunulduğunda çağrılır.TouchesMoved– Bu, kullanıcı parmaklarını ekranda kaydırırken dokunma konumu değiştiğinde çağrılır.TouchesEndedveyaTouchesCancelled–TouchesEndedkullanıcının parmakları ekrandan kaldırıldığında çağrılır.TouchesCancellediOS dokunmayı iptal ederse çağrılır; örneğin, bir kullanıcı bir basım işlemini iptal etmek için parmağını düğmeden uzağa kaydırırsa.
Dokunma olayının bir görünüm nesnesinin sınırları içinde olup olmadığını denetlemek için dokunma olayları UIViews yığını boyunca özyinelemeli olarak aşağı doğru ilerler. Buna genellikle İsabet testi adı verilir. Bunlar önce en UIView üstte veya UIViewController sonra görünüm hiyerarşisinde ve UIViewControllers altında çağrılırUIView.
UITouch Kullanıcı ekrana her dokunduğunda bir nesne oluşturulur. Nesne UITouch , dokunmanın ne zaman oluştuğu, nerede oluştuğu, dokunmanın çekme hareketi olup olmadığı vb. gibi dokunmayla ilgili verileri içerir. Dokunma olayları, bir veya daha fazla dokunuş içeren bir NSSet dokunma özelliğinden geçer. Bir dokunuşa başvuru almak ve uygulamanın yanıtını belirlemek için bu özelliği kullanabiliriz.
Dokunma olaylarından birini geçersiz kılan sınıflar önce temel uygulamayı çağırmalı ve ardından olayla ilişkili nesneyi almalıdır UITouch . İlk dokunuşa başvuru almak için özelliğini çağırın AnyObject ve aşağıdaki örnekte gösterildiği gibi UITouch yayınlayın:
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, ekrandaki ardışık hızlı dokunuşları otomatik olarak tanır ve hepsini tek bir nesnede tek UITouch dokunuşla toplar. Bu, aşağıdaki kodda gösterildiği gibi iki kez dokunma denetimini özelliği denetlemek TapCount kadar kolay hale getirir:
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.
}
}
}
Dokunmatik
Çoklu dokunma, denetimlerde varsayılan olarak etkin değildir. Çoklu dokunma, aşağıdaki ekran görüntüsünde gösterildiği gibi iOS Tasarım Aracı etkinleştirilebilir:
Özelliği aşağıdaki kod satırında gösterildiği gibi ayarlayarak MultipleTouchEnabled program aracılığıyla çoklu dokunma ayarlamak da mümkündür:
imgTouchMe.MultipleTouchEnabled = true;
Ekrana kaç parmağınızla dokunduğunu belirlemek için özelliğindeki UITouch özelliğini kullanınCount:
public override void TouchesBegan (NSSet touches, UIEvent evt)
{
base.TouchesBegan (touches, evt);
lblNumberOfFingers.Text = "Number of fingers: " + touches.Count.ToString();
}
Dokunma Konumunu Belirleme
yöntemi UITouch.LocationInView , belirli bir görünümde dokunmanın koordinatlarını tutan bir CGPoint nesnesi döndürür. Ayrıca yöntemini Frame.Containsçağırarak bu konumun bir denetim içinde olup olmadığını test edebiliriz. Aşağıdaki kod parçacığı bunun bir örneğini gösterir:
if (this.imgTouchMe.Frame.Contains (touch.LocationInView (this.View)))
{
// the touch event happened inside the UIView imgTouchMe.
}
Artık iOS'taki dokunma olaylarını anladığımıza göre, hareket tanıyıcıları hakkında bilgi edinelim.
Hareket Tanıyıcıları
Hareket tanıyıcılar, bir uygulamada dokunmayı desteklemek için programlama çabasını büyük ölçüde basitleştirebilir ve azaltabilir. iOS hareket tanıyıcıları, bir dizi dokunma olayını tek bir dokunma olayında toplar.
Xamarin.iOS, aşağıdaki yerleşik hareket tanıyıcıları için temel sınıf olarak sınıfı UIGestureRecognizer sağlar:
- UITapGestureRecognizer – Bu bir veya daha fazla dokunma içindir.
- UIPinchGestureRecognizer – Parmaklarınızı sıkıştırma ve dağıtma.
- UIPanGestureRecognizer – Kaydırma veya sürükleme.
- UISwipeGestureRecognizer – Herhangi bir yönde çekme.
- UIRotationGestureRecognizer – İki parmağı saat yönünde veya saat yönünün tersine döndürme.
- UILongPressGestureRecognizer – Bazen uzun basma veya uzun tıklama olarak da adlandırılan basılı tutun.
Hareket tanıyıcı kullanmanın temel deseni aşağıdaki gibidir:
- Hareket tanıyıcısının örneğini oluşturma : İlk olarak bir
UIGestureRecognizeralt sınıfın örneğini oluşturma. Örneklenen nesne bir görünümle ilişkilendirilir ve görünüm atıldığında çöp toplanır. Bu görünümü sınıf düzeyi değişkeni olarak oluşturmak gerekli değildir. - Herhangi bir hareket ayarlarını yapılandırma – Sonraki adım, hareket tanıyıcısını yapılandırmaktır. Örneğin davranışını denetlemek için ayarlanabilen özelliklerin listesi için Xamarin'in ve alt sınıflarının
UIGestureRecognizerbelgelerineUIGestureRecognizerbakın. - Hedefi yapılandırma – Xamarin.iOS, mirası nedeniyle Objective-C bir hareket tanıyıcı bir hareketle eşleştiğinde olay oluşturmaz.
UIGestureRecognizerbir yöntemi vardır:AddTargetHareket tanıyıcı bir eşleşme yaptığında yürütülecek koda sahip anonim bir Objective-C temsilciyi veya seçiciyi kabul edebilir. - Hareket tanıyıcıyı etkinleştir – Dokunma olaylarında olduğu gibi, hareketler de yalnızca dokunma etkileşimleri etkinleştirildiğinde tanınır.
- Görünüme hareket tanıyıcısını ekleme – Son adım, çağrısı
View.AddGestureRecognizeryaparak ve bunu bir hareket tanıyıcı nesnesi geçirerek bir görünüme hareketi eklemektir.
Kodda uygulama hakkında daha fazla bilgi için hareket tanıyıcı örneklerine bakın.
Hareketin hedefi çağrıldığında, gerçekleşen harekete bir başvuru geçirilir. Bu, hareket hedefinin gerçekleşen hareket hakkında bilgi edinmesini sağlar. Kullanılabilir bilgilerin kapsamı, kullanılan hareket tanıyıcının türüne bağlıdır. Her UIGestureRecognizer alt sınıf için kullanılabilir veriler hakkında bilgi için lütfen Xamarin belgelerine bakın.
Görünüme bir hareket tanıyıcı eklendikten sonra görünümün (ve altındaki görünümlerin) herhangi bir dokunma olayı almayacaklarını unutmayın. Dokunma olaylarına hareketlerle aynı anda izin vermek için, özelliğin CancelsTouchesInView aşağıdaki kodda gösterildiği gibi false olarak ayarlanması gerekir:
_tapGesture.Recognizer.CancelsTouchesInView = false;
Her UIGestureRecognizer biri, hareket tanıyıcının durumu hakkında önemli bilgiler sağlayan bir State özelliğine sahiptir. Bu özelliğin değeri her değiştiğinde, iOS bir güncelleştirme veren abone yöntemini çağırır. Özel hareket tanıyıcısı State özelliğini hiçbir zaman güncelleştirmezse, abone hiçbir zaman çağrılmaz ve hareket tanıyıcısı işe yaramaz hale gelir.
Hareketler iki türden biri olarak özetlenebilir:
- Ayrık – Bu hareketler yalnızca ilk kez tanındıkları zaman tetiklenir.
- Sürekli – Bu hareketler tanındıkları sürece tetiklenir.
Hareket tanıyıcıları aşağıdaki durumlardan birinde bulunur:
- Olası – Bu, tüm hareket tanıyıcılarının ilk durumudur. Bu, State özelliğinin varsayılan değeridir.
- Başladı – Sürekli hareket ilk kez tanındığında, durum Began olarak ayarlanır. Bu, abonelerin hareket tanımanın ne zaman başlayacağı ve ne zaman değiştirildiği arasında ayrım yapmasına olanak tanır.
- Değiştirildi – Sürekli bir hareket başladıktan ancak tamamlanmadıktan sonra, harekette beklenen parametreler içinde olduğu sürece, dokunma her hareketinde veya değiştiğinde durum Değiştirildi olarak ayarlanır.
- İptal edildi – Bu durum, tanıyıcı Began'dan Değiştirildi'ye geçtiğinde ayarlanır ve dokunmalar artık hareketin desenine uymayacak şekilde değişir.
- Tanınan – Durum, hareket tanıyıcı bir dokunma kümesiyle eşleştiğinde ayarlanır ve aboneye hareketin bittiğini bildirir.
- Sona erdi – Bu, Tanınan durum için bir diğer addır.
- Başarısız – Hareket tanıyıcı artık dinlediği dokunuşlarla eşleşemediğinde durum Başarısız olarak değiştirilir.
Xamarin.iOS, numaralandırmadaki UIGestureRecognizerState bu değerleri temsil eder.
Birden Çok Hareketle Çalışma
Varsayılan olarak, iOS varsayılan hareketlerin aynı anda çalışmasına izin vermez. Bunun yerine, her hareket tanıyıcısı dokunma olaylarını belirleyici olmayan bir sırada alır. Aşağıdaki kod parçacığında bir hareket tanıyıcısının aynı anda nasıl çalıştırıldığı gösterilmiştir:
gesture.ShouldRecognizeSimultaneously += (UIGestureRecognizer r) => { return true; };
iOS'ta bir hareketi devre dışı bırakmak da mümkündür. Bir hareket tanıyıcısının, bir hareketin nasıl ve nasıl tanınması gerektiğine karar vermek için uygulamanın durumunu ve geçerli dokunma olaylarını incelemesine olanak tanıyan iki temsilci özelliği vardır. İki olay şunlardır:
- ShouldReceiveTouch – Bu temsilci, hareket tanıyıcıya dokunma olayı geçirilmeden hemen önce çağrılır ve dokunmaları inceleme ve hareket tanıyıcı tarafından hangi dokunmaların işleneceğini belirleme fırsatı sunar.
- ShouldBegin : Bu, bir tanıyıcı Durumu Mümkün olan başka bir duruma değiştirmeye çalıştığında çağrılır. False döndürülürken hareket tanıyıcısının durumu Başarısız olarak değiştirilecek şekilde zorlanır.
Aşağıdaki kod parçacığında gösterildiği gibi, bu yöntemleri kesin olarak belirlenmiş UIGestureRecognizerDelegate, zayıf bir temsilciyle geçersiz kılabilir veya olay işleyicisi söz dizimi aracılığıyla bağlayabilirsiniz:
gesture.ShouldReceiveTouch += (UIGestureRecognizer r, UITouch t) => { return true; };
Son olarak, yalnızca başka bir hareket tanıyıcı başarısız olursa başarılı olması için bir hareket tanıyıcısını kuyruğa almak mümkündür. Örneğin, tek dokunma hareketi tanıyıcısı yalnızca bir çift dokunma hareketi tanıyıcısı başarısız olduğunda başarılı olmalıdır. Aşağıdaki kod parçacığı bunun bir örneğini sağlar:
singleTapGesture.RequireGestureRecognizerToFail(doubleTapGesture);
Özel Hareket Oluşturma
iOS bazı varsayılan hareket tanıyıcıları sağlasa da, belirli durumlarda özel hareket tanıyıcıları oluşturmak gerekebilir. Özel hareket tanıyıcı oluşturma işlemi aşağıdaki adımları içerir:
- Alt sınıfı
UIGestureRecognizer. - Uygun dokunma olayı yöntemlerini geçersiz kılın.
- Temel sınıfın State özelliği aracılığıyla tanıma durumunu kabartır.
Bunun pratik bir örneği, iOS'ta Dokunmayı Kullanma kılavuzunda ele alınacaktır.

