2015-10-05 14 views
13

Kullanıcının kaydırma nesnelerine göz atmasına izin veren tipik bir ana-detay uygulamasına sahibim ve daha sonra herhangi bir nesne için bir itme düğmesine sahip detaylara detaylandırma. Kaydırma ana listesi, prototip hücrelerle oluşturulan bir UITableView'dir ve ayrıntı sahnesi, sabit sayıda bölüm ve hücreye sahip statik bir UITableView'dir.Statik Tablalı Dinamik Tip ve Kendiliğinden Hızlanan Hücreler

Uygulamamda Dinamik Tür ve Kendiliğinden Boyutlanan Hücreler uygulamak istiyorum, böylece kullanıcı temel yazı tipi boyutunu değiştirebilir. Şimdiye kadar, prototip hücrelerinin kayan listesiyle kendiliğinden boyutlandırılan hücreler yapmakta başarılı oldum: Auto Layout'u kullanarak, her etiketteki satır sayısını 0'a ayarlayıp tableView.rowHeight = UITableViewAutomaticDimension'u ayarlayarak her prototip hücresinin yüksekliği büyüyecek veya küçülecek. içindeki metnin boyutu.

Ancak statik tablo görünümümde aynı etkiyi elde edemiyorum. Özel hücreleri veya yerleşik hücre türlerini kullanmam, yazı tipi büyür veya küçülür, ancak hücre yüksekliği olmaz.

Bu yüzden sorum şu iki soru: 1) prototip tablo görünümünde yaptığım gibi, kendinden boyutlandırma hücrelerini statik tablo görünümlerinde uygulamak mümkün müdür? ve 2) ilk soruya verilen cevap hayır ise, statik tablo görüntüleme hücresindeki bir etiketin yüksekliğini ölçecek ve hücre yüksekliğini uygun şekilde ayarlayacak kodları nasıl yazarım?

Teşekkür ederiz! Bu statik bir tablo olduğu için onlara IBOutlets oluşturmak zorunda kalacak, böylece

cevap

1

Dün gönderdiğim soruya verilen cevaplardan dolayı minnettarım. Ne yazık ki (ve muhtemelen bir iOS programcısı olarak benim deneyimsizliğim nedeniyle) systemLayoutSizeFittingSize (UILayoutFittingCompressedSize) yaklaşımı çalışmasını yapamamıştım. Bazı deneme yanılma sonra, ancak, ben çalışmak gibi görünüyor farklı bir yöntem bulundu:

import UIKit 

class MasterTVC: UITableViewController { 
    @IBOutlet weak var staticCustomCellLabel: UILabel! 

    //viewDidLoad 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.estimatedRowHeight = 44.0 

     staticCustomCellLabel.text = "This is the text for the static custom cell label; This is the text for the static custom cell label; This is the text for the static custom cell label" 

     //Register handleDynamicTypeChange in observer: self 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleDynamicTypeChange:", name: UIContentSizeCategoryDidChangeNotification, object: nil) 
    } 

    //deinit 
    deinit { 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    //handleDynamicTypeChange 
    //called when user changes text size in Settings > General > Accessibility > Larger Text 
    //or Settings > Display & Brightness > Text Size 
    func handleDynamicTypeChange(notification: NSNotification) { 
     staticCustomCellLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody) 

     self.tableView.reloadData() 
    } 

    //tableView:heightForRowAtIndexPath 
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     return UITableViewAutomaticDimension 
    } 
} 

Bunun storyboard tarafında, kurulum aşağıdaki özelliklere sahip tek bir tablo View Controller ile başlar:

  • Sınıf: MasterTVC (özel sınıfım); İlk görünüm kontrolörünü
  • ;
  • İçerik: Statik Hücreler;
  • Stil: Gruplanmış
  • Bölüm: 1.

Bölüm 1:

  • satır: 1 arasındadır.

Tablo Görünümü Hücre:

  • Stil: Özel (Temel buraya Ayarlar metin boyutunu değiştirirken kaybolmasına etiketi neden olur kullanarak);
  • UILabel İçeren.

UILabel ayrıca olarak yapılandırılmış:

  • Yazı: Vücut (Dinamik Tip tarzı);
  • Satırlar: 0;
  • Dört tarafın hepsinde, içerik görünümünün üst, alt, sol ve sağ kenarlarına sabitlenir (ilgili kısıtlamaları 8, 8, 15, 15 kullanıyorum); Özel sınıf kodunda @IBOutlet ile
  • .

Bu, Xcode 7'de iOS 9 ve Otomatik Düzenleme etkinleştirilmiş Swift 2 için tasarlandı. İlginç olan şey, metin boyutundaki değişikliklere hemen yanıt vermek için kullanılan NSNotificationCenter kodunu çıkarırsanız, kendiliğinden boyutlandırılan hücre kodunun temel olarak iki satır olması: viewDidLoad'da tahminiRowHeight değerini ayarlama ve tablodan UITableViewAutomaticDimension döndürme: heightForRowAtIndexPath.

Bu sonuçlara dayanarak, orijinal soruma cevapların şunlar olduğuna inanıyorum: 1) evet; ve 2) bkz. 1.

1

, sen böyle bir diziye onları tutardı, hücreleri sıradan çıkarma olamaz: Sonra

@IBOutlet var cells: [UITableViewCell]! 

olacak boyutunu heightForRowAtIndexPath uygulamak ve hesaplamak zorunda: bir önbellek gibi

var rowSizes: [Int: CGFloat] = [:] 

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return calculateHeightForCell(indexPath) 
} 

func calculateHeightForCell(indexPath: NSIndexPath) -> CGFloat { 

    // check if we already calculated the height 
    if let height = rowSizes[indexPath.row] { 
     return height 
    } 

    // else, calculate it 
    let cell = cells[indexPath.row] 

    let size = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) 

    rowSizes[indexPath.row] = size.height 

    return size.height 
} 

rowSizes eylemler, bu satır yüksekliklerini yapacak, bu yüzden sadece bir kez hesaplanacaktır. Yazı tipi boyutunu değiştirirken, sadece rowSizes'i boşaltın ve tabloyu yenileyin, böylece tekrar hesaplanacaktır.

15

Statik tablo görünümleri, Interface Builder'da ayarlanan satır yüksekliği değerini döndürür. tableView.rowHeight ayarı tamamen yok sayılıyor. Bu görünüşte UIKit'te bir böcek.

Bunu düzeltmek için, -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath'u geçersiz kılın ve UITableViewAutomaticDimension'u döndürün.

+0

Çok teşekkür ederim! – mangerlahn

+0

Delege işlevini kullanmak yerine 'tableView.rowHeight' ayarlayabilir misiniz? – BallpointBen

+0

@BallpointBen Cevabımda lütfen ikinci cümleyi okuyun. – Andy

3

İlk UITableViewAutomaticDimension çalışmaları tüm sol, sağ, alt kısmını ve hücre konteyner görünümüne göre üst sınırlar ekleyebilirsiniz emin kılmak için sınıfınızda

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

İkinci Bu iki işlev eklemek. Ayrıca, etiketin satır sayısını sıfıra ayarlamayı da unutmayın.