2017-10-20 195 views
2

我试图实现一个甜甜圈图,但我努力保持标签互不重叠。我正在寻找清洁解决方案的想法来避免这种情况。防止UIViews重叠

段和标签类看起来如此:

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) { 
     ... 
    } 
} 

在该图中的类,这些段和标签在拉伸(被绘制_ 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

你会如何避免重叠的意见?

+0

我遇到过类似的问题,可以通过改变行的长度来缓解问题。但是,如果将大量较小的值聚集在一起,则仍会遇到同样的问题。我不得不在一个单独的表格视图中实现一个图例。 – TheAppMentor

回答

1

首先计算您的各种物体的所有点并将任何物体组合在一起,而不是太接近可见物体。

一种选择,你有你的对象编组后,显示不同类型的标签,一个GroupTag什么的,也许与SegmentTag计数它有它的里面,可以挖掘和用的列表将显示为酥料饼你的SegmentTag对象。

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

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