防止UIViews重叠

时间:2017-10-20 13:15:39

标签: 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

你会如何避免重叠的观点?

1 个答案:

答案 0 :(得分:1)

首先计算各种SegmentTag个对象的所有点,然后将它们组合在一起,而不是太接近可见。

将对象分组后的一个选项,显示不同类型的标记,GroupTag或其他内容,或者其中包含SegmentTag的内容,可以点按并带来弹出一个包含SegmentTag个对象列表的popover。

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

在我看来,这些比实际计算所有可能数据集的非重叠位置更容易,更可靠。