Herkese merhaba bu yazıda Custom TableView UI elemanından bahsedeceğiz yani normal düz bir listview yapısından ziyade daha farklı UI elemanları ekleyebildiğimiz daha zengin bir yapı oluşturabileceğimiz bir yapı. İlk öncelikle ViewController’ımızı TableView’e dönüştürelim bunu yapmak için 2 adet interface’yi sınıfımıza dahil etmeliyiz. O interface’ler şunlar:
- UITableViewDataSource
- UITableViewDelegate
İnterface’leri dahil ederken “,” ile ayırarak direk sınıfımızın arkasına ekliyoruz ve bu interface’leri dahil ettiğimizde bizden 2 adet fonksiyonu ovveride etmemizi istiyor. Bu ovveride ettiğimiz 2 fonksiyon zaten TableView’imizin temel 2 fonksiyonu. Bu fonksiyonlardan biri TableView’de kaç satır olacağını belirlememizi sağlarken diğer fonksiyon TableView içerisine ekleyeceğimiz verileri gösteren fonksiyon. Bunun dışında epey fonksiyon mevcut TableView’imizi daha da özelleştirmek için yazının devamında bu fonksiyonlardan bazılarına da değineceğim. Daha sonra bizim için bir şablon niteliğinde olacak bir tableViewCell sınıfı oluşturacağız TableView satırlarımızın nasıl görüneceğini burada tasarlayacağız ve en son bu hazırladığımız hücreyi TableView’imiz ile ilişkilendireceğiz. Şimdi TableView’imizden başlayalım.
import UIKit class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {//sınıfları implemente ettik var tableView = UITableView()//kullanacağımız tableview var array = ["macbook","ipad","iphone"] var array2 = ["computer","tablet","phone"] var imageArray = [UIImage]() override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .red imageArray.append(UIImage(named: "macbookImg")!)//ilgili resimler ile image array'i dolduruldu imageArray.append(UIImage(named: "tabletImg")!) imageArray.append(UIImage(named:"iphoneImg" )!) tableView = UITableView(frame: UIScreen.main.bounds)//tableview'in tüm ekranı kaplaması sağlandı tableView.delegate = self //burada bir nevi kalıtım yapıyoruz viewController'ımıza tableview özellikleri veriyoruz tableView.dataSource = self tableView.separatorStyle = .none tableView.register(MenuCell.self, forCellReuseIdentifier: "menuId") //buradaki id kısmı önemli aşağıdaki ile aynı olmalı self.view.addSubview(tableView)//tableView'imizi viewController'imiza ekledik } //bu fonksiyonları ovverride ettirdi bize func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {//tableview'imizin kaç satır olacağı return array.count //elimizdeki dizilerden birinin boyutu kadar olsun dedik } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {//hücre içindeki satırlar dolduruluyor let cell = MenuCell(style: UITableViewCellStyle.default, reuseIdentifier: "menuId") //MenuCell sınıfında hücre şablonumuzu elde ediyoruz cell.l1.text = array[indexPath.row]//array dizimizin içindeki verileri tek tek satırlara yazıyoruz cell.l2.text = array2[indexPath.row]//array2 dizimizin içindeki verileri tek tek satırlara yazıyoruz cell.img.image = imageArray[indexPath.row] //resimleri aktarıyoruz return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { //herhangi bir hücreye tıklanma olayı var alert = UIAlertController(title: "Buraya Tıkladınız", message:array2[indexPath.row] , preferredStyle: UIAlertControllerStyle.alert) alert.addAction(UIAlertAction(title: "Tamam", style:UIAlertActionStyle.default , handler: nil)) self.present(alert,animated: true,completion: nil) } func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {//hücre arka planı let bgImg = UIImage(named: "viewBg") let bgImgView = UIImageView(image: bgImg, highlightedImage: nil) cell.backgroundView = bgImgView } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {//hücrelerin satır yükseklikleri return 100 } }
- Burada 5. satırdan 14. satıra kadar dizi tanımlamaları ve içlerini doldurma aşaması.
- 16. satırdan 20. satıra kadar TableView tanımlamaları. 16. satırda TableView’imizin ekranın komplesini kaplamasını istiyoruz istersek ekranın belirli bir kısmınıda kaplattırabiliriz. 20. satırda bizim şablon olarak göstereceğimiz sınıfımızı gösteriyoruz.
- 26. satırdaki fonksiyon TableView’de kaç satır olacağını belirtiyor.
- 30. satırdaki fonksiyon TableView içine referans ettiğimiz, şablon TableViewCell sınıfımızın içindeki UI elemanlarına, atama yapmamızı sağlıyor.
- 38. satırdaki fonksiyonda herhangi bir satıra tıkladığımızda ne olmasını istiyorsak onu yazıyoruz ben mesaj kutusu açtım basitçe.
- 44. satırdaki fonksiyonda satırların arka planlarına bir resim ekledim, görsel tasarım açısından daha güzel sonuçlar elde etmek için.
- Son olarak 50. satırdaki fonksiyonda hücrelerin yüksekliklerini ayarladım.
Şimdi TableViewController bittiğine göre artık içine yerleştireceğimiz TableViewCell sınıfını inceleyelim.
import UIKit class MenuCell: UITableViewCell { var screenSize = UIScreen.main.bounds //cihaz ekran boyutları alındı var img = UIImageView() //tableview hücremize ekleyeceğimiz resim var l1 = UILabel() //tableview hücremize ekleyeceğimiz label 1 var l2 = UILabel() //tableview hücremize ekleyeceğimiz label 2 var subView = UIView() required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override init(style: UITableViewCellStyle, reuseIdentifier: String?) {//hücremiz burada hazırlanacak initialize edilecek super.init(style: style, reuseIdentifier: reuseIdentifier) subView = UIView(frame: CGRect(x:0,y:0,width:screenSize.width*0.8,height:screenSize.height*0.6)) subView.backgroundColor = UIColor.clear img = UIImageView(frame: CGRect(x:subView.bounds.width*0.05,y:subView.bounds.height*0.08,width:subView.bounds.width*0.1,height:subView.bounds.height*0.1)) img.clipsToBounds = true img.contentMode = UIViewContentMode.scaleAspectFit // resimleri tam olarak oranlı küçültmesi için l1 = UILabel(frame: CGRect(x:subView.bounds.width*0.5,y:0,width:subView.bounds.width*0.3,height:subView.bounds.height*0.2)) l1.textColor = .black l1.text = "Apple" l2 = UILabel(frame: CGRect(x:subView.bounds.width*0.5,y:subView.bounds.height*0.05,width:subView.bounds.width*0.3,height:subView.bounds.height*0.2)) l2.textColor = .black l2.text = "Steve Jobs" subView.addSubview(img) subView.addSubview(l1) subView.addSubview(l2) self.addSubview(subView) } }
- Burada 13. satırdan 17. satıra kadar TableView satırlarında hangi UI elemanlarını kullancaksak onları tanımladık. Ben bunu bir ağaç yapısı gibi düşünürsek parent olarak bir adet view tanımladım ve buna subView adını verdim, baktığımızda bu subView benim listede ki bir satırımı ifade edecek ve diğer UI elemanlarını bunun altına ekleyeceğim. Bunu illa bu şekilde yacağız diye bir şey yok tabi.
- 24. satırdaki gibi init fonksiyonunu ovveride etmeliyiz bizim TableView’imiz açıldığı anda tüm UI elemanlarını hazırlaması için zaten bu tüm UI elemanlarını bu fonksiyon içerisinde tanımlayacağız.
- 27. satırdan 41. satırada kadar daha önceden de yaptığımız gibi yine UI elemanlarını elle yazdık ve ekranda ki konumlarını belirledik.
- 43. satırdan 46. satıra kadar baktığımızda yukarıda bahsettiğim olayı görüyoruz burada img, l1 ve l2 UI elemanlarını subView altına ekledim ve son olarakta subView’i ana view’e ekledim.
Herkese iyi çalışmalar.