Pour mon application, j'utilise un TableView et j'utilise des UITableViewCells personnalisés.
J'ai personnalisé mes cellules via le constructeur d'interface, pas par programme. Existe-t-il un moyen de transformer également la couleur d'arrière-plan de ma cellule personnalisée en dégradé dans le générateur d'interface?
Merci.
Cela fonctionne pour Swift 3.0: (mis à jour pour Swift 4.0)
@IBDesignable
final class GradientView: UIView {
@IBInspectable var startColor: UIColor = UIColor.clear
@IBInspectable var endColor: UIColor = UIColor.clear
override func draw(_ rect: CGRect) {
let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = CGRect(x: CGFloat(0),
y: CGFloat(0),
width: superview!.frame.size.width,
height: superview!.frame.size.height)
gradient.colors = [startColor.cgColor, endColor.cgColor]
gradient.zPosition = -1
layer.addSublayer(gradient)
}
}
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = yourView.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id) [[UIColor whiteColor] CGColor], nil];
[yourView.layer insertSublayer:gradient atIndex:0];
Oui, cela est possible: créez une image en dégradé avec 1 X Height pix . Réglez-le sur backgroundColor pour cellule.
cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"gradImage.png"]];
** Vous pouvez définir une couleur de dégradé avec du code mais son processus prend du temps. Si vous remplissez mieux alors cherchez cela.
answer by etayluz fonctionne bien mais j'ai ajouté quelques modifications:
Supprimez le calque Dégradé à chaque dessin, afin d'éviter de continuer à dessiner et d'ajouter un nouveau calque lorsque le redessinage est nécessaire (par exemple en appelant .setNeedsDisplay()
en rotation).
@IBDesignable final class MFGradientView: UIView {
@IBInspectable var startColor: UIColor = UIColor.clear
@IBInspectable var endColor: UIColor = UIColor.clear
override func draw(_ rect: CGRect) {
layer.sublayers?.first?.removeFromSuperlayer()
let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = CGRect(Origin: CGPoint.zero, size: self.bounds.size)
gradient.colors = [startColor.cgColor, endColor.cgColor]
layer.insertSublayer(gradient, at: 0)
}
}
Sur la base de la réponse etayluz, j'ai légèrement modifié le code en prenant en compte la propriété layerClass d'un UIView. Vous n'avez donc pas besoin d'un calque séparé en tant que sous-couche.
Je pense que c'est beaucoup plus propre et que cela fonctionne aussi avec les mises à jour en direct dans Interface Builder.
@IBDesignable final class GradientView: UIView {
@IBInspectable var startColor: UIColor = UIColor.red
@IBInspectable var endColor: UIColor = UIColor.blue
override class var layerClass: AnyClass {
get {
return CAGradientLayer.self
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setupGradient()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupGradient()
}
private func setupGradient() {
let gradient = self.layer as! CAGradientLayer
gradient.colors = [startColor.cgColor, endColor.cgColor]
}
}
Je ne sais pas s'il existe une option de dégradé, mais vous pouvez ajouter UIImageView à la cellule personnalisée et ajouter une image avec un dégradé.
Créez une classe de vue simple avec les propriétés @IBInspectable.
...
//
// GradientView.Swift
//
// Created by Maksim Vialykh on 23.08.2018.
// Copyright © 2018 Vialyx. All rights reserved.
//
import UIKit
class GradientView: UIView {
@IBInspectable
var startColor: UIColor = .white
@IBInspectable
var endColor: UIColor = .black
private let gradientLayerName = "Gradient"
override func layoutSubviews() {
super.layoutSubviews()
setupGradient()
}
private func setupGradient() {
var gradient: CAGradientLayer? = layer.sublayers?.first { $0.name == gradientLayerName } as? CAGradientLayer
if gradient == nil {
gradient = CAGradientLayer()
gradient?.name = gradientLayerName
layer.addSublayer(gradient!)
}
gradient?.frame = bounds
gradient?.colors = [startColor.cgColor, endColor.cgColor]
gradient?.zPosition = -1
}
}