UITableview 自动调整行问题 Swift IOS?
UITableview Auto Adjust Row Issue Swift IOS?
我在动态调整 UITableView
行高时遇到了一个问题。我知道通过使用这种方法我们可以实现
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
但在我的例子中,我为 UITableViewCell
使用 XIB
文件,并且我正在为单元格添加阴影。在这种情况下如何动态添加行高。同时,根据服务器时间我显示和隐藏按钮。所以请任何人都可以建议我如何解决这个问题。这是我的行索引方法单元格。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "Custom"
var cell: PApplyLeaveTableViewCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? PApplyLeaveTableViewCell
if cell == nil {
tableView.register(UINib(nibName: "PApplyLeaveTableViewCell", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? PApplyLeaveTableViewCell
}
cell.selectionStyle = UITableViewCellSelectionStyle.none
cell.contentView.backgroundColor = UIColor.clear
var localDic :NSDictionary!
localDic = totlLeavesArray.object(at: indexPath.row) as! NSDictionary
cell.acknowled_lbl.text = localDic["acknowledgement"] as? String
cell.date_lbl.text = localDic["totalDate"] as? String
cell.reason_lbl.text = localDic["reason"] as? String
let compareDate = localDic["compare"] as? String
if(compareDate == "No")
{
cell.delet_Btn.isHidden = true
cell.edit_Btn.isHidden = true
}
else
{
cell.delet_Btn.isHidden = false
cell.edit_Btn.isHidden = false
}
cell.edit_Btn.tag = indexPath.row
cell.edit_Btn.addTarget(self, action: #selector(PApplyLeaveViewController.EditViewAction(_:)), for:.touchUpInside)
cell.delet_Btn.tag = indexPath.row
cell.delet_Btn.addTarget(self, action: #selector(PApplyLeaveViewController.DeleteAction(_:)), for:.touchUpInside)
let whiteRoundedView : UIView = UIView(frame: CGRect(x: 5, y: 8, width: self.view.frame.size.width - 15, height: 220))
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)
cell.contentView.backgroundColor = UIColor.clear
return cell
}
通过 AutoLayout 约束然后 Build 和 运行
设置标签框架
所以我假设这里的问题是细胞停留在它们估计的 44 点高度。您遇到的问题是,尽管单元格的子视图可能会发生变化,但与单元格框架大小本身没有任何关系。例如,您将 whiteRoundedView 设置为特定大小,但这将如何影响单元格本身的大小。
有两种基本方法可以处理这种情况:
1) 不要使用单元格的动态高度,而是使用此方法根据应用程序状态确定每个单元格的高度
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
2) 切换到使用自动布局和设置约束将单元格大小与其内容相关联。
另一点最终会反咬你一口,那就是每次系统需要包含现有单元出队时的单元时,你都会添加一个 whiteRoundedView。出列的单元格在创建时已经添加了 whiteRoundedView。您真的想将该代码移动到您创建单元格的位置,如下所示:
if cell == nil {
tableView.register(UINib(nibName: "PApplyLeaveTableViewCell", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? PApplyLeaveTableViewCell
let whiteRoundedView : UIView = UIView(frame: CGRect(x: 5, y: 8, width: self.view.frame.size.width - 15, height: 220))
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)
cell.contentView.backgroundColor = UIColor.clear
}
这样只添加一次。
事实上,如果您使用的是 XIB,为什么不在其中设置阴影视图,然后调整参数。
我通过设置约束值解决了我的问题。我将标签底部约束设置为 "bottom space to container"。这是我处理按钮显示和隐藏的代码。但我无法相应地修复行高。但不知何故我正在解决设计问题。
if compareDateString == currentDateString
{
cell.delete_Btn.isHidden = true
cell.edit_Btn.isHidden = true
cell.bottomConstraint.constant = 30
}
else if compareDateString! < currentDateString
{
cell.delete_Btn.isHidden = true
cell.edit_Btn.isHidden = true
cell.bottomConstraint.constant = 30
}
else
{
cell.delete_Btn.isHidden = false
cell.edit_Btn.isHidden = false
cell.bottomConstraint.constant = 45
}
我在动态调整 UITableView
行高时遇到了一个问题。我知道通过使用这种方法我们可以实现
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0;
但在我的例子中,我为 UITableViewCell
使用 XIB
文件,并且我正在为单元格添加阴影。在这种情况下如何动态添加行高。同时,根据服务器时间我显示和隐藏按钮。所以请任何人都可以建议我如何解决这个问题。这是我的行索引方法单元格。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "Custom"
var cell: PApplyLeaveTableViewCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? PApplyLeaveTableViewCell
if cell == nil {
tableView.register(UINib(nibName: "PApplyLeaveTableViewCell", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? PApplyLeaveTableViewCell
}
cell.selectionStyle = UITableViewCellSelectionStyle.none
cell.contentView.backgroundColor = UIColor.clear
var localDic :NSDictionary!
localDic = totlLeavesArray.object(at: indexPath.row) as! NSDictionary
cell.acknowled_lbl.text = localDic["acknowledgement"] as? String
cell.date_lbl.text = localDic["totalDate"] as? String
cell.reason_lbl.text = localDic["reason"] as? String
let compareDate = localDic["compare"] as? String
if(compareDate == "No")
{
cell.delet_Btn.isHidden = true
cell.edit_Btn.isHidden = true
}
else
{
cell.delet_Btn.isHidden = false
cell.edit_Btn.isHidden = false
}
cell.edit_Btn.tag = indexPath.row
cell.edit_Btn.addTarget(self, action: #selector(PApplyLeaveViewController.EditViewAction(_:)), for:.touchUpInside)
cell.delet_Btn.tag = indexPath.row
cell.delet_Btn.addTarget(self, action: #selector(PApplyLeaveViewController.DeleteAction(_:)), for:.touchUpInside)
let whiteRoundedView : UIView = UIView(frame: CGRect(x: 5, y: 8, width: self.view.frame.size.width - 15, height: 220))
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)
cell.contentView.backgroundColor = UIColor.clear
return cell
}
通过 AutoLayout 约束然后 Build 和 运行
设置标签框架所以我假设这里的问题是细胞停留在它们估计的 44 点高度。您遇到的问题是,尽管单元格的子视图可能会发生变化,但与单元格框架大小本身没有任何关系。例如,您将 whiteRoundedView 设置为特定大小,但这将如何影响单元格本身的大小。
有两种基本方法可以处理这种情况:
1) 不要使用单元格的动态高度,而是使用此方法根据应用程序状态确定每个单元格的高度
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
2) 切换到使用自动布局和设置约束将单元格大小与其内容相关联。
另一点最终会反咬你一口,那就是每次系统需要包含现有单元出队时的单元时,你都会添加一个 whiteRoundedView。出列的单元格在创建时已经添加了 whiteRoundedView。您真的想将该代码移动到您创建单元格的位置,如下所示:
if cell == nil {
tableView.register(UINib(nibName: "PApplyLeaveTableViewCell", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? PApplyLeaveTableViewCell
let whiteRoundedView : UIView = UIView(frame: CGRect(x: 5, y: 8, width: self.view.frame.size.width - 15, height: 220))
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)
cell.contentView.backgroundColor = UIColor.clear
}
这样只添加一次。
事实上,如果您使用的是 XIB,为什么不在其中设置阴影视图,然后调整参数。
我通过设置约束值解决了我的问题。我将标签底部约束设置为 "bottom space to container"。这是我处理按钮显示和隐藏的代码。但我无法相应地修复行高。但不知何故我正在解决设计问题。
if compareDateString == currentDateString
{
cell.delete_Btn.isHidden = true
cell.edit_Btn.isHidden = true
cell.bottomConstraint.constant = 30
}
else if compareDateString! < currentDateString
{
cell.delete_Btn.isHidden = true
cell.edit_Btn.isHidden = true
cell.bottomConstraint.constant = 30
}
else
{
cell.delete_Btn.isHidden = false
cell.edit_Btn.isHidden = false
cell.bottomConstraint.constant = 45
}