Membangun Antarmuka Pengguna yang Adaptif di Aplikasi iOS dengan Auto Layout

Membangun Tampilan iOS yang Adaptif dengan Auto Layout

Halo, semuanya! Pada blog ini, kita akan membahas bagaimana cara membangun user-interface (UI) yang adaptif di aplikasi iOS. Ini seperti membangun tampilan responsif pada pengembangan web. Auto Layout memungkinkan pengembang membangun UI yang adaptif di berbagai ukuran device.

Pada awalnya, pengembang aplikasi iOS hanya perlu memikirkan bagaimana menyusun UI  pada device iPhone berukuran 3.5 inci dalam mode portrait dan landscape. Seiring berkembanganya teknologi Apple maka semakin bervariasi pula ukuran device iPhone. Selain itu, Apple juga merilis iPad yang tentu saja memiliki ukuran lebih besar. Hal ini membuat para pengembang perlu memikirkan bagaimana tampilan UI yang mereka bangun di berbagai device dengan berbagai ukuran.

Berikut daftar device Apple dengan jenis dan ukurannya:

💻 Mulai Belajar Pemrograman

Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.

Daftar Sekarang
  • iPhone 4/4s (3.5-inch)
  • iPhone 5/5c/5s (4-inch)
  • iPhone 6/6s/7/8/SE (4.7-inch)
  • iPhone 6/6s/7/8 Plus (5.5-inch)
  • iPhone X/XS/11 Pro (5.8-inch)
  • iPhone XR/11/12/12 Pro/13 Pro/14 Pro/15 Pro (6.1-inch)
  • iPhone 16 Pro (6.3-inch)
  • iPhone XS Max/11 Pro Max (6.5-inch)
  • iPhone 12 Pro Max/13 Pro Max/14 Pro Max/15 Pro Max (6.7-inch) 
  • iPhone 16 Pro Max (6.9-inch)
  • iPad (9.7-inch)
  • iPad Mini (7.9-inch)
  • iPad Pro (10.5/12.9-inch)

Membuat Xcode Project

Oke, langsung saja! Buatlah proyek Xcode project dengan Create New Project. Pilih menu iOS kemudian pilih opsi App.

Memilih Template

Beri nama project AdaptiveUIExample. Pastikan Interface-nya adalah Storyboard

Memilih Storyboard sebagai Interface

Setelah itu klik Next. Lalu, akan muncul dialog untuk menyimpan berkas project ini. Kamu bisa menyimpannya di mana pun. Setelah itu klik tombol Create.

Kemudian, klik berkas Main.storyboard. Maka akan ditampilkan Interface Builder. Di dalamnya terdapat View Controller Scene. Tampilannya akan seperti ini.

Interface Builder di Xcode

Berikut tampilan yang akan kita buat.

Tampilan yang akan dibuat

Dari gambar, dapat dilihat bahwa pada orientasi portrait, halaman akan menampilkan konten:

  1. Gambar yang memiliki tinggi sekitar 55% dari tinggi layar.
  2. Informasi judul, tanggal rilis, dan deskripsi yang menempati sisa ruang yang berada di bawah gambar.

Sementara pada orientasi landscape, halaman akan menampilkan konten yang sama, tetapi berbeda dalam penyusunannya.

  1. Gambar memiliki lebar 50% dari lebar layar.
  2. Informasi judul, tanggal rilis, dan deskripsi menempati sisa ruang yang berada di samping kanan gambar.

Menyusun UI untuk Orientasi Portrait dengan Auto Layout

Sebelum menyusun UI, pastikan kamu memilih iPhone 15 Pro sebagai device.

Mengganti Device menjadi iPhone 15 Pro

Selanjutnya, klik tombol + atau Show Library untuk menampilkan Object Library. Kemudian pilih objek Image View dan seret atau drag object tersebut ke dalam View yang berada di View Controller.

Menambahkan Image View dari Object Library

Atur ukuran dan posisi Image View hingga kira-kira seperti ini.

Menambahkan Image View ke dalam View

Sekarang saatnya untuk menambahkan spacing constraint. Klik tombol Add New Constraint di bawah dan berikan nilai 0 untuk top, left, dan right.

Menambahkan spacing constraint untuk Image View

Agar Image View memiliki tinggi sebesar 55% dari tinggi layar, maka kita harus mengatur tingginya menjadi Equal Height terhadap View yang menampungnya (container view).

Pilih Image View pada Document Outline, kemudian tekan tombol control di keyboard lalu seret (control-drag) dan arahkan ke object View. Setelah itu akan muncul pop-up menu, pilihlah Equal Height.

