ios - 防止 UIView 重叠

标签 ios swift uiview uikit

我正在尝试实现圆环图,但我正在努力防止标签相互重叠。我正在寻找有关避免这种情况的干净解决方案的想法。

段和标签类如下所示:

class Segment {
    var index: Double?
    var tagText: String?
}

class SegmentTag: UIView {
    @IBOutlet var iconView: UIImageView!
    @IBOutlet var textLabel: UILabel!

    init(text: String?, icon: UIImage?, frame: CGRect) {
        ...
    }
}

在图表类中,段和标签是在draw(_ rect:)中绘制的:

override func draw(_ rect: CGRect) {
    for tag in tags {
        tag.removeFromSuperview()
    }
    tags = [UIView]()

    let tagSize = CGSize(width: 50, height: 60)

    for segment in segments {
        // ... Draw each segment
        let radius = ...
        let angle = ...
        let tag = SegmentTag(text: segment.tagText, icon: tagIcon, frame: tagRect)
        var tagPoint = CGPoint(x: radius * cos(angle),
                               y: radius * sin(angle))
        var tagRect = CGRect(origin: tagPoint, size: tagSize)
        self.addSubview(tag)
        tags.append(tag)
    }
}

Colliding tags

您将如何避免 View 重叠?

最佳答案

首先计算您的各种 SegmentTag 对象的所有点,并将任何点组合在一起,而不是靠得太近而不可见。

将对象分组后的一个选项,显示不同类型的标签,GroupTag 或其他东西,也许里面有 SegmentTag 的计数,可以点击它并弹出一个弹出窗口,其中包含您的 SegmentTag 对象列表。

另一种选择是使用您的 GroupTag 来简单地看起来不同,但显示数据,例如它不会有图像,而是一个值列表。

在我看来,与实际为所有可能的数据集计算非重叠位置相比,这些解决方案更简单、更可靠。

关于ios - 防止 UIView 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46849908/

相关文章:

ios - 使用NSPredicate过滤以非字母字符开头的条目

ios - Swift - 等到函数完成

ios - PromiseKit 4 - 包装委托(delegate)

ios - 如何在我滚动时为 UICollectionview 单元格设置动画

ios - 回答我自己 - uitableview - ios7 - cellForRowAtIndexPath 未调用

iphone - 向上移动 View ,使文本字段不会消失在键盘后面

ios - 仅在应用程序内使用 swift 连接到 IPSec VPN 连接

ios - 如何在AFNetworking的http 422响应上获取返回的对象?

ios - NSSearchPathForDirectoriesInDomains 给出 EXC_BREAKPOINT

swift - @main 和 @uiapplicationmain 有什么区别