Je crée une application simple en utilisant Swift 5, Xcode 11 et un contrôleur de vue de table d'interface utilisateur. Dans la vue tableau de l'interface utilisateur, je veux 2 boutons: un bouton à gauche de ma vue tableau, l'autre à droite. J'ai essayé de nombreuses autres réponses à des questions similaires / similaires, mais elles ont toutes échoué (probablement parce que 1. Trop ancienne, 2. Réponse écrite en OBJ-C).
Voici mon contrôleur de vue de table:
import UIKit @objcMembers class CustomViewController: UITableViewController { var tag = 0 override func viewDidLoad() { super.viewDidLoad() } override func viewDidAppear(_ animated: Bool) { } override func numberOfSections(in tableView: UITableView) -> Int { // #warning Incomplete implementation, return the number of sections return 1 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } // 3 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { tag = tag + 1 let cell = tableView.dequeueReusableCell(withIdentifier: "themeCell", for: indexPath) as! ThemeCell var cellButton: UIButton! cellButton = UIButton(frame: CGRect(x: 5, y: 5, width: 50, height: 30)) cell.addSubview(cellButton) cell.img.image = UIImage(named: SingletonViewController.themes[indexPath.row]) cell.accessoryView = cellButton cellButton.backgroundColor = UIColor.red cellButton.tag = tag return cell } }
4 Réponses :
Au fur et à mesure que la cellule est réutilisée, vous devez mettre des boutons dans votre fichier xib. Vous ne devez pas créer un bouton à chaque fois et l'ajouter dans une cellule. Essayez ceci en ajoutant un bouton dans xib.
Vous pouvez obtenir un bouton d'alignement à droite et à gauche à partir de Contraintes Voici mon code pour aligner la vue à droite ou à gauche
override func viewDidLoad() { let leftButton = UIButton(type: .custom) leftButton.backgroundColor = UIColor.red self.view.addSubview(leftButton) leftButton.translatesAutoresizingMaskIntoConstraints = false let horizontalConstraint = leftButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20) let verticalConstraint = leftButton.centerYAnchor.constraint(equalTo: view.centerYAnchor) let widthConstraint = leftButton.widthAnchor.constraint(equalToConstant: 100) let heightConstraint = leftButton.heightAnchor.constraint(equalToConstant: 100) NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint]) let rightButton = UIButton(type: .custom) rightButton.backgroundColor = UIColor.red self.view.addSubview(rightButton) rightButton.translatesAutoresizingMaskIntoConstraints = false let horizontalConstraintRight = rightButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20) let verticalConstraintRight = rightButton.centerYAnchor.constraint(equalTo: view.centerYAnchor) let widthConstraintRight = rightButton.widthAnchor.constraint(equalToConstant: 100) let heightConstraintRight = rightButton.heightAnchor.constraint(equalToConstant: 100) NSLayoutConstraint.activate([horizontalConstraintRight, verticalConstraintRight, widthConstraintRight, heightConstraintRight]) }
Encore une chose, pourquoi le bouton sort-il de la ligne dans la cellule de vue de tableau? (Mon bouton sort de la ligne de ma vue de tableau lorsque je l'ai testé)
hors de la ligne? moyens ?
hors de la ligne verticalement?
ajoutez ci-dessous le code pour appliquer la contrainte
let cellButton = UIButton(frame: CGRect.zero) cellButton.translatesAutoresizingMaskIntoConstraints = false cell.addSubview(cellButton) cell.accessoryView = cellButton cellButton.backgroundColor = UIColor.red cellButton.leadingAnchor.constraint(equalTo: cell.leadingAnchor, constant: 5).isActive = true cellButton.topAnchor.constraint(equalTo: cell.topAnchor, constant: 5).isActive = true cellButton.widthAnchor.constraint(equalToConstant: 50).isActive = true cellButton.heightAnchor.constraint(equalToConstant: 30).isActive = true
Lorsque vous définissez cellButton.translatesAutoresizingMaskIntoConstraints = false
, le paramètre de cadre est ignoré, il n'a aucun effet
oui vous avez raison, vous pouvez simplement définir comme UIButton (cadre: CGRect.zero)
class ThemeCell: UITableViewCell { //MARK:- Initialize View private let button : UIButton = { let button = UIButton() button.setTitle("Hello", .normal) button.backgroundColor = .red button.translatesAutoresizingMaskIntoConstraints = false return button }() //MARK:- View Life Cycle required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) setup() } override func awakeFromNib() { super.awakeFromNib() } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) selectionStyle = .none } //MARK:- User Defined Function private func setup() { addSubView(button) button.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 20).isActive = true button.topAnchor.constraint(equalTo: topAnchor, constant: 20).isActive = true button.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -20).isActive = true } } You can use AutoLayout Constraints like this to setup the button. No need to call it in the cellForRow method.
partagez la capture d'écran de ce que vous recevez actuellement.
pourquoi n'ajoutez-vous pas ces boutons avec le fichier .xib "themeCell"?
@ iOSArchitect.com Voir mes modifications
essayez comme ça cell.contentView.addSubview (cellButton) peut-être fonctionner
@RuchiMakadia Cela ne semble pas fonctionner
@Aamir, la raison pour laquelle je ne le fais pas est qu'après avoir défini les contraintes pour le bouton, je ne peux voir la vue de l'image que dans des tailles d'appareils spécifiques. C'est étrange.
vérifie ma réponse