SwiftUI’da Arayüz Çizim Kuralları

iOS #26Tasarım #7SwiftUI #4

Suat Karakuşoğlu yazdı.

Figure 1: Photo by Judi

İçerik

SwiftUI deklaratif arayüz tasarımında olabilecek en tatlı gramer’i yakalamaya çalışıyor.

SwiftUI’in arkasında temel aldığı çizim dinamiklerini anlamak, uygulamalarımızda daha rahat arayüzler çıkartmamıza yardımcı oluyor.

O nedenle, bu konuyu esas alan, temel olarak Building Custom Views with SwiftUI vidyosunda bahsedilen konuları süzgecimden geçirip biraz derledim.

Temel arayüz sistemleri

Tüm arayüzler genel olarak bir ağaç yapısından oluşur.

Bu ağaç / tree kökünden dallanarak içerisinde diğer görsel arayüzleri barındırır.

Bu dallanmadaki Parent ~ Child ilişkisinde arayüzün nasıl çizileceğine dair kararlar çıkar.

Arayüz Çizim Kuralları

Her büyük hikayede genelde 3 kural/adım olur.

Bu hikayedeki 3 kural ise şöyle:

  • Parent proposes a size for child
    • Baba çocuğu için sen bu alanda barınabilirsin, kendine bir boyut belirle der.
  • Child chooses its own size
    • Çocuk bu alanda ne kadar bir yer kaplayacağını bildirir.
  • Parent places child in parent’s coordinate space
    • Baba ise o boyuttaki çocuğu istediği uygun yere konumlandırır.

View’lerin boyutları

Fixed Size
Boyutun net olarak frame uzerinde verilmesidir.
Intrinsic Size
Text gibi komponentler kendi icerisinde render edecegi text’in boyutu kadar yer talep ederler.
Calculated Size
Image gibi komponentler aspect-ratio’larina göre dinamik boyutlar isteyebilirler.

Adaptive Sizing

Negatif alan dediğimiz boşluk sağlayarak içeriğe nefes aldıran arayüz araçları bağlamın büyüklüğüne göre farklı miktarda olmaları gerekebiliyor.

iPadOS veya iOS boyutlarına göre padding component’i farklı büyüklükte olabiliyor.

[H/V]Stack ve çocukların yer için kapışması

Yatayda ve dikeyde child componentleri sıralayan HStack ve VStack gibi arayüz elemanları mevcut.

Bu container view’lerin içerisinde yerlerini kapmaya çalışan child viewler yerin yetersiz geldiği durumlarda veya yerin büyük olduğu durumlarda içeriye nasıl yayılacaklarına dair karar alabilmek lazım. Bu nedenle LayoutPriority kavramıyla tanışıyoruz.

  HStack {
      Text("Bu bir metin.")
        .font(.largeTitle)
        .border(Color.gray)

      Spacer()

      Text("Bu cok daha oncelikli bir metin")
        .font(.largeTitle)
        .layoutPriority(1) // Burada varsayılan priority 0 iken 1'e çekilmiş.
        .border(Color.gray)
  }

Figure 2: (Sol)LayoutPriority[0] / (Sağ)LayoutPriority[1]

A parent layout offers the child views with the highest layout priority all the space offered to the parent minus the minimum space required for all its lower-priority children.

Parent olan HStack düşük öncelikli arkadaşların yerleşebileceği en ufak yeri buluyor ve onlardan kalan yerin tamamını yüksek öncelikli olan en torpilli view’e sunuyor.

Sonuç olarak

SwiftUI tarafında arayüz çiziminde önemli olan noktalara değindik. Building Custom Views with SwiftUI izlemenizi tavsiye ederim.

Kaynakça