Swift 需要正确设置气泡消息(如电报)中时间戳的位置。敏捷的
我需要找到一种方法,根据消息内容,将气泡消息的时间戳标签正确定位在消息标签下方或右侧。说清楚我想复制电报的行为,whatsapp等。我已经尝试使用NSAttributed字符串和NSLayoutManager的boundingRect来获取最后3个字母的帧,然后根据此字母与消息最后3个字母的帧的交点移动时间戳标签,但没有结果 提前谢谢大家,, 阿坎杰洛 这是我用来生成图中显示的红色矩形框的扩展Swift 需要正确设置气泡消息(如电报)中时间戳的位置。敏捷的,swift,message,Swift,Message,我需要找到一种方法,根据消息内容,将气泡消息的时间戳标签正确定位在消息标签下方或右侧。说清楚我想复制电报的行为,whatsapp等。我已经尝试使用NSAttributed字符串和NSLayoutManager的boundingRect来获取最后3个字母的帧,然后根据此字母与消息最后3个字母的帧的交点移动时间戳标签,但没有结果 提前谢谢大家,, 阿坎杰洛 这是我用来生成图中显示的红色矩形框的扩展 extension UILabel { func boundingRect(forCharacterR
extension UILabel {
func boundingRect(forCharacterRange range: NSRange) -> CGRect? {
guard let text = text else { return nil }
let textStorage = NSTextStorage(string: text)
let layoutManager = NSLayoutManager()
var glyphRange = NSRange()
let textContainer = NSTextContainer(size: bounds.size)
textStorage.addLayoutManager(layoutManager)
textContainer.lineFragmentPadding = 0.0
layoutManager.addTextContainer(textContainer)
layoutManager.characterRange(forGlyphRange: range, actualGlyphRange: &glyphRange)
return layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
}
这里我使用上一个扩展来检查交叉点
override func layoutSubviews() {
super.layoutSubviews()
guard let timestampCount = timestampLabel.text?.count, timestampCount > 0,
let bodyCount = bodyLabel.text?.count, bodyCount > 0 else { return }
guard let text = bodyText, text.count > 2 else { return }
let sublayer = CALayer()
sublayer.borderWidth = 1
sublayer.borderColor = UIColor.red.cgColor
var boundingRect = bodyLabel.boundingRect(forCharacterRange: NSRange(location: text.count-2, length: 2))!
boundingRect = convert(boundingRect, from: self)
sublayer.frame = boundingRect
bodyLabel.layer.sublayers?.first?.removeFromSuperlayer()
bodyLabel.layer.addSublayer(sublayer)
bodyLabel.attributedText = bodyText?.attributedStringWithColorSize(color: UIColor.red , size: 15)
if sublayer.frame.intersects(timestampLabel.frame)
{
NSLayoutConstraint.activate([
timestampLabel.topAnchor.constraint(equalTo: bodyLabel.bottomAnchor),
timestampLabel.leftAnchor.constraint(greaterThanOrEqualTo: containerView.layoutMarginsGuide.leftAnchor),
])
}
}
这是我得到的结果,正如你所看到的,我生成了红框并检查它是否与时间戳标签相交,但位置不正确
你需要将你的问题以a的形式包含所有相关代码,以便使问题成为主题。@DávidPásztor我已经编辑了我的问题,希望现在是真实的。提前谢谢。我想你应该改变方法,定义一个自定义视图,将垂直
UIStackView
作为父视图,将两个UILabel
作为子视图。@LucaPizzini我想我还没有完全解释我的问题。标签的时间戳需要根据消息内容定位在消息下方、消息的右侧或左下角。所以这不仅仅是堆栈视图的问题