2015-04-19 2 views
3

У меня есть пользовательская ячейка с несколькими ярлыками, скрытыми по умолчанию (пользователь видит все содержимое при нажатии на ячейку). Я меняю высоту ячейки и cell.clipToBounds = true, чтобы скрыть метки. Но это не работает для редактируемых ячеек. Когда я начинаю прокручивать ячейку влево, появляется скрытое содержимое. Я заметил, что он работает, если я сначала разворачиваю ячейку, рушится и салфетки, но перестает работать, если я проведу другую ячейку. Любые подсказки, как скрыть его, когда ячейка пробита?clipToBounds не работает при прокручивании ячеек

clipToBounds not working for editable cells

+0

Если вы хотите, чтобы метки были скрыты, почему бы не просто установить label.hidden = true? Вы можете поместить их в коллекцию массива или розетки, чтобы сделать ее проще. –

+0

Аарон, извините, я не совсем уверен, как это сделать. Просто попытался создать массив, добавить все эти метки в массив и использовать для цикла, чтобы все они были скрыты, но я получаю кучу ошибок. –

+0

... какие ошибки вы получаете? Измените свой вопрос, чтобы показать код, который вы пытаетесь. –

ответ

1

Добавьте метки в массив.

Установите hidden в true:

let labels = [firstLabel, secondLabel, etc.…] 
for label in labels { 
    label.hidden = true 
} 
+0

У меня есть много разных объектов для скрытия, таких как UIImageViews и UISwitches, поэтому я выбрал метод вместо того, чтобы помещать их в массив. Этот метод находится внутри контроллера ячейки: 'FUNC hideAll (скрыть: Bool) { mySwitch.hidden = скрыть myLabel.hidden = hide' Я называю этот метод в моем ТВЦ внутри' heightForRow'. Тем не менее, не работает. Собственно, как только взгляды скрыты, они больше не появляются. Но они появляются, когда происходит салфетка. Я думаю, что это может быть ошибка xcode с помощью салфетки для редактирования? –

+0

Я был не прав выше. Ошибка понимания жизненного цикла tableViewCell привела к ошибке. Выведет ответ. –

0

попробуйте установить свойство contentView clipsToBounds истина. Обычно вам не следует возиться с ячейкой в ​​качестве представления.

Swift

cell.contentView.clipsToBounds = true 

Obj-C

cell.contentView.clipsToBounds = YES 
1

Я думаю, что это ошибка с setEditing переопределения или игнорированием clipsToBounds во время анимации и редактирования.

Решение:

Вы должны скрыть все элементы, которые не должны появляться, когда таблица «закрыто», и отобразите их, когда таблица расширяется.

1) Создайте метод UITableViewCell, чтобы скрыть/показать все элементы, необходимые:

func hideAll(hide: Bool) { 
     myLabel.hidden = hide 
     myUISwitch.hidden = hide 
} 

2) Вызов выше метода при инициализации ваших клеток. Обычно вызывается где-то внутри ячейки, на инициализаторе или вызывается на cellForRowAtIndexPath. Я проверяю на cell.bounds.height, чтобы определить, является ли клетка расширяется или нет:

//cell init code 

//I'm calling this method from inside the cell, so I use self here. 
//If you're calling this method from your controller you should 
//target the cell with cell.bounds.height, as well as targeting the 
//cell to call the method: cell.hideAll(Bool) 
var hidden = (self.bounds.height < 80) //change this number depending on your collapsed and expanded cell heights 
hideAll(hidden) 

3) На данный момент (если выше метод был назван внутри cellForRowAtIndexPath или на мобильный инициализаторе) ваш метод будет вызываться, когда клетки создаются и каждый раз, когда ячейка расширяется. Но не тогда, когда ячейка сжимается (больше на этом впереди). Так добавить код в editingStyleForRowAtIndexPath:

override func tableView(tableView: UITableView, 
     editingStyleForRowAtIndexPath indexPath: NSIndexPath) 
     -> UITableViewCellEditingStyle{ 
      if let cell = tableView.cellForRowAtIndexPath(indexPath) as? CustomTableViewCell { 
       cell.hideAll(cell.bounds.height < 80) //calls hideAll with a Bool argument, depending on height of cell 
      } 
      return .Delete 
    } 

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

Хорошо, это было решение. Теперь ПОЧЕМУ:

Настоящая проблема, когда вы хотите скрыть эти ячейки, - , когда, чтобы скрыть их.Сначала вам нужно понять цикл, который быстро проходит через tableViewCell.

Я предполагаю, что вы расширяете/сокращаете ячейки на heightForRowAtIndexPath. Что семантически имеет смысл. Но давайте предположим, что у вас есть 3 ячейки (все расширяемые). Я делаю println() всякий раз, когда вызываются cellForRowAtIndexPath, didSelectRowAtIndexPath и heightForRowAtIndexPath. В следующем примере я постучал в первую строку, затем на вторую, затем на третью. Обратите внимание на результаты на консоли:

>>>> called didSelectRow at index 0 
???? called heightForRow at index 0 
???? called heightForRow at index 1 
???? called heightForRow at index 2 
???? called heightForRow at index 0 
==== called cellForRow at index 0 
???? called heightForRow at index 0 

>>>> called didSelectRow at index 1 
???? called heightForRow at index 0 
???? called heightForRow at index 1 
???? called heightForRow at index 2 
???? called heightForRow at index 1 
==== called cellForRow at index 1 
???? called heightForRow at index 1 

>>>> called didSelectRow at index 2 
???? called heightForRow at index 0 
???? called heightForRow at index 1 
???? called heightForRow at index 2 
???? called heightForRow at index 2 
==== called cellForRow at index 2 
???? called heightForRow at index 2 

Как вы можете видеть, когда вы didSelectRowAtIndexPath, heightForRowAtIndexPath вызывается несколько раз, циклический, пока быстро не уверен, что это имеет все высоты вправо. Между тем, cellForRow называется только в выбранной ячейке.

Так что если ваши ячейки автоматически сбрасываются при выборе другой ячейки, вы должны понимать, что они не запускают какой-либо код (например, метод, чтобы скрыть элементы), когда они обрушиваются, потому что cellForRowAtIndexPath был вызван только на прослушанную ячейку ,

Вы можете скрыть/показать внутри вашего кода heightForRow, но этот код называется так много раз, что он действительно не оптимален. Код следует вызывать только один раз, когда вам это нужно. Поэтому лучшим решением ИМО назвать его внутри editingStyleForRowAtIndexPath

1

В вашем UITableViewCell подклассе переопределить метод willTransitionToState(state: UITableViewCellStateMask) и установить contentView.clipToBounds истина, как это:

override func willTransitionToState(state: UITableViewCellStateMask) { 
    super.willTransitionToState(state) 

    contentView.clipsToBounds = true 
} 

С этого момента он будет клип подвидов клеточные правильно.

+0

Это решило проблему для меня, спасибо! –

Смежные вопросы