2015-03-11 2 views
2

Я клетки перекрывающихся так:просмотров UICollectionView клеток перекрывающихся

enter image description here

мой cellForItemAtIndexPath как таковой:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as UICollectionViewCell 

cell.backgroundColor = UIColor(red: 27.0/255.0, green: 38.0/255.0, blue: 52.0/255.0, alpha: 1.0) 
let textFrame = CGRect(x: 0, y: cell.frame.height * 0.30, width: cell.frame.width, height: cell.frame.height) 
var textLabel: UILabel! = UILabel(frame: textFrame) 
textLabel.font = UIFont(name:"Helvetica-Light", size: 14.0) 
textLabel.textAlignment = .Center 
textLabel.textColor = UIColor.whiteColor() 

println(categoryArray[indexPath.row].category) 

textLabel.text = categoryArray[indexPath.row].category 
var cellImage = UIImage(named: categoryArray[indexPath.row].catImage)//Array(Array(model.categories.values)[cellCount])[1] 

let imageSize = cell.frame.height * 0.45 

let imageView = UIImageView(image: cellImage as UIImage?) 
imageView.frame = CGRect(x: (cell.frame.width/2) - (imageSize/2), y:cell.frame.height * 0.15, width: imageSize, height: imageSize) 

var bottomBorder: UIView = UIView(frame:CGRectMake(0, cell.frame.height - 1.0, cell.frame.width, 5)); 
//bottomBorder.backgroundColor = UIColor(rgba: Array(Array(model.categories.values)[cellCount])[0] as String) 
bottomBorder.backgroundColor = UIColor(rgba: "#A64259") 

cell.addSubview(imageView) 
cell.addSubview(bottomBorder) 
cell.addSubview(textLabel) 

cellCount++ 
return cell 
} 

Я понимаю, что она повторно использует клетки, отличная идея ... кроме как предотвратить перекрытие текста ячейки?


EDIT - ПОТЕНЦИАЛ РЕШЕНИЕ # 1

Поскольку эти подвиды непрерывно модифицируется я понял, что если я просто бросил их и создал новые, так что я использовал:

for view in cell.subviews { 
    view.removeFromSuperview() 
} 

И это похоже на трюк. Я подозреваю, что у этого есть немного больше накладных расходов, чем просто изменение значений конкретных элементов в subviews. Будут исследовать дальше.

ответ

3

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

class ImageCell : UICollectionViewCell { 
    private(set) var imageView : UIImageView? 
    private(set) var textLabel : UILabel? 

    func setImage(image: UIImage?) { 
     if self.imageView == nil { 
      let imageSize = cell.frame.height * 0.45 
      self.imageView = UIImageView() 
      self.imageView.frame = CGRect(x: (self.frame.width/2) - (imageSize/2), y:self.frame.height * 0.15, width: imageSize, height: imageSize) 
      self.addSubview(imageView!) 
     } 

     imageView!.image = image 
    } 

    func setLabel(text: String) { 
     if self.textLabel == nil { 
      let textFrame = CGRect(x: 0, y: self.frame.height * 0.30, width: self.frame.width, height: self.frame.height) 
      self.textLabel = UILabel(frame: textFrame) 
      textLabel.font = UIFont(name:"Helvetica-Light", size: 14.0) 
      textLabel.textAlignment = .Center 
      textLabel.textColor = UIColor.whiteColor() 
     } 

     textLabel.text = text 
    } 
} 

Затем в cellForItemAtIndexPath:

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as ImageCell 

var cellImage = UIImage(named: categoryArray[indexPath.row].catImage) 
cell.setImage(cellImage) 
cell.setLabel(categoryArray[indexPath.row].category) 

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

0

Ну, так как он повторно использует ячейку, и поскольку вы добавляете subviews в ячейку при каждом вызове, у вас будет много перекрывающихся представлений в одной и той же ячейке!

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

+0

Поскольку я новичок в быстром и ios в целом, многие из этих вещей я не уверен, как это сделать. Я пытаюсь это сделать сейчас. – zillaofthegods

+0

Это должно быть легко, если вы понимаете проблему. Вы в основном повторно используете небольшое количество ячеек, а затем добавляете их в каждый раз при вызове cellForItemAtIndexPath. Таким образом, вместо добавления просмотров вам просто нужно установить свойства просмотров, которые вы уже добавили. Дайте мне знать, если вам нужна дополнительная помощь. – amahfouz

+0

Концептуально я понимаю проблему. Фактический код, чтобы сделать это, я не уверен. Я продолжу попробовать некоторые вещи – zillaofthegods

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