Self Sizing Container Views With View Controllers

Bu yazıda Container View objesinin içeriğine göre kendi boyutunu ayarlamasını öğreneceksiniz.

Bir View Controller ın sorumluluklarını farklı alt kümelere ayırmak istediğimiz zaman Container View bize çok yardımcı olabiliyor. Yapılacak benzer işleri aynı Container View Controller içerisinde toplayarak ana View Controller ı daha sade bir hale getirebiliyoruz.

Problem

Bu işlemi yaparken muhtemelen Container View objesi için bir uzunluk (height) constraint i vermek durumunda kalacaksınız. Peki ya oluşturduğunuz Sub View Controller Container View için belirttiğiniz uzunluktan daha kısa veya daha uzun bir içerik üretebiliyorsa?

Bu durumda elimizle fix olarak belirttiğimiz uzunluk işe yaramayacaktır.

Bu nedenle oluşturduğumuz Container View objeleri kendi uzunluğunu içinde barındırmış olduğu nesnelerin toplam uzunluğuna göre otomatik olarak ayarlaması gerekiyor.

Yani child konumundaki nesneler parent konumundaki Container View nesnesinin uzunluğunu otomatik olarak beslemeli.

Çözüm

Mantığımız şu olacak: Container View objesi uzunluğunu hiçbir zaman dikte etmeyecek; onun içerisindeki nesneler kapladıkları alan kadar genişleyecek ve Container View objesi buna izin verecek. Böylelikle Self Sizing Container Views konseptini uygulamış olacağız.

Şekildeki gibi Container View objesinin uzunluğuna elimizle 200 (veya başka bir değer) verirsek Container View objemiz her zaman bu değerde kalacak çünkü bu constraint in varsayılan olan priority si 1000.

Şimdi lütfen height constraint i seçip prority 250 (low) yapın.

Yaptıktan sonra ilgili constraint in önceliğinin azalmış olduğunu göreceksiniz:

 

Bu şu anlama geliyor: “Benim uzunluğum 200 birim ama bu konuda ısrarcı değilim. Benden daha güçlü bir constraint varsa beni ezebilir.”

Son olarak da Container View i yöneten View Controller sınıfının viewDidLoad() metoduna gidip şu kodu yazmamız gerekiyor:

Bu kodu yazarak View Controller ın yönetmiş olduğu view in sınırlarını root view controller pozisyonunda bulunan Container View değil; View Controller sınıfının kendisi belirleyecek diyoruz.

Normal şartlarda translatesAutoresizingMaskIntoConstraints özelliği true olarak seçilidir. Yani view in frame ini parent ı belirler. Biz bunun tam tersini istiyoruz. Bu nedenle false yaptık.

Önemli Not

View Controller ın kendi büyüklüğünü kendisinin ayarlayacağını belirttik fakat View Controller ın yönetmiş olduğu self.view içerisinde bulunan nesneler birbirlerine kaç birim mesafede durması gerektiğini bilmesi gerek. Eğer self.view kendisini ne kadar genişleteceğini bilmezse parent ı olan Container View i ne kadar genişleteceğini de bilemez, öyle değil mi?

Bu konuyu Self Sizing TableViewCell yazısında ele almıştım. Dilerseniz göz atabilirsiniz.

Sonuç

Sonuç olarak Self Sizing Container Views oluşturmak için 3 şeye ihtiyacımız olduğunu öğrendik:

  • Container View height constraint i 250 (low) olmalı,
  • View Controller ın ihtiva ettiği self.view objesi frame ini kendi oluşturmalı.
  • self.view objesinde bulunan diğer alt nesneler birbirlerine ne kadar uzaklıkta duracağını bilmeli.