2017-02-22 3 views
1

У меня есть UIView в ячейке UITableView. Мой cellForRowAtIndexPath раундов этот вид. Когда я открываю viewcontroller и вижу таблицу, все видимые виды округляются. Однако, когда я прокручиваю вниз, первая новая ячейка для отображения не имеет округленного представления. Как это исправить?UIView не закруглен, UITableView Переработка ячеек

Мои cellForRowAtIndex выглядит следующим образом:

let cell = tableView.dequeueReusableCell(withIdentifier: "RepeatingCell", for: indexPath) as! CustomTableViewCell 
cell.delegate = self 
tableView.contentInset = UIEdgeInsetsMake(10, 0, 0, 0) 

if (indexPath as NSIndexPath).row < tableListInfo_Context.count { 
    let task = tableListInfo_Context[(indexPath as NSIndexPath).row     
    let accState = task.value(forKey: "state") as? String 
    //Removed assigning labels their text 
    let mainView = cell.mainView 
    mainView.isHidden = false 
    let circleView = cell.viewToRound 
    circleView?.isHidden = false 
    circleView?.layer.cornerRadius = (circleView?.frame.size.width)!/2 
    circleView?.layer.masksToBounds = true   
    cell.layoutMargins = UIEdgeInsetsMake(0, 1000, 0, 1000) 
} else { 
    //My last cell hides several views to reveal a view under them 
    //If I comment this one line out, I get the not-rounded problem only once and it does not show up again even if I continue scrolling up/down 
    let mainView = cell.mainView 
    mainView.isHidden = true 
    let circleView = cell.viewToRound 
    circleView?.isHidden = true 
} 

Я понимаю, что UITableViews рециркуляцией клетки, и я думаю, что это, вероятно, вызывает у меня проблемы. Я думаю, что это связано с последней ячейкой, где я скрываю взгляды.

В списке из 20 ячеек иногда отображается некруглый вид, как первый для прокрутки на экране, иногда второй. Когда я просматриваю вверх/вниз, случайный вид не округляется! Я знаю, что есть причина/образец, но я не знаю, что.

Я также попытался добавить скругления код willDisplayCell:

let circleView = myCell.mainCircle 
circleView?.layer.cornerRadius = (circleView?.frame.size.width)!/2 
circleView?.layer.masksToBounds = true 

Однако, это не решить. Как непоследовательно это очень расстраивает. Любая помощь будет оценена по достоинству.

ПОЛНЫЙ КОД ЗАПРОШЕННАЯ DUNCAN:

func buildCell_RepeatableCell (indexPath: IndexPath) -> CustomTableViewCell   { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "RepeatingCell",  for: indexPath) as! CustomTableViewCell 
    cell.delegate = self 

    tableToSV_Left.constant = 10 
    tableToSV_Right.constant = 10 
    tableView.contentInset = UIEdgeInsetsMake(10, 0, 0, 0) 

    if (indexPath as NSIndexPath).row < curLifeList_Context.count { 
     resetDataCell_ToDefaultLaylout(cell: cell, hideExpand: true) 
     let task = curLifeList_Context[(indexPath as NSIndexPath).row] 
     let accState = task.value(forKey: "state") as? String 
     cell.nameLabel!.text = task.value(forKey: "name") as? String 
     cell.descLabel!.text = task.value(forKey: "desc") as? String 
     let redTrashIcon = UIImage(named: "trash") 
     let maskedIcon = redTrashIcon?.maskWithColor(color: .red) 
     cell.row5_LeftBtnImg?.image = maskedIcon 
     let doneGreen = UIColor(colorLiteralRed: 83/255, green: 223/255, blue: 56/225, alpha: 0.9) 
     let greenCheck = UIImage(named: "check_Green") 
     let maskedCheck = greenCheck?.maskWithColor(color: doneGreen) 
     cell.row5_RightBtnImg?.image = maskedCheck 
     roundQtyCircle(view: cell.mainCircle) 
     if accState == "Selected" { 
      cell.circleLine.backgroundColor = doneGreen 
      cell.mainCircle.borderColor = doneGreen 
      cell.hdrCrossOutLine.isHidden = false 
      cell.row5_RightBtnImg.alpha = 0.5 
     } else { 
      cell.circleLine.backgroundColor = UIColor(colorLiteralRed: 211/255, green: 211/255, blue: 211/255, alpha: 0.9) 
      cell.mainCircle.borderColor = UIColor(colorLiteralRed: 211/255, green: 211/255, blue: 211/255, alpha: 0.9) 
      cell.hdrCrossOutLine.isHidden = true 
      cell.row5_RightBtnImg.alpha = 1.0 
     } 
     cell.dataHdr_Left!.text = doneColon_lczd 
     cell.dataHdr_Right!.text = lastDoneColon_lczd 
     cell.dataVal_Left!.text = "0" 
     cell.dataVal_Right!.text = "-" 
     if let lastCompDate = task.value(forKey: "lastCompleted") as? Date { 
      cell.dataVal_Left!.text = "\(task.value(forKey: "timesCompleted") as! Int)" 
      if NSCalendar.current.isDateInToday(lastCompDate) { 
       cell.dataVal_Right!.text = "Today" 
       cell.dataBotDtl_Right.text = "" 
      } else { 
       let secondsUntilChange = (lastCompDate.seconds(from: now)) * -1 
       print("Seconds ago \(secondsUntilChange)") 
       var timeAgo = getDateString(secondsUntilChange, resetDate: lastCompDate) 
       timeAgo.remove(at: timeAgo.startIndex) 
       cell.dataVal_Right!.text = timeAgo 
      } 
     } 
     cell.layoutMargins = UIEdgeInsetsMake(0, 1000, 0, 1000) 
    } else { 
     buildAddNew_ForRepeatableCell(cell: cell) 
    } 

    return cell 
    } 

    func resetDataCell_ToDefaultLaylout (cell: CustomTableViewCell, hideExpand: Bool) { 
    cell.addnewBtn.isHidden = true 
    cell.nameLabel.isHidden = false 
    cell.dataHdr_Left.isHidden = false 
    cell.dataHdr_Right.isHidden = false 
    cell.dataTopDtl_Right.isHidden = false 
    cell.dataBotDtl_Right.isHidden = false 
    cell.mainBox.isHidden = false 
} 

