Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
Swift 需要正确设置气泡消息(如电报)中时间戳的位置。敏捷的_Swift_Message - Fatal编程技术网

Swift 需要正确设置气泡消息(如电报)中时间戳的位置。敏捷的

Swift 需要正确设置气泡消息(如电报)中时间戳的位置。敏捷的,swift,message,Swift,Message,我需要找到一种方法,根据消息内容,将气泡消息的时间戳标签正确定位在消息标签下方或右侧。说清楚我想复制电报的行为,whatsapp等。我已经尝试使用NSAttributed字符串和NSLayoutManager的boundingRect来获取最后3个字母的帧,然后根据此字母与消息最后3个字母的帧的交点移动时间戳标签,但没有结果 提前谢谢大家,, 阿坎杰洛 这是我用来生成图中显示的红色矩形框的扩展 extension UILabel { func boundingRect(forCharacterR

我需要找到一种方法,根据消息内容,将气泡消息的时间戳标签正确定位在消息标签下方或右侧。说清楚我想复制电报的行为,whatsapp等。我已经尝试使用NSAttributed字符串和NSLayoutManager的boundingRect来获取最后3个字母的帧,然后根据此字母与消息最后3个字母的帧的交点移动时间戳标签,但没有结果

提前谢谢大家,, 阿坎杰洛

这是我用来生成图中显示的红色矩形框的扩展

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我想我还没有完全解释我的问题。标签的时间戳需要根据消息内容定位在消息下方、消息的右侧或左下角。所以这不仅仅是堆栈视图的问题