이상한 UIViews 동작이 발생했습니다. 빈 '컨테이너'UIView - 자식 하위 뷰로 채워질 것으로 예상되는 WaveformPlot 있습니다.이상한 중복 UIView 동안 addSubview
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()
}
}
}
그러면 I는 "데이터"[플로트] 배열 (64 개) 값의 ViewController이 WaveformPlot 개시 :
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)
}
}
이것은이 결과 - >
그러나 시각적 인 디버깅 중에는 64 개 대신 128 개의보기가 있다는 것을 발견했습니다. 각 barView 아래에는 다른 막대가 있습니다. 이 스크린 샷에 세부 정보가 있습니다.
나에게이 문제에 대처 도와주세요. 원래 막대 중에 추가 막대가 붙어있는 이유는 무엇입니까?
'viewDidLayoutSubviews' 번 이상 호출 할 수 있습니다. 새보기를 추가하기 전에 기존보기를 제거하거나 이미 추가되었는지 확인하십시오. – Paulw11