func buildAddNew_ForRepeatableCell (cell: CustomTableViewCell) { 
    cell.addnewBtn.isHidden = false 
    cell.descLabel.text = addNew_lczd //For editor 
    cell.mainBox.isHidden = true 
    cell.layoutMargins = UIEdgeInsetsMake(0, 1000, 0, 1000) 
    cell.container.layoutIfNeeded() 
} 
+0

В другом блоке метода cellForRow вы скрываете 'mainView', но вы не открываете его в блоке if. – Adeel

+0

@Adeel, который был просто ошибкой в ​​моем удалении кода назначения текста, я случайно удалил эту сплошную линию. Если mainView не был скрытым, я бы вообще не видел некруглый вид. –

ответ

0

Вместо настройки свойств слоя в целях cellForRowAtIndexPath, установите их в CustomTableViewCell классе. Вы можете установить их в методе awakeFromNib.

Короткий перевод вашего нижнего кода: awakeFromNib.

let circleView = cell.viewToRound 
    circleView?.layer.cornerRadius = (circleView?.frame.size.width)!/2 
    circleView?.layer.masksToBounds = true 

Код Судо может быть что-то вроде этого:

awakeFromNib(){ 
self.viewToRound?.layer.cornerRadius = (viewToRound?.frame.size.width)!/2 
viewToRound?.layer.masksToBounds = true 

} 
+0

Я был в восторге от этой идеи, но это не устранило проблему. Спасибо за предложение. –

+0

Есть ли ошибки после этого подхода? можете ли вы показать, как вы внедрили мое решение? –

+0

переопределение FUNC awakeFromNib() { super.awakeFromNib() self.mainCircle? .layer.cornerRadius = (mainCircle? .frame.size.width)!/2 mainCircle? .layer.masksToBounds = истинная } –

0

Попробуйте это, он будет работать.

override func awakeFromNib() { 
     super.awakeFromNib() 
     self.viewToRound?.layer.cornerRadius = (viewToRound?.frame.size.width)!/2 
     viewToRound?.layer.masksToBounds = true 
    } 


override func prepareForReuse() { 
     super.prepareForReuse() 
     self.viewToRound?.layer.cornerRadius = (viewToRound?.frame.size.width)!/2 
     viewToRound?.layer.masksToBounds = true 
    } 
+0

Нет. Я не знал, что ReadyForReuse существует. Я был очень взволнован, но это тоже не работает. 90% времени они круглые, но все еще не круглые, появляются как при прокрутке быстро, так и медленно. –

+0

Можете ли вы поделиться со мной исходным кодом (пример проекта), который будет обновлять и возвращать вас с помощью решения, используя те же методы в моем ответе – Krunal

0

@Adeel уже рассказал вам о проблеме и решении в его комментарии.

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

В вашем случае, ключ бит:

if (indexPath as NSIndexPath).row < tableListInfo_Context.count { 
    //Configure cells that are not the last cell 
} else { 
    //Configure cells the last cell 
    mainView.isHidden = true 
} 

Вы прячетесь в том случае, когда вы настраиваете последнюю ячейку mainView, но не снимите скрыть его, если это не последняя ячейка. Итак, если вы настроите последнюю ячейку, прокрутите ее за кадром, затем прокрутите назад в верхнюю часть экрана, чтобы переработанная ячейка снова использовалась для indexPath, кроме последней, и она mainView никогда не будет скрыта.

if (indexPath as NSIndexPath).row < tableListInfo_Context.count { 
    //Configure cells that are not the last cell 
    //----------------------------- 
    // This is what you are missing 
    mainView.isHidden = false 
    //----------------------------- 
} else { 
    //Configure cells the last cell 
    mainView.isHidden = true 
} 

@ ответ VishalSonawane это хорошо, но, чтобы сделать эту работу, вы должны использовать 2 различные идентификаторы, один для всех ячеек, но последний, и другого идентификатора, с ячейкой предварительно сконфигурированный с MainView скрытым, для последней ячейки. Таким образом, вы не получите переработанную последнюю ячейку и попытаетесь использовать ее для одной из других позиций в вашем представлении таблицы.

+0

Привет, Дункан, мне жаль, что потратил ваше время на это, но это была просто ошибка в моем удалении код ввода текста для моего сообщения SO, я случайно удалил эту сплошную линию. Это определенно не скрыто. Если mainView не был скрыт, я бы не видел не округленное представление вообще –

+0

Мы не можем отлаживать код, который мы не видим. Вероятно, вам следует показать весь метод cellForRow (at:) '. –

+0

Хорошо, это немного длинно, поэтому я старался не подавлять всех, а просто добавил! –

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