2014-09-23 10 views
11

Mam kilka niestandardowych identyfikatorów UITableViewCell w mojej aplikacji, w większości zdefiniowanych przez końcówki. Podczas przechodzenia do systemu iOS 8 i Xcode 6 marginesy po lewej i prawej stronie są nieprawidłowe. Te komórki są często przeplatane w widoku tabeli z komórkami domyślnymi.Niestandardowe obiekty UITableViewCells w systemie iOS 8 i layoutMargin

Zrobiłem przykładowy projekt, tu jest problem margines mówię: margin issue

Jedyne co udało mi się dowiedzieć, że dotyczy to nowy obiekt layoutMargins. Dla UITableViewCells jego wartość wydaje się zmieniać w zależności od urządzenia aplikacja jest uruchomiona na:

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

To wydaje się w jednej linii z marginesie widzę na standardowych komórek. Jednak treść moich niestandardowych komórek znajduje się wewnątrz komórek contentView, która ma standardową wersję UIView layoutMargin z {8, 8, 8, 8}. Oznacza to, że wszelkie ograniczenia automatycznego układu, które są powiązane z marginesem kontenera, dodają nieprawidłowe odstępy.

Jedynym sposobem znalazłem się naprawić to poprzez dodanie następujących w cellForRowAtIndexPath:

cell.contentView.layoutMargins = cell.layoutMargins; 

To nie wydaje się bardzo dobrym rozwiązaniem w przyszłości (zwłaszcza odkąd muszę go owinąć w sprawdzeniach dla iOS8 w celu zachowania kompatybilności).

Czy ktoś ma jakieś pomysły? Czuję, że muszę czegoś przegapić.

Odpowiedz

13

Możesz chcieć sprawdzić właściwość preservesSuperviewLayoutMargins. Brzmi jak to, czego szukasz.

Dodaj poniższe linie do wszelkich komórek, które muszą być konsekwentnie rozmieszczone standardowych komórek:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

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

Dzięki! Tego właśnie szukałem. – simon

4

W swojej UITableViewCell podklasie zastępują layoutMarginsDidChange i ustawić layoutMargins w contentView by dopasować komórki layoutMargins:

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

Okazało się, że jest bardziej niezawodny niż ustawienie preservesSuperviewLayoutMargins na YES.

0

preservesSuperviewLayoutMargins rozwiązuje dla iOS8. Poniższy kod obejmuje to i dodatkowy kod, który rozwiązuje go dla ios7.1.

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); 
      } 
     } 
    } 

} 
Powiązane problemy