Çoğu uygulamada, belirli bir süre işlem yapılmadığında oturumunuzu otomatik olarak kapatan bir özellik bulunur. Ancak bu uygulamalardan bazıları API'nin etkin olmaması nedeniyle oturumunuzu kapatırken, diğerleri UIView kontrollerini geçersiz kılarak bir oturum kapatma zamanlayıcısı uygular. Bu makalede hitTest yöntemini kullanarak bu davranışı gerçekleştirmenin daha iyi bir yolunu araştıracağız. Ve bazı uygulamalar, son giriş / API çağrısı ile geçerli saat arasındaki zaman farkına bağlı olarak oturumunuzu kapatır. Son yaklaşımdaki sorun, bir cihazdaki zamanınızı giriş zaman noktasına manuel olarak ayarlayarak oturumunuzu sürekli canlı tutabilmenizdir.
İlk yaklaşımdaki sorun, bazı kullanıcıların yalnızca içerikte gezinirken ve arka uca herhangi bir istekte bulunmasalar bile oturumlarının kapatılabilmesidir. Bir kullanıcının belirli bir bankacılık ürününü açmadan önce hüküm ve koşullarını okuduğunu ve çıkış yaptığını düşünün. Kesinlikle bunun önüne geçmek istiyoruz.
İkinci yaklaşımın sorunu, özellikle uygulamanın özel görünümlere sahip geniş bir kod tabanına sahip olması durumunda, etkin olmayan oturum kapatma özelliğini mevcut bir kod tabanında uygulamanın zor olabilmesidir.
HitTest yönteminin çok yardımcı olabileceği yer burasıdır.
Listelenen sorunların üstesinden gelmek için hitTest yöntemiyle hack kullanabiliriz.
Kullanıcı etkinliği süresini izlemekten sorumlu bir sınıfın uygulanmış bir sürümüne zaten sahip olduğumuzu varsayalım.
Bunu aşağıdaki API ile ifade edeceğiz:
protocol IUserActivity { func resetInactiveTime() }
extension UIWindow { open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { userActivity.resetInactiveTime() return super.hitTest(point, with: event) } }
Ve bu kadar! Artık bu yöntem, kullanıcının ekranda bantlama, kaydırma ve diğer hareket etkinlikleri gibi yaptığı her etkileşimli etkinlikte tetiklenecek.
Ayrıca bir UIWindow'un alt sınıfını bildirebilir ve buradaki hitTest yöntemini geçersiz kılabilirsiniz.
iOS'taki dokunma etkinlikleri genellikle kullanıcının aygıtın dokunmatik ekranıyla olan etkileşimlerinden kaynaklanır.
Kullanıcı ekrana dokunduğunda, donanım dokunuşu algılar ve dokunmanın konumu, basıncı ve süresi gibi bilgileri içeren bir ham dokunma verisi akışı oluşturur.
Bu ham dokunma verileri daha sonra işletim sistemi tarafından işleniyor ve UIKit tarafından yönetilebilecek üst düzey dokunma olaylarına dönüştürülüyor. İşletim sistemi, dokunma konumu ve görünüm hiyerarşisine bağlı olarak dokunma olayının hangi UIWindow nesnesine karşılık geldiğini belirler ve ardından dokunma olayını işlenmek üzere o nesnenin UIResponder nesnesine gönderir.
Bir dokunma olayı meydana geldiğinde iOS işletim sistemi, dokunma olayının hangi UIView veya UIWindow nesnesine karşılık geldiğini belirlemek için bir isabet testi algoritması kullanır.
İsabet testi algoritması, üst düzey UIWindow nesnesinden başlar ve temas noktasını içeren en derin görünümü bulana kadar görünüm hiyerarşisindeki her alt görünümü yinelemeli olarak kontrol eder. Bunu, temas noktasının her bir alt görünümün çerçevesi içinde olup olmadığını kontrol ederek yapar.
İsabet testi, derinlik öncelikli ters ön sipariş geçiş algoritmasını kullanır. Başka bir deyişle, algoritma önce kök düğümü ziyaret eder ve ardından onun alt ağaçlarını yüksek dizinlerden alt dizinlere doğru geçer.
Bu tür bir geçiş, geçiş yinelemelerinin sayısını azaltmaya ve temas noktasını içeren ilk en derin alt görünüm bulunduğunda arama sürecini durdurmaya olanak tanır.
Bu, bir alt görünümün her zaman kendi denetiminin önünde oluşturulduğu ve bir kardeş görünümün her zaman kardeş görünümlerinin önünde, alt görünümler dizisine daha düşük bir indeksle işlendiği için mümkündür. Birden çok örtüşen görünüm belirli bir nokta içerdiğinde, en sağdaki alt ağaçtaki en derin görünüm, en öndeki görünüm olacaktır (1) .
Görebildiğimiz gibi, kullanıcının hangi görünüm veya kontrolle etkileşime girdiğine bakılmaksızın, geçiş algoritması her zaman UIWindow nesnesinden başlar.
Ve kesinlikle bu olayları UIWindow sınıfının hitTest yönteminde yakalayarak amacımız için kullanabiliriz!
Bu kadar! Aşağıdaki yorumlarda ne düşündüğünüzü bana bildirin.