Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-在水平视图中获取所有可用空间_Ios_Swift_Uiview_Uilabel_Uistackview - Fatal编程技术网

iOS-在水平视图中获取所有可用空间

iOS-在水平视图中获取所有可用空间,ios,swift,uiview,uilabel,uistackview,Ios,Swift,Uiview,Uilabel,Uistackview,我有一个UITableViewCell,它包含一个水平UIStackView。UIStackView按以下顺序包含四个视图 UIImageView UILabel UILabel UIImageView 在排列的子视图之后有16个点间距。我希望第二个UILabel占用所有可用空间。如果没有足够的空间,文本应该换行 我使用了以下代码。它几乎可以工作。问题在于,即使如所附屏幕截图所示,UILabel之间有足够的空间,第二个UILabel仍会中断。但我希望它只有在没有足够空间的情况下才会破

我有一个
UITableViewCell
,它包含一个水平
UIStackView
UIStackView
按以下顺序包含四个视图

UIImageView   UILabel    UILabel UIImageView
排列的子视图之后有
16个点
间距。我希望第二个UILabel占用所有可用空间。如果没有足够的空间,文本应该换行

我使用了以下代码。它几乎可以工作。问题在于,即使如所附屏幕截图所示,
UILabel
之间有足够的空间,第二个
UILabel
仍会中断。但我希望它只有在没有足够空间的情况下才会破裂



如何解决此问题,使单元格看起来像下图中的单元格

尝试返回1

let trailingLabel: UILabel = {
        let label = UILabel()
        label.text = "Friday, 17 July 2020"
        label.textColor = .label
        label.numberOfLines = 1
        label.textAlignment = .right
        return label
    }()
你很接近

首先,将堆栈视图的分布设置为按比例填充是最容易被误解的分布选项,您不想在这里使用它

第二,在设计时使用对比背景可以很容易地看到你的框架在做什么,这非常有帮助

这是您的代码,经过修改以达到您的目标。我没有您的“约束助手”,所以我将其更改为标准约束格式。我还添加了一些评论以进行澄清:

class TableViewCell: UITableViewCell {
    
    static let identifier = "TableViewCell"
    
    private let leadingImageView: UIImageView = {
        let view = UIImageView(image: UIImage(systemName: "calendar"))
        view.translatesAutoresizingMaskIntoConstraints = false
        
        //view.setConstraints(heightConstant: 25, widthConstant: 25)
        view.widthAnchor.constraint(equalToConstant: 25).isActive = true
        view.heightAnchor.constraint(equalToConstant: 25).isActive = true

        view.tintColor = .blue // .text
        return view
    }()
    
    private let leadingLabel: UILabel = {
        let label = UILabel()
        label.textColor = .label
        label.text = "Start Date"
        // only single line for "leading label"
        label.numberOfLines = 1
        // content hugging
        label.setContentHuggingPriority(.required, for: .horizontal)
        label.backgroundColor = .cyan
        return label
    }()
    
    let trailingLabel: UILabel = {
        let label = UILabel()
        label.text = "Friday, 17 July 2020"
        label.textColor = .label
        label.numberOfLines = 0
        label.textAlignment = .right
        label.backgroundColor = .green
        return label
    }()
    
    let trailingImageView: UIImageView  = {
        let configuration = UIImage.SymbolConfiguration(pointSize: 12, weight: .light)
        let image = UIImage(systemName: "arrowtriangle.down", withConfiguration: configuration)
        let view = UIImageView(image: image)
        return view
    }()
    
    private let superStackView: UIStackView = {
        let view = UIStackView()
        view.translatesAutoresizingMaskIntoConstraints = false
        // do NOT use .fillProportionally
        view.distribution = .fill
        view.alignment = .center
        view.spacing = 16
        return view
    }()
    
    private  let containerView: UIView = {
        let view = UIView()
        // not needed
        //view.setContentHuggingPriority(.defaultHigh, for: .horizontal)
        //view.setContentHuggingPriority(.defaultHigh, for: .vertical)
        return view
    }()
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setUpSubviews()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}
extension TableViewCell {
    private  func setUpSubviews(){
        containerView.addSubview(trailingImageView)
        //trailingImageView.alignCenter(centerXAnchor: containerView.centerXAnchor,
        //                            centerYAnchor: containerView.centerYAnchor)
        
        superStackView.addArrangedSubview(leadingImageView)
        superStackView.addArrangedSubview(leadingLabel)
        superStackView.addArrangedSubview(trailingLabel)
        superStackView.addArrangedSubview(containerView)
        
        let constant = CGFloat(16)
        
        self.addSubview(superStackView)
        self.contentView.addSubview(superStackView)
        //superStackView.setConstraints(topAnchor: contentView.topAnchor, leadingAnchor: contentView.leadingAnchor,
        //                            bottomAnchor: contentView.bottomAnchor, trailingAnchor: contentView.trailingAnchor,
        //                            topConstant: constant, leadingConstant: constant, bottomConstant: constant, trailingConstant: constant)
        
        NSLayoutConstraint.activate([
            
            trailingImageView.centerXAnchor.constraint(equalTo: containerView.centerXAnchor),
            trailingImageView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor),
            
            superStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: constant),
            superStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: constant),
            superStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -constant),
            superStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -constant),

        ])

        // not needed
        //self.contentView.updateConstraints()
        
    }
}

以及,示例视图控制器:

class MahanTableViewController: UITableViewController {
    
    var myData: [String] = [
        "Saturday, 18 July 2020",
        "Sunday, 19 July 2020",
        "Wednesday, 22 July 2020",
        "Saturday, 26 September 2020",
        "Sunday, 27 September 2020",
        "Wednesday, 30 September 2020",
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(TableViewCell.self, forCellReuseIdentifier: TableViewCell.identifier)
        
    }
    
    // MARK: - Table view data source
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myData.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell
        
        cell.trailingLabel.text = myData[indexPath.row]
        
        return cell
    }
    
}
生成此输出:


不,它不工作。如果没有足够的位置,我需要文本换行。我不想缩小字体大小。好的。。。如果文本增加,你想要什么?还有什么选择?字体比例、包装文本或多行。。。默认情况下选择一行,不换行,只选择一行。如果两个标签之间的间距小于16点,则为多行文字。请在“视图层次结构”中进行检查,查看发生了什么情况。。你能发送演示项目进行测试吗?
class MahanTableViewController: UITableViewController {
    
    var myData: [String] = [
        "Saturday, 18 July 2020",
        "Sunday, 19 July 2020",
        "Wednesday, 22 July 2020",
        "Saturday, 26 September 2020",
        "Sunday, 27 September 2020",
        "Wednesday, 30 September 2020",
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(TableViewCell.self, forCellReuseIdentifier: TableViewCell.identifier)
        
    }
    
    // MARK: - Table view data source
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myData.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell
        
        cell.trailingLabel.text = myData[indexPath.row]
        
        return cell
    }
    
}