Menambahkan constraint Equal Height

Pindah ke menu Size Inspector (ada di sisi kanan Xcode). Edit constraint Proportional Height To.

Menampilkan daftar constraint melalui Size Inspector

Ubah nilai Multiplier menjadi 0.55. Ini akan membuat ukuran Image View menjadi 55% dari ukuran layar atau container view-nya.

Mengubah Equal Height constraint

Tampilan Image View akan seperti ini dan pastikan constraint-nya seperti ini juga ya.

Daftar constraints pada Image View 

Selanjutnya kita akan menambahkan label-label yang merupakan judul, tanggal rilis, dan deskripsi. Sebelum itu, karena nantinya tampilan ini akan berbeda pada orientasi layar yang berbeda, akan lebih baik jika label-label ini ditampung di dalam suatu View.

Klik tombol + atau Show Library kemudian ketik “View” pada kolom pencarian. Object View yang kita cari tidak ditampilkan di paling atas. Scroll ke bawah pada hasil pencarian di Object Library sampai menemukan object View. Drag atau seret object View ke Document Outline sehingga posisi View tersebut berada di bawah object Image View.

Menambahkan object View

Susunan Image View dan View akan seperti ini.

View yang baru ditambahkan berada di bawah Image View

Tambahkan constraint dengan nilai 0 untuk top, left, right, dan bottom.

Menambahkan spacing constraint untuk View

Gantilah nama View ini menjadi Game Info. Di Document Outline, pilih object View tersebut kemudian tekan tombol “return” di keyboard dan ganti namanya menjadi Game Info. Ke depannya kita akan menyebutnya sebagai Game Info.

Mengubah nama View menjadi Game View

Selanjutnya, kita akan menambahkan object Label ke dalam Game Info. Terdapat 4 object Label yang akan kita tambahkan. 

Contoh Label yang akan ditambahkan

Untuk menambahkan object baru, lakukanlah langkah-langkah yang telah kita lakukan sebelumnya. 

Tambahkan object Label untuk menampung informasi judul. Pastikan object Label ini berada di dalam object Game Info. Pindah ke Attributes Inspector (ada di sisi kanan Xcode) dan ubah teks “Label” menjadi “Portal”. Kemudian ubah nilai Font menjadi Title 1.

Menambahkan object Label dan mengubah nilai atributnya

Pilih Label Portal dan klik Add new constraint. Atur dengan nilai top, left, dan right sebesar 15. Pastikan untuk tidak memilih Constraint to margins.

Menambahkan spacing constraint untuk Label judul

Selanjutnya tambahkan kembali dua object Label. Satu sebagai label “Released:” dan satu lagi untuk menampung informasi tanggal rilis. Pastikan object Label ini berada di dalam object Game Info. Pada bagian Attributes Inspector, ubah salah satu teks Label menjadi “Released:”. Kemudian pilih Label lainnya dan ubah teksnya menjadi “October 9, 2007”.

Pilih Label “Released:” dan posisikan agar berada di bawah Label “Portal”. Kemudian tekan tombol Add new constraint. Atur dengan nilai top dan left sebesar 15 sehingga tampilan dan constraint-nya seperti ini.

Daftar spacing constraint pada Label “Released:”

Selanjutnya, pilih Label “October 9, 2007”. Posisikan Label tersebut agar berada di bawah Label “Portal” dan di sebelah kanan Label “Released:”. Kemudian tekan tombol Add new constraint. Atur dengan nilai top dan right sebesar 15 dan nilai left dengan 10

Menambahkan spacing constraint untuk Label tanggal rilis

Sehingga tampilan dan constraint-nya seperti ini.

Daftar constraint Label tanggal rilis

Constraint yang ditambahkan bergaris merah, artinya ada layout issues. Layout issues terjadi ketika ada constraint yang ambigu. Pada kasus ini, kita harus menentukan Label mana yang harus mempertahankan ukuran aslinya (intrinsic size). Kita akan memilih Label “Released:” yang mempertahankan ukuran aslinya karena teks atau konten pada Label ini tidak akan berubah. Kita tambahkan nilai Horizontal pada Content Hugging Priority dari 251 menjadi 252. Semakin besar nilai Content Hugging Priority, semakin besar pula ketahanan suatu object untuk mempertahankan ukuran aslinya. Penjelasan lebih lanjut tentang Content Hugging akan diberikan di bawah.

Mengubah nilai Horizontal pada Content Hugging Priority

Selanjutnya, tambahkan object Label terakhir untuk menampung informasi deskripsi. Pastikan object ini berada di dalam Game Info. Pindah ke Attributes Inspector dan ubah teks “Label” menjadi “Every single time you click your mouse while holding a gun, you expect bullets to fly and enemies to fall. But here you will try out the FPS game filled with environmental puzzles and engaging story.”. Masih di Attributes Inspector, atur nilai Lines menjadi 0.

Mengubah nilai atribut Label deskripsi

Pilih Label deskripsi tersebut dan posisikan agar berada di bawah label “Released:” dan  “October 9, 2007” kemudian klik Add new constraint. Atur dengan nilai top, left, right, dan bottom sebesar 15. Pastikan untuk uncheck Constraint to margins.

Menambahkan spacing constraint untuk Label deskripsi

Jika sebelumnya ada layout issue pada Content Hugging Horizontal, sekarang ada layout issue pada Content Hugging Vertical.

Layout issues pada Label deskripsi

Kita akan menetapkan agar tinggi Label deskripsi ini dapat fleksibel sehingga ia tidak perlu mempertahankan ukuran aslinya. Maka dari itu, kita akan menurunkan nilai Content Hugging Vertical-nya dari 251 menjadi 250.

Mengubah nilai Vertical pada Content Hugging Priority

Nice! Kita sudah memperbaiki layout issues. Selanjutnya, kita mau agar teks deskripsi tepat berada di bawah label tanggal rilis. Namun, hal ini tidak terjadi karena kita memberikan spacing constraint dengan nilai yang sama pada top dan bottom yaitu sebesar 15. Hal ini membuat label tersebut membesar sehingga konten yang berada di dalamnya terlihat seperti berada di tengah.

Cara untuk menyelesaikan ini adalah dengan mengubah constraint bottom yang sebelumnya “sebesar15, diubah menjadi “setidaknya15. Dengan ini kita mengubah operator sama dengan (=) menjadi lebih dari sama dengan (≥).

Pilih Label deskripsi, kemudian pada Size Inspector pilih constraint bottom yaitu Bottom Space To. Klik tombol Edit, ketika muncul pop up, ubah tanda sama dengan (=) menjadi lebih dari sama dengan (≥).

Mengubah relasi spacing constraint bottom

Nice! Namun, jika Device diubah menjadi iPhone SE (1st generation), kita akan mendapati layout issues seperti berikut.

Layout issues pada perangkat iPhone SE (1st generation)

Lagi-lagi hal ini terjadi karena constraint yang masih ambigu dan kita harus memilih object mana yang harus menyusut atau terpotong ketika ada batasan ruang. Karena kita mau Label deskripsi yang fleksibel, nilai dari Vertical Compression Resistance untuk Label deskripsi perlu dikurangi.

Pilih Label deskripsi, kemudian pada Size Inspector pilih ubah nilai Vertical pada Content Compression Resistance Priority dari 750 menjadi 749. Semakin besar nilai Content Compression Resistance Priority, semakin besar pula ketahanan suatu object untuk mempertahankan ukuran aslinya ketika ruang layout menjadi lebih kecil dari ukuran yang diinginkan. Penjelasan lebih lanjut tentang Content Compression akan diberikan di bawah. 

Mengubah nilai Vertical pada Content Compressio Resistance

Keren! Sejauh ini kita sudah membangun UI yang adaptif dengan Auto Layout.

Sekilas tentang Content Hugging

Content hugging pada iOS adalah konsep dalam pengaturan tampilan (UI) yang menentukan seberapa “ketat” tampilan sebuah elemen (seperti label atau tombol) ingin mempertahankan ukurannya sendiri agar tidak diperluas oleh tata letak di sekitarnya.

Sederhananya, content hugging berfungsi seperti sebuah “pelukan” pada isi elemen. Misalnya, jika kamu memiliki label dengan teks “Halo”, content hugging menentukan seberapa besar label itu akan mempertahankan ukurannya hanya cukup untuk memuat kata “Halo”, dan tidak akan membiarkan ukurannya membesar jika tidak perlu.

Kamu bisa mengatur content hugging priority. Semakin tinggi nilainya, semakin kuat elemen tersebut menolak diperbesar ukurannya lebih dari yang diperlukan untuk menampilkan isinya.

Sekilas tentang Content Compression Resistance

Content compression pada iOS adalah kebalikan dari content hugging. Ini menentukan seberapa “rela” tampilan sebuah elemen (seperti label atau tombol) menyusut atau mengompres ukurannya ketika ada batasan ruang, sehingga isi elemen tersebut mungkin akan terpotong atau menjadi terlalu sempit.

Sederhananya, jika content hugging menjaga elemen agar tidak membesar, content compression menjaga elemen agar tidak menyusut terlalu banyak. Dengan pengaturan content compression resistance priority, kamu bisa menentukan prioritas seberapa besar tampilan elemen akan melawan untuk tidak dipaksa mengecil. Semakin tinggi prioritasnya, semakin besar kemauan elemen untuk mempertahankan ukurannya dan tidak menyusut, meskipun ada batasan ruang yang ketat.

Ada istilah menarik dari Keith Harrison dalam bukunya yang berjudul Modern Auto Layout.

  • Content-Hugging dapat diibaratkan sebagai “Don’t Stretch Me
  • Compression-Resistance dapat diibaratkan sebagai “Don’t Squeeze Me

Menyusun UI untuk Orientasi Landscape dengan Size Class

Sebenarnya dengan teknik Auto Layout sebelumnya sudah cukup untuk membuat tampilan yang adaptif. Namun, untuk menyempurnakan tampilan UI pada mode landscape, kita dapat memanfaatkan Size Class.

Berikut tampilan landscape yang akan kita buat.

Tampilan landscape yang akan dibuat

Langkah pertama yang harus dilakukan adalah dengan mendaftarkan constraint yang telah kita tambahkan sebelumnya ke dalam Size Class untuk portrait yaitu Height Compact. Pastikan kamu memilih iPhone 15 Pro sebagai Device.

Buka Document Outline, pilih seluruh constraints yang telah ditambahkan sebelumya. Kamu bisa men-select constraint tersebut sambil menekan tombol Command.

Memilih constraints di Document Outline

Kemudian, buka Size Inspector. Klik tanda + yang berada di sebelah opsi Installed

Tanda + di sebelah opsi Installed

Setelah itu, akan muncul pop-up menu. Pilih Width dengan nilai Any dan Height dengan nilai Regular kemudian klik Add Variation.

Pop-up menu

Setelah kamu menambahkan variasi, uncheck opsi Installed dan check opsi Installed pada hR.

Mencentang opsi Installed pada hR

Untuk memastikan bahwa constraints tersebut hanya terpasang pada orientasi portrait, kamu bisa mengubah orientasi device-nya menjadi landscape dengan mengklik tombol Orientation.

Merubah orientasi device

Dan jika kita buka Document Outline, constraints tidak lagi berwarna biru, tetapi berwarna abu-abu. Ini berarti constraints tersebut tidak aktif lagi pada orientasi landscape.

Constraints menjadi tidak aktif pada mode landscape

Sekarang saatnya kita menyusun ulang UI untuk orientasi landscape. Pertama, kita ingin Image View memiliki lebar sebesar setengah (50%) dari ukuran layar. Tentu saja untuk Game Info juga memiliki lebar setengah (50%) dari ukuran layar.

Karena beberapa object tidak muncul atau tidak tampil di View Controller, cara paling mudah untuk men-select object tersebut adalah melalui Document Outline. Pilih Game Info dari Document Outline, kemudian ubah posisi x menjadi 393 dan y menjadi 0.

Memindahkan Game Info dengan merubah nilai X-nya

Jika sebelumnya menambahkan spacing constraint melalui tombol Add new constraint,  kini kita menambahkan constraint dengan cara lain yaitu dengan control-drag

Pilih Image View, kemudian control-drag dari Image View ke Safe Area. Pilih constraint Space to Safe Area untuk top, leading (left), dan bottom.

Menambahkan constraints dengan cara control-drag

Buka Size Inspector dan pastikan constraints Image View memiliki nilai 0 pada Align Leading (left), Align Bottom (bottom), dan Align Top (top). Jika nilainya tidak 0, kamu bisa mengubahnya, ya.

Daftar constraints pada Image View

Untuk mengatur lebar dari Image View, kamu bisa melakukan control-drag ke arah View (container). Setelah muncul pop-up menu, pilihlah Equal Width.

Control-drag dari Image View ke View

Buka Size Inspector, Edit constraint Proportional Height To dan ubah nilai Multiplier menjadi 0.5. Ini akan membuat ukuran Image View menjadi 50% atau setengah dari ukuran layar atau container view-nya.

Mengubah Equal Width constraint

Sekarang saatnya mengatur spacing constraint untuk Game Info. Perkecil ukuran Game Info sehingga Game Info benar-benar berada di ruang yang tersisa (tidak bertumpuk dengan Image View).

