2017-03-18 74 views
0

我遇到了UIViews的奇怪行为。我有一个空的'容器'UIView - WaveformPlot,预计将填充子子视图。在addSubview期间奇怪的复制UIView

class WaveformPlot: UIView { 
 

 
    
 
    
 
    var normalColor: UIColor? 
 
    var progressColor: UIColor? 
 
    
 
    var waveforms: [UIView]? 
 

 
    override init(frame: CGRect) { 
 

 
    super.init(frame: frame) 
 

 
    } 
 
    
 
    required init?(coder aDecoder: NSCoder) { 
 

 
    super.init(coder: aDecoder) 
 
    waveforms = [] 
 
    
 
    } 
 
    
 

 

 
    //MARK: Populate plot with data 
 
    
 
    func populateWithData(from dataSet: [Float]){ 
 
    
 
    DispatchQueue.main.async { 
 
     
 
     var offset: CGFloat = 0 
 
     
 
     for index in 0..<dataSet.count { 
 
     
 
     let barView = UIView(frame: CGRect(x: offset, 
 
             y: self.frame.height/2, 
 
             width: self.frame.width/CGFloat(dataSet.count), 
 
             height: -(CGFloat)((dataSet[index])))) 
 

 
     
 
     
 
     
 

 
     barView.backgroundColor = self.normalColor 
 
     barView.layer.borderColor = UIColor.black.cgColor 
 
     barView.layer.borderWidth = 0.25 
 
     
 
     //Append barView to parent 'container' view 
 
     self.addSubview(barView) 
 
     //Append barView to an array for future processing 
 
     self.waveforms?.append(barView) 
 

 
     offset += self.frame.width/CGFloat(dataSet.count) 
 

 
     } 
 
     
 
    } 
 
    } 
 
    
 
    func updateColorOfBars(with currentTime: Double, of totalDuration: Double){ 
 
    
 
    let percentagePlayed = currentTime/totalDuration 
 
    
 
    print("Percerntage played - \((percentagePlayed * 100)/100)") 
 
    
 
    let quantityOfBarsToBeUpdated = Double((self.waveforms?.count)!) * percentagePlayed 
 
    
 
    for item in self.waveforms!{ 
 
     if (self.waveforms?.index(of: item)!)! <= Int(quantityOfBarsToBeUpdated * percentagePlayed) { 
 
     print("index processing - \(self.waveforms?.index(of: item))") 
 
     item.backgroundColor = self.progressColor 
 
     } 
 
    } 
 
    } 
 
    
 
    func clearPlot(){ 
 
    
 
    for item in self.subviews{ 
 
     
 
     item.removeFromSuperview() 
 
     
 
    } 
 
    
 
    } 
 
}

然后我发起这个WaveformPlot中的ViewController与 “数据”[浮点]数组64个值:

class ViewController: UIViewController { 
 

 
    var data: [Float] = [13, 37, 2, 3, 64, 62, 31, 50, 60, 17, 48, 56, 24, 25, 45, 8, 32, 1, 39, 26, 42, 10, 4, 27, 51, 40, 11, 12, 35, 41, 46, 21, 55, 36, 20, 14, 34, 47, 6, 9, 5, 59, 30, 54, 23, 49, 19, 0, 58, 61, 57, 28, 29, 15, 44, 16, 63, 18, 22, 43, 7, 33, 53, 38] 
 

 
    @IBOutlet weak var waveformView: WaveformPlot! 
 
    @IBOutlet weak var playButton: UIButton! 
 
    
 
    override func viewDidLoad() { 
 
    super.viewDidLoad() 
 
    
 
    } 
 
    
 
    override func viewDidLayoutSubviews() { 
 
    
 
    waveformView.normalColor = UIColor.blue 
 
    waveformView.progressColor = UIColor.orange 
 
    waveformView.populateWithData(from: data) 
 
    
 
    } 
 
}

这导致在这 - >

Screen

但是,在可视化调试期间,我发现有128个视图,而不是64.在每个barView下还有另一个栏。 此截图的详细信息。

Screen

请帮我解决这个问题。为什么在原始的时候会附加额外的酒吧?

+0

'viewDidLayoutSubviews'可称为不止一次。您应该在添加新视图之前删除现有视图,或者检查是否已添加新视图。 – Paulw11

回答

1

viewDidLayoutSubviews将根据需要多次调用。 每次调用它时都会创建这些栏。 你应该遍历的意见,并删除之前建立新的:

for view in waveForms { view.removeFromSuperview. } self.waveForms.removeAll()