У меня есть свой собственный пользовательский вид, ProgressBar
, который я создаю программно:
let pb = ProgressBar(frame: CGRect(x: 0, y: 0, width: 200, height: 16))
Я создаю его, используя ширину 200, но затем добавляю его в горизонтальный вид стека.Из-за этого представление будет увеличиваться в зависимости от размера экрана, например, на iPhone X увеличится до 250.
В этом пользовательском представлении я пытаюсь использовать ширину, но она всегда равна 200, и это вызываетвсе виды вопросов.
Что мне действительно нужно, так это значение, которое представление имеет внутри стекового представления, в моем случае 250.
Есть ли способ получить это значение внутри моего пользовательского представления?
ИлиКакие у меня есть альтернативы?
edit - добавлен код:
class CustomTableViewCell: UITableViewCell {
func configure() {
let progressBar: ProgressBar = {
let pb = ProgressBar(frame: CGRect(x: 0, y: 0, width: 200, height: 16))
}()
}
}
И этот код вызывается из контроллера представления:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell1") as! CustomTableViewCell
cell.configure()
return cell
}
edit 2 - настраиваемое представлениекод:
class ProgressBar: UIView {
var progressView: UIView = {
let v = UIView()
v.backgroundColor = .white
return v
}()
override init(frame: CGRect) {
super.init(frame: frame)
configure()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configure()
}
func configure() {
backgroundColor = UIColor(white: 1.0, alpha: 0.1)
layer.cornerRadius = 8.0
clipsToBounds = true
progressView.frame = bounds
progressView.frame.size.width = 0.0
addSubview(progressView)
}
func animate(_ pct: CGFloat) -> Void {
UIView.animate(withDuration: 1.0, animations: {
self.progressView.frame.size.width = self.bounds.size.width * pct
})
}
}
edit3 - вызов animate
let progressBar: ProgressBar = {
let pb = ProgressBar(frame: CGRect(x: 0, y: 0, width: 200, height: 16))
pb.translatesAutoresizingMaskIntoConstraints = false
if data.count >= i {
if let session = data[i - 1].session {
let values = Array(session).sorted(by: { $0.date.compare($1.date) == .orderedDescending })
var sum = 0.0
for value in values {
sum += Double(value.score)
}
pb.animate(CGFloat(sum / 40)) // returns a value between 0 and 1
}
}
return pb;
}()
edit 4:
![enter image description here](https://i.stack.imgur.com/2OVfx.png)
edit 5- добавлены ограничения отладки:
Printing description of $16:
<UIView: 0x107d6a100; frame = (0 0; 200 16); layer = <CALayer: 0x1d003f3c0>>
Printing description of $17:
<StepUp.ProgressBar: 0x107d6c8e0; frame = (54.3333 0; 250 16); clipsToBounds = YES; layer = <CALayer: 0x1d0220880>>