Mengatur posisi Game Info

Tambahkan spacing constraint dengan mengklik tombol Add new constraint dan berikan nilai 0 untuk seluruh sisi (top, left, right, dan bottom).

Menambahkan spacing constraint untuk Game Info

Selanjutnya, tambahkan spacing constraint pada Label yang tersisa.

  1. Label judul dengan nilai 15 untuk top, left, dan right
  2. Label “Released:” dengan nilai 15 untuk top dan left.
  3. Label tanggal rilis dengan nilai 10 untuk left dan 15 untuk top dan right.
  4. Label deskripsi dengan nilai 15 untuk seluruh sisi yaitu top, left, right, dan bottom. Jangan lupa untuk mengubah tanda sama dengan (=) menjadi lebih dari sama dengan (≥) pada constraint bottom.

Sehingga hasil akhirnya sebagai berikut.

Tampilan setelah penambahan constraint untuk mode landscape 

Kita sudah berhasil menambahkan constraints untuk mode landscape, kini saatnya untuk mendaftarkan constraints tersebut pada Size Class Regular width.

Pilih seluruh constraints yang aktif (berwarna biru) pada Document Outline.

Memilih constraints di Document Outline

Kemudian buka Size Inspector. Klik tanda + yang berada di sebelah opsi Installed

Tanda + di sebelah opsi Installed

Setelah itu, akan muncul pop-up menu. Pilih Width dengan nilai Any dan Height dengan nilai Compact kemudian klik Add Variation.

Pop-up menu

Setelah kamu menambahkan variasi, uncheck opsi Installed dan check opsi Installed pada hC.

Mencentang opsi Installed pada hC

Berikut tampilannya portrait dan landscape.

Tampilan pada mode portrait dan landscape

Tapi sepertinya ukurannya tidak sesuai dengan apa yang kita inginkan sebelumnya. Pada mode portrait, ukuran gambar sepertinya bukan 55% dan pada mode portrait sangat jelas bahwa ukurannya tidak 50%.Tampilan tidak sesuai ekspektasi

Sedikit Perbaikan Layout

Ukuran gambar yang tidak sesuai dengan yang kita harapkan terjadi karena kita sebelumnya mengatur nilai Equal Height dan Equal Width terhadap View.

Keliru dalam mengatur Equal Width dan Equal Height

Seharusnya kita mengatur nilai Equal Height dan Equal Width terhadap Safe Area

Untuk mengubah constraint Equal Height yang sebelumnya sudah kita tambahkan, buka Document Outline. Buka Constraints. Kemudian cari constraint yang memiliki angka 0.55.

Mencari constraint Equal Height

Pilih constraint tersebut kemudian pindah ke Size Inspector. Ubah nilai properti Second Item yang sebelumnya Superview.Height menjadi Safe Area.

Mengubah Second Item menjadi Safe Area

Selanjutnya, untuk mengubah constraint Equal Width, buka Document Outline. Buka Constraints. Kemudian cari constraint yang memiliki angka 0.5.

Mencari constraint Equal Width

Pilih constraint tersebut kemudian pindah ke Size Inspector. Ubah nilai properti Second Item yang sebelumnya Superview.Width menjadi Safe Area.

Mengubah Second Item menjadi Safe Area

Tampilan sudah diperbaiki! Jika kita lihat menggunakan preview, UI akan tampil dengan sangat baik.

Tampilan akhir

Keren! Kita sudah mempelajari bagaimana menyusun UI dengan Auto Layout dan menyempurnakannya dengan Size Class.

Oh ya. Gambar poster Portal bisa kamu unduh di sini ya. 

Berikut link GitHub project AdaptiveUIExample.

Penutup

Jadi, itulah Auto Layout. Kita dapat membangun UI yang adaptif hanya dengan Auto Layout.  Jika tertarik untuk mempelajari pengembangan aplikasi iOS, kamu dapat belajar di Learning Path iOS dari Dicoding, yaitu iOS Developer. Di dalamnya, kita akan belajar bagaimana cara membangun aplikasi iOS mulai dari tahap pemula hingga mahir..

Jika kamu ingin mulai belajar iOS, telah hadir langganan learning path baru, iOS Developer di Tokopedia Dicoding. Mulai belajar terarah dengan learning path. Kunjungi dicoding.id/iOS 

Sekian artikel kali ini, sampai bertemu di artikel lainnya! Terima kasih.


Belajar Pemrograman Gratis
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.