Style ve FlexBox
Last updated
Last updated
CSS'de kullandığımız, display:flex
ile benzer.
Options (Default:Bold)
Description
flexDirection
row,column
(column) seçerseniz elementleri dikey, (row) seçerseniz elementleri yatay sıralar. Bu seçim çok önemli çünkü bizim primary axis 'imiz ne olacak onu belirler. Diğeri secondary axis olur
justifyContent
flex-start, center, flex-end, space-around, space-between
Child elementlerimiz primary axis boyunca Container içinde nasıl dağılsın.
alignItems
flex-start, center, flex-end,stretch
Child elementlerimiz secondary axis boyunca Container içinde nasıl dağılsın.
React Native de style tanımlamalarını, kendi kütüphanesinin içinde bulunan StyleSheet ile yapıyoruz. Bilindik bir obje tanımlaması yapıyoruz aslında. Yukarıdaki örnekte tanımladığımız container objesini aşağıdaki gibi kullanıyoruz.
flex:1 demek içinde bulunduğu componenti enine boyuna %100 kapla demek. En üsteki componente bu değeri verirsek ekranımızın tamamını kaplamış oluruz. Aşağıdaki örneği inceleyelim
Container kartımız flex:1 ve tüm ekranı kaplıyor. Ayrıca flexDirection olarak column almış primary axis dikey.. Böylece child elementler dikey olarak sıralanıyor.
Mavi Kart flex:1, Beyaz Kart flex:3, Kırmızı Kart flex:2 değerlerini almış.
Burada Container componenti primary axis boyunca oransal olarak 6x parçaya bölmüşler. Mavi'ye 1x, Beyaz'a 3x, Kırmızı'ya 2x oranında pay düşmüş. Resimde de bu oranı rahatlıkla görebilirsiniz.
Şimdi yapmak istediğimiz uygulamaya bir göz atalım.
Burada temel container elementimiz ekranı kaplasın, 2 tane de container elementimiz olsun ve telefonun ekranını 1 e 5 oranında paylaşsınlar. Button componentinin pozisyonu fixed olduğundan onu bu durumdan ben ayrı tutuyorum. Aşağıdaki resimde bunu nasıl gerçekleştirdik inceleyebilirsiniz.
TouchableOpacity componentinin style'ı button objesine yazılmış. Pozisyonu fixed olacak demiştik. React Native'de positin:fixed
methodu yok. Onun yerine position özelliğine 'relative'
veya 'absolute'
değerlerini verebilirsiniz. Bilindik left, right, bottom
değerleriyle de ekranın en altına çakılmış durumda. TouchableOpacity gördüğünüz gibi props olarak children kabul ediyor. HTML de ki <button>Ekle</button>
yerine biz burada <Text />
componentini kullanmak zorundayız. Ayrıca TouchableOpacity elementine de flexBox stilleri yazdığımıza dikkat edin. (alignItems
ve justifyContent
)
Şimdi inputContainer'a bir TextInput ekleyelim. TextInput, container'ın en sonunda dursun diye, justifyContent'e 'flex-end' diyelim.
justifyContent primary axis'e etki ediyordu. primary axis, default olarak
flexDirection:'column'
yani dikey. BuradajustifyContent:'flex-end'
demek, child elementi dikey olarak sona at demek.
Şimdi bir de listemize eklemeler yapılınca çoğaltacağımız, ListItem componenti yapalım.
Bu componentte de flexbox'ın nimetlerinden faydalanalım. Flex bir container ımız olsun. Bunun içindeki child componentler merkezi olarak hizalansın. Ancak sağa doğru yaslı duran bir butonumuz olsun.Bu yazılanların kodu şöyle oluşuyor.
Sonra da main componentimiz de aşağıdaki gibi ListItem componentimizi çağıralım
Şimdi ListItem da buttonumuzun props alarak rengini belirleyelim.
Hali hazırda listItemButton isimli bir style'ı var. bu listItemButton objesinde bir backgroundColor tanımı yapılmış. O tanım kalsa bir sorun yaratmaz ama kaldıralım.
Yukarıdaki koda dikkat edin. style propsu bir obje alıyor { }. Bu objenin içine biz array tanımlıyoruz { [ ] }. bu array içine biz istediğimiz kadar style objesi yerleştirebiliriz.{ [ { }, { } ] }
Son olarak şekillediriğimiz ekran bu şekilde olmuş oldu,
Şimdi tam istediğimiz gibi oldu. Kodun tamamı için https://gist.github.com/ysfzrn/a825488f65fabcf6e41ede93a678d83c
Aynı oranı primary axis'miz row olsaydı bu kez şöyle bir layout elde etmiş olacaktık.
Şimdi IOS da da istediğimiz gibi görünüyor mu ona bakalım. Maalesef görünmüyor :( . %90 oranında aynısı da olsa, TextInput ortalıkta yok. Çünkü IOS da height alanı zorunlu. Ve IOS tasarımda genelde materialden farklı olarak, text girişlerinde bir border oluyor. Şimdi textInput'a ios da ayrı, android de ayrı çalışacak şekilde bir style ekleyelim. Bunun için React Native'de Platform isimli bir API var. Bu bizim hangi işletim sistemi kodu çalıştırıyor söyleyecek.