Apple TV(tvOS) Uygulaması Geliştirme İpuçları #Focus Engine(Odak Motoru) ve DidUpdateFocus Fonksiyonu

Burak Erarslan
Appcent
Published in
3 min readJun 9, 2021

Merhabalar, Apple TV için uygulama geliştirme konusunda Türkçe kaynağın kısıtlı olması sebebiyle deneyimlerimi sizlerle paylaşmak istedim. iOS uygulaması geliştirme tecrübesi bulunan arkadaşların rahatlıkla tvOS uygulaması geliştirebilmesini hedeflediğim bu yolda 2–3 yazılık bir seri ile tvOS uygulaması geliştirirken kullandığımız fonksiyonları ve püf noktaları sizlerle paylaşmayı planlıyorum. Umarım faydalı bir yazı serisi olur. İsterseniz önce Apple TV ve tvOS’a biraz yakından bakalım.

Apple TV ve tvOS

4. nesil Apple TV

İlk Apple TV’nin piyasaya sürülmesi 2007 yılına dayansada tvOS işletim sistemine sahip Apple TV ile bu tarihten çok sonra tanıştık.

9 Ocak 2007 tarihinde hayatımıza giren 1. nesil Apple TV, Apple TV Software adı verilen Mac OS X 10.4 Tiger’ın özelleştirilmiş bir versiyonu kullanılıyordu.

1 Eylül 2010 tarihinde 2. nesil, 7 Mart 2012 tarihinde 3. nesil Apple TV modelleri ile tanıştık. Bu modellerde iOS işletim sisteminin (iOS 4 — iOS 8 arasında) Apple TV için özeleştirilmiş bir versiyonu kullanılıyordu.

9 Eylül 2015 tarihine geldiğimizde ise iOS 9 ile birlikte hayatımıza 4. nesil Apple TV ve tvOS işletim sistemide girdi.

tvOS, 4. nesil ve daha sonraki Apple TV modellerinde kullanılmak üzere Apple tarafından geliştirilen ve belirli aralıklarla güncellenen bir işletim sistemidir. Apple’ın 9 Eylül 2015 tarihindeki ‘Apple Özel Etkinliğinde’ 4. nesil Apple TV ile birlikte tanıtılmıştır. Apple 26 Ekim 2015 tarihinde 4. nesil Apple TV ön siparişlerini almaya, bu tarihten 1 hafta sonra da ürünlerin gönderimlerine başlamıştır. Günümüzde Apple TV 2 farklı model olarak kullanıcılara sunuluyor.

  1. Apple TV HD
  2. Apple TV 4K

Apple TV modellerini buradan inceleyebilirsiniz.

tvOS, iOS temelinde geliştirilen bir işletim sistemi olması sebebiyle tvOS uygulaması geliştirmenin iOS uygulaması geliştirmekten çok farkı olmamakla birlikte iOS tarafında kullanmadığımız bazı fonksiyonlar burada çok büyük öneme sahip oluyor. Bunun sebebi ise şüphesiz ki kullanıcıların uygulama ile etkileşime geçme şeklinden kaynaklanıyor.

iPhone ve iPad(iOS işletim sistemine sahip herhangi bir cihaz)’de kullanıcı ekrana dokunduğunda dokunduğu noktanın yerini, boyunu, hareketini ve kuvvetini temsil eden bir UITouch objesi oluşturulur. Üstelik bu cihazlar birden fazla noktayı bile algılayabilme özelliğine sahiptir.

Apple TV ile etkileşime geçmek için ise Siri Remote veya Apple TV Remote kullanılmalıdır. Ekranda sürekli bir view odak durumundadır ve aynı anda birden fazla view’e odaklanamazsınız.

Odaklanabilir UIKit alt sınıfları aşağıdaki gibidir.

UIButton
UITextField
UITableView
UICollectionView
UITextView
UISegmentedController
UISearchbar

Focus Engine(Odak Motoru) Nedir ?

Uygulama içerisindeki odak ve odak hareketlerinin tamamını Focus Engine(Odak Motoru) kontrol eder. Kullanıcının Siri Remote veya Apple TV Remote ile yapacağı hareketleri dinler ve kullanıcının etkileşimi doğrultusunda odağın hangi view’e taşınacağını belirler ve bu konuda uygulamayı bilgilendirir.

Focus Engine bunların yanında bize kullanıcı deneyimide sağlar. View’lerin odak efektlerini özelleştirebilir, her view için farklı bir odak efekti yapabilir ve kullanıcının uygulama ile etkileşiminde odağı manuel olarak güncelleyebiliriz.

UIButton Objesi için Sitem Tarafından Tanımlanmış Odak Efekti
  • Odak Güncellemesini Yakalama ve Özelleştirme #DidUpdateFocus
func didUpdateFocus(in context: UIFocusUpdateContext, 
with coordinator: UIFocusAnimationCoordinator)

Kullanıcının etkileşimini yakalayıp uygulamaya odak güncellemesi yapılıp yapılmayacağını geri bildirim olarak bildiren fonksiyondur. Bu sebeple yazdığımız sınıfların çoğunda bulunur.

Custom bir UIButton subclass’ı oluşturalım ve odağın buttonlardan birinde olması ve olmaması durumunda buttonların davranış şekillerini belirleyecek özelliklerini burada tanımlayalım. Bu değişiklikleri storyboard üzerinden kontrol edebilmek için değişkenleri IBInspectable olarak tanımladım.

Kullanıcı Uygulama ile Etkileşime geçtiğinde DidUpdateFocus Fonksiyonu çalışacak nextFocusedView veya PreviouslyFocusedView Objeleri Bu Sınıfa Ait İse updateNextFocusedView ve updatePreviouslyFocusedView Fonksiyonlar ile görünümleri güncellenecek

Artık storyboard üzerinden her button için gerekli özelliklerin tanımlamasını yapabiliriz.

Buttonları CustomFocusButton Olarak Tanımlıyor ve Type Değerini Custom Yapıyoruz
Her Button İçin Farklı Odak Değerleri Ayarlıyoruz

Sonuç:

Uygulamayı Çalıştırdığımızda Her Button İçin Scale Oranı Border Rengi ve genişliği Arkaplan ve Title renklerinin farklı olduğunu gözlemleyebiliriz

Bir sonraki yazıda görüşmek üzere.. 👋

--

--