2014-09-23 18 views
11

Uygulamamda çoğunlukla nib'ler tarafından tanımlanan birkaç özel UITableViewCells var. IOS 8 ve Xcode 6'ya taşınırken, soldaki ve sağdaki kenar boşlukları yanlıştır. Bu hücreler genellikle varsayılan hücrelerle bir tablo görünümünde serpiştirilir. iOS 8 ve layoutMargin'deki Özel UITableViewCells

Burada, örnek bir proje yaptık bahsettiğim marjı konudur: margin issue

Konunun bu ilgilidir bulmak mümkün olduğum tek şey, yeni özellik layoutMargins olduğunu. UITableViewCells için değeri uygulaması üzerinde çalıştığı cihaza bağlı olarak değiştirmek gibi görünüyor:

iPhone 6 and below - layoutMargin: {8, 16, 8, 16} 
iPhone 6 Plus - layoutMargin: {8, 20, 8, 20} 

Bu benim standart hücreleri üzerinde görüyorum marjlar ile hizaya gibi görünüyor. Ancak, özel hücrelerimin içeriği contentView hücresinin içinde, standardında UIView layoutMargin standardına sahiptir. Bu, Kapsayıcı Marjına bağlı olan tüm otomatik düzen kısıtlamalarının yanlış aralığı ekledikleri anlamına gelir. Bunu sarmak gerekiyordu

Bunu düzeltmek için bulduk tek yolu Bu çok iyi bir çözüm ileriye gibi görünmüyor cellForRowAtIndexPath:

cell.contentView.layoutMargins = cell.layoutMargins; 

aşağıdaki eklemektir (özellikle uyumluluğun sürdürülmesi için iOS8 denetimlerinde).

Herhangi bir fikri olan var mı? Bir şeyleri kaçırmam gerektiğini hissediyorum.

cevap

13

KoruyucularSuperviewLayoutMargins özelliğine göz atmak isteyebilirsiniz. Aradığın gibi geliyor. Senin UITableViewCell alt sınıfında

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    if ([self.contentView respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { 
     self.contentView.preservesSuperviewLayoutMargins = YES; 
    } 
} 
+0

Teşekkürler! Aradığım şey bu. – simon

4

layoutMarginsDidChange geçersiz kılmak ve hücrenin layoutMargins maç için contentView en layoutMargins ayarlayın::

herhangi tutarlı standart hücrelerle aralıklı gerekiyor hücrelere aşağıdaki ekleyin

- (void)layoutMarginsDidChange { 
    contentView.layoutMargins = layoutMargins 
} 

Bunu, preservesSuperviewLayoutMargins ayarını YES'a göre daha güvenilir buldum.

0

preservesSuperviewLayoutMargins iOS8 için çözer. Aşağıdaki kod, ios7.1 için çözen ek kodu içerir.

class CustomTableViewCell: UITableViewCell { 

    @IBOutlet weak var mainLabel: UILabel! 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     if contentView.respondsToSelector(Selector("preservesSuperviewLayoutMargins")) { 
      contentView.preservesSuperviewLayoutMargins = true 
     } else { 
      if mainLabel != nil { 
       let leftConstraint = NSLayoutConstraint(item: mainLabel, 
        attribute: .Leading, 
        relatedBy: .Equal, 
        toItem: contentView, 
        attribute: .Leading, 
        multiplier: 1.0, 
        constant: 16.0); 
       addConstraint(leftConstraint); 
      } 
     } 
    } 

}