2015-12-03 2 views
3

В настоящее время у меня есть список из 70 вопросов в виде таблицы. Когда вопрос будет решен, таблица будет обновлена ​​и будет отмечена галочка (все работает нормально).Тени в табличном виде сохраняют штабелирование (Swift)

Проблема, с которой я сталкиваюсь, связана с тенью, которую я добавляю в каждую из своих ячеек в виде таблицы. По какой-то причине они сохраняют стекирование при прокрутке вверх и вниз. Также при размещении устройства в ландшафте новый CGRect нарисован, но старый все еще существует (также перекрывается).

Код:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
      let cell:QuestionCell = tableView.dequeueReusableCellWithIdentifier("cell") as! QuestionCell 
let bgColorView = UIView() 
     bgColorView.frame = CGRectMake(5, 5, (tableView.frame.width)-10, (cell.frame.height)-10) 
     bgColorView.backgroundColor = UIColor.clearColor(); 
     cell.selectedBackgroundView = bgColorView 

     let myBackView=UIView(frame:cell.frame) 
     myBackView.frame = CGRectMake(5, 5, (tableView.frame.width)-10, (cell.frame.height)-10) 
     myBackView.backgroundColor = UIColor.whiteColor(); 
     myBackView.layer.masksToBounds = false 
     myBackView.clipsToBounds = false 
     myBackView.layer.cornerRadius = 3 
     myBackView.layer.shadowOffset = CGSizeMake(-1, 1) 
     myBackView.layer.shadowRadius = 2 
     myBackView.layer.shadowOpacity = 0.4; 
     let test:CGRect = myBackView.layer.bounds 
     myBackView.layer.shadowPath = UIBezierPath(rect: test).CGPath 
     cell.addSubview(myBackView) 
     cell.sendSubviewToBack(myBackView) 



     if (question.showAfter == "true") { 
      cell.accessoryType = UITableViewCellAccessoryType.Checkmark 
      //give header of correct question blue color 
      cell.backgroundColor = UIColor.lightTextColor() 
      cell.headerQuestion.textColor = UIColor(red:0.01, green:0.53, blue:0.82, alpha:1.0) 
      } 
     else 
     { 
       cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator 
       cell.backgroundColor = UIColor.whiteColor() 
       cell.headerQuestion.textColor = UIColor(red:0.38, green:0.49, blue:0.55, alpha:1.0) 
     } 
     return cell 

} 

overlapping of the shadows at rotating (or scrolling up/down)

Я уже пробовал следующее (это было решение от кого-то на тему Objective-C):

let tag = 120 
if (cell.tag != 120) { 
//the above code here 
cell.tag = tag 
} 

Это решает теневой вопрос, НО, когда я поворачиваю устройство в альбомный режим, он не перерисовывается. Любые идеи? Приглашаются все

+1

Ячейки повторно используются, поэтому вам необходимо убедиться, что тень и контрольный ковчег удалены/добавлены, если необходимо. Храните теневое представление как свойство вашей ячейки и удалите его, если на вопрос не был дан ответ, добавьте его, если он есть, - не добавляйте его снова, если свойство не равно нулю. То же самое с настройкой аксессуара. Как вы узнаете, разрешен ли вопрос или нет? – Paulw11

+0

Я знаю, что вопрос решается путем проверки базы данных (код здесь не был добавлен, но это часть вопроса.showAfter = true. – SoundShock

+0

Итак, в основном, если showAfter == true, вопрос должен отображаться с галочкой/shadow? – Paulw11

ответ

2

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

Сделайте подкласс UITableViewCell и выполните общие настройки (цвет фона, тень). Затем зарегистрируйте свой класс с помощью tableview. Делайте только то, что отличается от каждой ячейки в tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell

+0

Спасибо, и я просто поместил его в viewdidload подкласса (или в каком методе подкласса?). – SoundShock

+0

'UITableViewCells' и' UIViews' не имеют 'viewDidLoad'. Вы можете поместить его в переопределение 'init (стиль стиля: UITableViewCellStyle, reuseIdentifier reuseIdentifier: String?)' Или 'awakeFromNib', если вы используете xib-файл. – orkoden

+1

Большое спасибо, сначала я не понимал, куда вы хотели пойти с ним, но как только я это сделал, все это кажется логичным: D – SoundShock

1

Попробуйте это:

if(cell.viewWithTag(120)==nil) 
{ 
    let myBackView=UIView(frame:cell.frame) 
    myBackView.frame = CGRectMake(5, 5, (tableView.frame.width)-10, (cell.frame.height)-10) 
    myBackView.backgroundColor = UIColor.whiteColor(); 
    myBackView.layer.masksToBounds = false 
    myBackView.clipsToBounds = false 
    myBackView.layer.cornerRadius = 3 
    myBackView.layer.shadowOffset = CGSizeMake(-1, 1) 
    myBackView.layer.shadowRadius = 2 
    myBackView.layer.shadowOpacity = 0.3; 
    let test:CGRect = myBackView.layer.bounds 
    myBackView.layer.shadowPath = UIBezierPath(rect: test).CGPath 

    myBackView.tag = 120; 

    cell.addSubview(myBackView) 
} 
    cell.sendSubviewToBack(myBackView) 
+0

Рад, что я мог помочь – ShahiM

+0

, только проблема заключается в том, что после поворота вашего устройства ничего не перерисовывается, что делает его плохо выглядящим в ландшафтном режиме. Думаю, мне нужно найти другое решение. – SoundShock

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