Je crée une application ios dans Swift et souhaite ajouter un espacement entre des cellules comme Facebook (photo ci-dessous).
J'utilise une pointe personnalisée pour les messages. Je sais utiliser UITableViewController. Je pense que j'utiliserais un style de séparation mais cela ne produirait pas l'effet. Je suis resté bouche bée pendant des heures et je ne trouve pas un seul tutoriel logique pour Swift! Quelqu'un pourrait-il expliquer comment ils l'ont fait dans leur application en utilisant Swift? Merci!
Ceci est ma solution avec résultat: (basé sur la réponse de Jorge Casariego)
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomApplicationCell
cell.contentView.backgroundColor = UIColor.clear
let whiteRoundedView : UIView = UIView(frame: CGRectMake(10, 8, self.view.frame.size.width - 20, 149))
whiteRoundedView.layer.backgroundColor = CGColorCreate(CGColorSpaceCreateDeviceRGB(), [1.0, 1.0, 1.0, 0.8])
whiteRoundedView.layer.masksToBounds = false
whiteRoundedView.layer.cornerRadius = 2.0
whiteRoundedView.layer.shadowOffset = CGSizeMake(-1, 1)
whiteRoundedView.layer.shadowOpacity = 0.2
cell.contentView.addSubview(whiteRoundedView)
cell.contentView.sendSubviewToBack(whiteRoundedView)
return cell
}
hauteur de la rangée de la table: 165 points
hauteur de la section d'en-tête, hauteur de la section du pied de page: 10 points
et résultat
Edit For Swift 3 Syntax:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomApplicationCell
cell.contentView.backgroundColor = UIColor.clear
let whiteRoundedView : UIView = UIView(frame: CGRect(x: 10, y: 8, width: self.view.frame.size.width - 20, height: 120))
whiteRoundedView.layer.backgroundColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1.0, 1.0, 1.0, 0.9])
whiteRoundedView.layer.masksToBounds = false
whiteRoundedView.layer.cornerRadius = 2.0
whiteRoundedView.layer.shadowOffset = CGSize(width: -1, height: 1)
whiteRoundedView.layer.shadowOpacity = 0.2
cell.contentView.addSubview(whiteRoundedView)
cell.contentView.sendSubview(toBack: whiteRoundedView)
return cell
}
Voici un nouveau moyen d'afficher des vues sous forme de carte de matériau:
Créer CardView.Swift
@IBDesignable
class CardView: UIView {
@IBInspectable var cornerRadius: CGFloat? = 5
@IBInspectable var shadowOffsetWidth: Int? = 0
@IBInspectable var shadowOffsetHeight: Int? = 2
@IBInspectable var shadowColor: UIColor? = .black
@IBInspectable var shadowOpacity: Float? = 0.3
override func layoutSubviews() {
layer.cornerRadius = cornerRadius!
let shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius!)
layer.masksToBounds = false
layer.shadowColor = shadowColor?.cgColor
layer.shadowOffset = CGSize(width: shadowOffsetWidth!, height: shadowOffsetHeight!);
layer.shadowOpacity = shadowOpacity!
layer.shadowPath = shadowPath.cgPath
}
}
Ajoutez maintenant la classe CardView à votre UIView.
Avec Swift 2, vous pouvez effectuer l’espacement entre UITableViewCells de la manière suivante:
Dans votre TableViewController, copiez ceci:
// In this case I returning 140.0. You can change this value depending of your cell
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 140.0
}
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.contentView.backgroundColor = UIColor.clearColor()
let whiteRoundedView : UIView = UIView(frame: CGRectMake(0, 10, self.view.frame.size.width, 120))
whiteRoundedView.layer.backgroundColor = CGColorCreate(CGColorSpaceCreateDeviceRGB(), [1.0, 1.0, 1.0, 1.0])
whiteRoundedView.layer.masksToBounds = false
whiteRoundedView.layer.cornerRadius = 2.0
whiteRoundedView.layer.shadowOffset = CGSizeMake(-1, 1)
whiteRoundedView.layer.shadowOpacity = 0.2
cell.contentView.addSubview(whiteRoundedView)
cell.contentView.sendSubviewToBack(whiteRoundedView)
}
Voici le résultat:
J'ai passé au moins une heure à étudier le sujet. Enfin, j'ai eu l'idée d'utiliser une bordure transparente:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "faqCell", for: indexPath)
// ...
cell.layer.borderWidth = CGFloat(TABLE_CELLSPACING)
cell.layer.borderColor = tableView.backgroundColor?.cgColor
return cell
}
Cela fonctionne parfaitement dans Swift 3/Xcode 8.
Si vous voulez un espacement correct/légal, pas une astuce, vous pouvez essayer UICollectionView au lieu de UITableView.
UICollectionView est plus générique que UITableView et vous pouvez personnaliser ce que vous voulez.
Il y a beaucoup de bonnes réponses ici.
Le moyen le plus simple que j'ai trouvé était de créer une vue conteneur dans la contentView de la cellule dans Interface Builder. Ensuite, placez le contenu significatif de toutes vos cellules à l'intérieur et limitez-vous à cette vue.
Limitez la vue du conteneur en fonction de vos besoins en matière de remplissage.
Quelque chose comme:
Ensuite, dans votre tableViewCellForRow, ajoutez ce qui suit (en supposant que votre sortie de vue conteneur s'appelle containerView).
currentCell.containerView?.layer.cornerRadius = 8 // Your choice here.
currentCell.containerView?.clipsToBounds = true
// Ajoute des bordures, des ombres, etc. si tu veux.
Ressemble à
Version Objective-C pour le code Jorge Casariego Swift:
//play with the 'y' parameter of the whiteRoundedView to change the spacing
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.contentView.backgroundColor = [UIColor colorWithRed:225/255.0 green:225/255.0 blue:225/255.0 alpha:1.0];
UIView *whiteRoundedView = [[UIView alloc]initWithFrame:CGRectMake(5, 2, self.view.frame.size.width-10, cell.contentView.frame.size.height)];
CGFloat colors[]={1.0,1.0,1.0,1.0};//cell color white
whiteRoundedView.layer.backgroundColor = CGColorCreate(CGColorSpaceCreateDeviceRGB(), colors);
whiteRoundedView.layer.masksToBounds = false;
whiteRoundedView.layer.cornerRadius = 5.0;
whiteRoundedView.layer.shadowOffset = CGSizeMake(-1, 1);
whiteRoundedView.layer.shadowOpacity = 0.2;
[cell.contentView addSubview:whiteRoundedView];
[cell.contentView sendSubviewToBack:whiteRoundedView];
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
//assign the right cell identifier
UITableViewCell *cell = [[self tableView]dequeueReusableCellWithIdentifier:CellIdentifier];
return cell.bounds.size.height;
}
J'ai créé une sous-classe de UITableViewCell et un fichier nib pour l'accompagner. Faites glisser un UIView dans le contentView de la cellule et commencez par lui donner la même taille que contentView. Cela agira comme un conteneur et deviendra le "nouveau" contentView. Vous pouvez y mettre ce dont vous avez besoin, comme vous le feriez normalement dans le contentView d'un UITableViewCell.
Vous pouvez maintenant ajuster la hauteur de la vue du conteneur pour laisser l'espacement souhaité au bas de la cellule. Enfin, changez la couleur de fond de contentView en clearColor, ce qui complétera l'effet.
code pour Swift 4
override var frame: CGRect {
get {
return super.frame
}
set (newFrame) {
var frame = newFrame
frame.Origin.y += 4
frame.size.height -= 2 * 5
super.frame = frame
}
}