2016-06-22 9 views
3

Ich habe eine Tabellenansicht, in der ich versuche, Karten-Stil-Zellen hinzuzufügen. Um dies zu erreichen, habe ich eine UIView (paddingView) in die Inhaltsansicht der Zelle eingefügt, deren Größe etwas kleiner ist. Nun den Schatteneffekt zu schaffen, ich den folgenden Code verwenden:Schatten nicht konform mit der Form der Ansicht in UITableViewCell

let path = UIBezierPath(rect: cell.paddingView.bounds) 
    cell.paddingView.layer.shadowPath = path.CGPath 
    cell.paddingView.layer.shadowOffset = CGSizeMake(0.5, 0.5) 
    cell.paddingView.layer.shadowOpacity = 0.4 

Das Problem entsteht, wenn die Tabellenansicht zuerst geladen wird. Der Schatten unter jeder Zelle sieht wie folgt aus:

enter image description here

Dies ist, wie es aussieht, wenn ich es einmal scrollen Wie kann ich sicherstellen, dass die Schattenwirkung richtig ist, und nicht das obere Bild gefallen hat?

enter image description here

+0

Wo rufst du den Code den Schatten erstellen? – Code

+0

in cellForRowAtIndexPath. –

+0

Versuchen Sie 'tableView (_: willDisplayCell: forRowAtIndexPath:)' – Desdenova

Antwort

3

Das falsche Schattenbreite Problem, das man auf dem ersten Last sehen ist mit den Grenzen der vor die Subviews aus gelegt Zelle paddingView bezogen.

Wenn eine Zelle instanziiert wird, kann sie mit der falschen Anfangsbreite beginnen (die auf dem Storyboard basiert), anstatt zunächst auf die tatsächliche Breite der TabelleView festgelegt zu werden.

Der Grund, warum das Problem nach dem Scrollen auf dem Bildschirm verschwindet, ist, dass die wiederverwendete Zelle die richtige paddingView Grenze hat, sodass der Schatten jetzt korrekt erscheint.

Dies war ein häufiges Problem für Zellen mit Selbstbemaßung, die zunächst nicht richtig ausgelegt wurden, bis die Tabelle neu geladen (gescrollt oder neu geladen) wurde. Es gibt several workarounds, die fast zwei Jahre zurückgehen, die vom Nachladen der Tabelle bis zum Erzwingen eines Layout-Durchlaufs reichen.

Beide stellen sicher, dass die Anfangsbreite der Zelle bei der ersten Verwendung korrekt ist.

Wenn Sie ältere Versionen von iOS unterstützen, kann dieses Problem auftreten. Ich kann mich nicht erinnern, welche Version von iOS es für immer repariert hat, aber ich habe dieses Problem nicht schon länger lösen müssen.

+0

Vielen Dank für die Antwort! Ihr Link zu mehreren Problemumgehungen hat mein Problem gelöst! Ich musste einfach den folgenden Code in cellForRowAtIndexPath hinzufügen: cell.contentView.bounds = cell.bounds cell.layoutIfNeeded() –

+0

Ich habe dieses Problem mit Xcode 8.3. – Tom

1

Es scheint, dass das Problem darin besteht, dass es in der Laufzeit Unterschiede zwischen dem Frame im Storyboard und dem Frame gibt.

Deshalb, wenn Sie gerollt haben, hat es geklappt. Weil das Layout aktualisiert wurde.

Versuchen das Hinzufügen dieser Code in die Funktion cellForRowAtIndexPath:

cell.setNeedsLayout()

cell.layoutIfNeeded()

+0

Vielen Dank für Ihre Antwort! Diese Methode funktioniert für mich, wenn ich auch cell.contentView.bounds = cell.bounds vor cell.layoutIfNeeded hinzufüge –

1

versuchen diese

cell.vwMain.layer.shadowOffset = CGSize(width: 0, height: 5) 
    cell.vwMain.layer.shadowOpacity = 0.05 
    cell.vwMain.layer.shadowRadius = 5 

oder

cell.layer.shadowOffset = CGSizeMake(0.0, 5); 
    cell.layer.shadowOpacity = 0.2; 
    cell.layer.shadowRadius = 5; 

Dadurch erhalten Sie einen Kartenstil-Effekt

Verwandte Themen