2016-06-22 7 views
3

私はカードスタイルのセルを追加しようとしているテーブルビューを持っています。これを達成するために、私はUIView(paddingView)をセルのコンテンツビューに追加しました。今影の効果を作成するために、私は次のコードを使用しています:テーブルビューが最初にロードされたとき影が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 

を問題が発生します。次のように各セルの下に影が表示されます。

enter image description here

これは私がどのように私はシャドウ効果が適切であることを確認し、上の画像を好きではないことができ たら、それをスクロールすると、それがどのように見えるのですか?

enter image description here

+0

ここで、あなたは影を作成するコードを呼び出していますか? cellForRowAtIndexPathの – Code

+0

。 –

+0

'tableView(_:willDisplayCell:forRowAtIndexPath:)'を試してください – Desdenova

答えて

3

あなたが最初のロードで見ている間違った影の幅の問題がpaddingView前の細胞のサブビューがレイアウトされているの境界を使用することに関連しています。

セルがインスタンス化されると、実際にはtableViewの実際の幅に設定されるのではなく、最初の幅(ストーリーボードに基づく)で始まることがあります。

オフスクリーン上でスクロールした後に問題がなくなる理由は、再利用されたセルが境界幅が正しくpaddingViewであるため、シャドウが正しく表示されるようになったためです。

これは、テーブルが(スクロールまたは再ロードされる)まで、セルフサイジングセルが最初に適切にレイアウトされていない場合の一般的な問題でした。 several workaroundsには、テーブルをリロードしてからレイアウトパスを強制するまで、ほぼ2年後に戻るものがあります。

両方とも、最初の使用時にセルの初期幅が正しいことを保証します。

古いバージョンのiOSをサポートしている場合は、この問題が発生する可能性があります。私はiOSの正確なバージョンがそれを修正したことは思い出せませんが、私はかなりの間この問題を回避する必要はありませんでした。

+0

答えをありがとう!いくつかの回避策へのリンクが私の問題を解決しました! cellForRowAtIndexPathに次のコードを追加するだけでした。cell.contentView.bounds = cell.bounds cell.layoutIfNeeded() –

+0

Xcode 8.3でこの問題が発生しています。 – Tom

1

実行時にストーリーボードのフレームとフレームに違いがあるようです。

したがって、ロールしたときにうまくいきました。 レイアウトが更新されたためです。機能cellForRowAtIndexPathにこのコードを追加すること

試してみてください。

cell.setNeedsLayout()

cell.layoutIfNeeded()

+0

あなたの答えをありがとう!このメソッドは、cell.layoutIfNeededの前にcell.contentView.bounds = cell.boundsも追加すると機能します –

1

はしてみてください。この

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

または

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

これはあなたにカードスタイルの効果を与えます

関連する問題