UITableViewCell中:
cell.detailTextLabel?.textColor = ColorConversationDetailText cell.detailTextLabel?.font = FontConversationDetailText cell.detailTextLabel?.textAlignment = NSTextAlignment.Left cell.detailTextLabel?.text = "[张杰@我]工作完成的怎么样了"
已经可以实现这样的效果了:
想要实现这样的:
即:
UITableViewCell的detailText,部分是红色的,部分是灰色的
-》无法直接给,整个的detailTex去设置单一的颜色
自己先去试试:
看看直接加contentView看看是否可行
经过一番调整后,是可以通过contentView中显示的:
let atMeStr:String = "[张杰@我]" let detailStr:String = "工作完成的怎么样了" cell.detailTextLabel?.text = atMeStr cell.detailTextLabel?.textColor = UIColor.redColor() let detailStrLabel:UILabel = UILabel(frame: CGRectMake( 130, 28, 80, 20)) detailStrLabel.text = detailStr detailStrLabel.font = cell.detailTextLabel?.font detailStrLabel.textColor = UIColor.grayColor() //detailStrLabel.center.y = (cell.detailTextLabel?.center.y)! print("cell.detailTextLabel?.frame=\(cell.detailTextLabel?.frame)") cell.contentView.addSubview(detailStrLabel)
效果是:
但是,还是希望:
精确的,智能的调整位置
-》就需要计算,atMe部分之后的y值,以及detailText的x值了
-》但是经过调试,发现此时的
cell.detailTextLabel?.frame=Optional((0.0, 0.0, 0.0, 0.0))
没发拿到真正的位置
-》另外,由于是:UIViewController
-》也没有:
override fun layoutSubviews
-》没法在layoutSubviews中去调节位置。
搜:
swift UITableViewCell detailtext frame
参考:
ios – How to change UITableView Cell text width in Swift – Stack Overflow
iphone – uitableviewcell textlabel too long and push detailtextlabel out of view – Stack Overflow
实在不行,再去继承UITableViewCell吧。。。
Swift-AutoLayout system UITableViewCell – CSDN博客
去看UITableViewDelegate,里面有个:
public protocol UITableViewDelegate : NSObjectProtocol, UIScrollViewDelegate { // Display customization @available(iOS 2.0, *) optional public func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) @available(iOS 6.0, *)
-》
UITableViewDelegate Protocol Reference
看到官网解释:
好像是在willDisplayCell之后,才设置对应的frame的
-》貌似在willDisplayCell时,frame还是空的0的值?
去试试:
如果不是,则可以设置detailText的值了
如果时0,则还是没办法设置正确的位置。
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath){ print("willDisplayCell indexPath = \(indexPath)") switch indexPath.row{ case 4: print("cell.detailTextLabel?.frame=\(cell.detailTextLabel?.frame)") print("cell.detailTextLabel?.frame=\(cell.detailTextLabel?.frame)") default: break } }
输出log为:
willDisplayCell indexPath = <NSIndexPath: 0x7bec65a0> {length = 2, path = 0 – 4}
cell.detailTextLabel?.frame=Optional((71.0, 30.0, 56.0, 14.5))
cell.detailTextLabel?.frame=Optional((71.0, 30.0, 56.0, 14.5)) |
-》说明是:
willDisplayCell中,已经计算好了frame
-》此时就可以真正的计算和调整对应的位置了。
然后用代码:
let atMeStr:String = "[张杰@我]" let atMeStrWidth:CGFloat = calcLabelTextSize(atMeStr, font: (cell.detailTextLabel?.font)!).width print("atMeStrWidth=\(atMeStrWidth)") let detailStr:String = "工作完成的怎么样了" let detailStrSize:CGSize = calcLabelTextSize(detailStr, font: (cell.detailTextLabel?.font)!) print("detailStrSize=\(detailStrSize)") cell.detailTextLabel?.text = atMeStr cell.detailTextLabel?.textColor = UIColor.redColor() // print("cell.contentView.frame=\(cell.contentView.frame)") // print("cell.contentView.bounds=\(cell.contentView.bounds)") let detailStrLabel:UILabel = UILabel(frame: CGRectMake( atMeStrWidth,//61,//130, 0,//28, detailStrSize.width,//80, detailStrSize.height))//20)) detailStrLabel.text = detailStr detailStrLabel.font = cell.detailTextLabel?.font detailStrLabel.textColor = UIColor.grayColor() //detailStrLabel.center.y = (cell.detailTextLabel?.center.y)! print("cell.detailTextLabel?.frame=\(cell.detailTextLabel?.frame)") cell.detailTextLabel?.addSubview(detailStrLabel) //cell.contentView.addSubview(detailStrLabel)
即可实现对应的效果:
不过还有个小问题:
对于detailText的宽度,是不能超过accessory的最后发布日期的位置的,所以继续去优化。
[总结]
此处想要实现UITableViewCell的detailText中,额外添加一个Label的text使得颜色是不一样的红色,解决办法是:
可以直接把另外那个红色或灰色的UILabel,直接加入到已有的:
cell.detailTextLabel?.addSubview(detailStrLabel)
中即可。
当然,在此之前,需要去调节detailStrLabel的frame的位置
注意此frame的位置是相对于cell.detailTextLabel中的位置
【后记】
后来,了解了自动布局,以及如何继承,所以知道了:
其实可以去继承UITableViewCell,然后加上独立的label去控制,包括颜色,字体,就可以很简洁的方式去实现部分文字显示为红色了。