2016-06-22 6 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

Куда вы вызываете код, создаете тень? – Code

+0

в cellForRowAtIndexPath. –

+0

Попробуйте 'tableView (_: willDisplayCell: forRowAtIndexPath:)' – Desdenova

ответ

3

Неправильная ширина тени вопрос, который вы видите на первой загрузке связана с использованием границы в paddingViewперед тем подвиды клетки раскладывают.

Когда создается экземпляр ячейки, она может начинаться с неправильной начальной ширины (которая основана на раскадровке) вместо первоначальной установки фактической ширины таблицыView.

Причина, по которой проблема уходит после прокрутки, затем на экране, состоит в том, что ячейка с повторно используемой ячейкой имеет значение paddingView границ ширины, поэтому тень теперь выглядит правильно.

Это была обычная проблема для самонастраивающихся ячеек, которые изначально не были выложены должным образом, до тех пор, пока таблица не была (прокручена или перезаписана). Есть several workarounds, возвращающийся почти на два года, которые варьируются от перезагрузки таблицы, до форсирования макета.

Оба гарантируют правильную начальную ширину ячейки при первом использовании.

Если вы поддерживаете более старые версии iOS, эта проблема может возникнуть. Я не помню, какая именно версия iOS исправила ее навсегда, но мне не пришлось долго обойти эту проблему.

+0

Спасибо за ответ! Ваша ссылка на несколько обходных решений решила мою проблему! Мне просто пришлось добавить следующий код в cellForRowAtIndexPath: cell.contentView.bounds = cell.bounds cell.layoutIfNeeded() –

+0

У меня проблема с Xcode 8.3. – Tom

1

Похоже, что проблема заключается в том, что между рамкой в ​​раскадровке и рамкой во время выполнения существуют различия.

Поэтому, когда вы катались, это сработало. Поскольку макет был обновлен.

Попробуйте добавить этот код в функцию cellForRowAtIndexPath:

cell.setNeedsLayout()

cell.layoutIfNeeded()

+0

Спасибо за ваш ответ! Этот метод работает для меня, если я также добавлю cell.contentView.bounds = cell.bounds перед cell.layoutIfNeeded –

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; 

Это даст вам эффект стиля карты