2017-10-20 346 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來簡單地看起來不同,但顯示的數據,例如它不會有圖像,而是一個值列表。

在我看來,這些比實際計算所有可能的數據集的非重疊位置更容易和更可靠的解決方案。