繁体   English   中英

以编程方式将按钮与 UITableView 单元格的左侧对齐 Swift

[英]Align Button To Left Side Of UITableView Cell Programmatically Swift

我正在使用 Swift 5、Xcode 11 和一个 ui 表视图控制器创建一个简单的应用程序。 在 ui 表视图中,我想要 2 个按钮:一个按钮在我的表视图左侧,另一个在右侧。 我尝试了许多其他相关/类似问题的答案,但都失败了(可能是因为 1. 太旧了,2. 用 OBJ-C 编写的答案)。

这是我的表视图控制器:


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
    }

}

这是我目前得到的: IMG

添加以下代码以应用约束有效

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

您可以从约束中实现左右对齐按钮。 下面是我的代码向右或向左对齐视图。

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])
        
        
    }

[![左右对齐视图约束][1]][1][1]:https://i.stack.imgur.com/tMJ8N.jpg

随着单元格被重用,您必须将按钮放入您的 xib 文件中。 您不应该每次都制作一个按钮并将其添加到单元格中。 通过在 xib 中添加一个按钮来试试这个。

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


}
}

您可以像这样使用 AutoLayout Constraints 来设置按钮。 无需在cellForRow方法中调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM