0

私はUICollectionViewCellにグラデーションサブビューを持っています。 私のビューコントローラには、CoreDataをソートするボタンがあり、はUICollectionViewにあります。 グラデーションのサブビューが何度も何度も描画されるのを避けるため、prepareForReuse()removeFromSuperview()を実装します。 そこには、グラディエントの存在を追跡するフラグも実装されているので、セルがロードされているときでも新しいグラデーションが追加されます。 ただし、グラデーションを削除した後、私のwillMove(toSuperview:)は機能せず、グラデーションビューも表示されません。 私のロジックに何が問題なのですか?サブビューを削除してから追加する

class CollectionCell: UICollectionViewCell { 

@IBOutlet weak var mealImg: UIImageView! 
@IBOutlet weak var mealTitleLbl: UILabel! 
@IBOutlet weak var gradientView: UIView! 

var gradientWasRemoved = false 

func configureCell(meal: Meal) { 
    mealTitleLbl.text = meal.title 

    let img = meal.getMealImage() 
    mealImg.image = img 

    addGradient()  
} 

    func addGradient() { 
    let gradient = CAGradientLayer() 
    gradient.frame = gradientView.bounds 
    let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1) 
    let botomColor = UIColor.clear 
    gradient.colors = [topColor.cgColor, botomColor.cgColor] 
    gradientView.layer.insertSublayer(gradient, at: 0) 

    if gradientWasRemoved == true { 
     gradientView.willMove(toSuperview: self) 
    } 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 

    gradientView.removeFromSuperview() 
    gradientWasRemoved = true 
} 
} 
+0

http://stackoverflow.com/questions/24380535/how-to-apply-gradient-to-background-view-of-ios-swift-app/37243106#37243106 –

+0

私の意見では、あなたの 'gradientView'は'weak'と' gradientView.removeFromSuperview() 'を呼び出した後はゼロになります。 – nynohu

+0

グラデーションビューが追加されていないと言っていますか?たぶん、あなたはそれを追加することができないので、セル上でaddSubviewを呼び出す必要があるかもしれません。 – Luis

答えて

0

ロジックを次のように修正できました。 UICollectionViewCellクラスで :prepareForReuse()

import UIKit 

class CollectionCell: UICollectionViewCell { 

@IBOutlet weak var mealImg: UIImageView! 
@IBOutlet weak var gradientView: UIView! 

@IBOutlet weak var mealTitleLbl: UILabel! 

var gradientWasRemoved = false 

func configureCell(meal: Meal) { 
    mealTitleLbl.text = meal.title 

    let img = meal.getMealImage() 
    mealImg.image = img 

    addGradient() 
} 

    func addGradient() { 

    let gradient = CAGradientLayer() 
    gradient.frame = gradientView.bounds 
    let topColor = UIColor(red:0.07, green:0.07, blue:0.07, alpha:1) 
    let botomColor = UIColor.clear 
    gradient.colors = [topColor.cgColor, botomColor.cgColor] 

    if gradientWasRemoved == false { 
    gradientView.layer.insertSublayer(gradient, at: 0) 
    } else if gradientWasRemoved == true { 
     self.addSubview(gradientView) 
    } 
} 

override func prepareForReuse() { 
    super.prepareForReuse() 

    gradientView.removeFromSuperview() 
    gradientWasRemoved = true 
} 

} 

私はgradientViewを削除しませんでした、私はスーパービューからそれを削除しました。私はそれが削除されたことをそこにフラグを設定します。 nil私のgradientViewを実行したので、を実行し、gradientView.boundsにアクセスして新しいCGGradientLayerを作成することができました。 gradientViewに新しいレイヤーを追加する直前に、私はifのチェックを行いました。 gradientViewを削除した場合は、新しいCGGradientLayerを追加しませんが、単にgradientViewを戻します。 この方法では、CGGradientLayerをグラデーションビューに1回追加します。

私はSuperviewからビューを削除することによって、それらがまだ生きていて編集できることを知りました。

@Luisと@LeoDabusありがとうございました。

関連する問題