【问题标题】:How to automatically resize a MarkerView created from xib如何自动调整从 xib 创建的 MarkerView
【发布时间】:2021-03-20 09:24:26
【问题描述】:

我从 xib 布局创建标记,但它不会根据标签长度调整大小:

我的标记类:

class MyMarker: MarkerView {
    
    @IBOutlet weak var lblValue: UILabel!
    
    override open func awakeFromNib() {
        // centering on top of bar
        self.offset.x = -self.frame.size.width / 2.0
        self.offset.y = -self.frame.size.height - 7.0
    }
    
    override func refreshContent(entry: ChartDataEntry, highlight: Highlight) {
        lblValue.text = String(entry.y)
    }
}

我在 IOS-Charts 库中进行了一些挖掘,发现了一个有趣的功能 - 虽然可以从 xib(其内容是视图)创建标记,但标记本身并未添加到视图层次结构中。相反,视图的内容只是简单地绘制在图表画布上。

如果我们查看MarkerView,我们会注意到它只是一个方便的包装器。图表上的渲染发生在draw(context:point:) 方法中,该方法在IMarker 协议中定义。也就是说,MarkerView 不会添加到视图层次结构中。

在我看来,这可能是MarkerView 的约束没有重新计算的原因。我试图强制 MarkerView 重新计算它们但没有成功:

override func refreshContent(entry: ChartDataEntry, highlight: Highlight) {
    lblValue.text = String(entry.y)
    layoutSubviews() // doesn't work
    updateConstraints() // doesn't work
    subviews.forEach() { // even that doesn't work!
        $0.updateConstraints()
    }
}

我什至尝试调整视图边界的大小(为了清晰起见,添加了绿色背景),但这并没有强制重新计算约束:

override func refreshContent(entry: ChartDataEntry, highlight: Highlight) {
    lblValue.text = String(entry.y)

    bounds = CGRect(x: bounds.minX, y: bounds.minY, width: 200, height: bounds.height)
    frame = bounds
    backgroundColor = UIColor.green

    layoutSubviews() // doesn't work
    updateConstraints() // doesn't work
    subviews.forEach() { // even that doesn't work!
        $0.updateConstraints()
    }
}

结果:

问题是如何重新计算MarkerView 约束?最重要的是 - 不是手动的。毕竟,MarkerView 在从 xib 初始化时会以某种方式计算正确的约束。

【问题讨论】:

    标签: ios swift autolayout ios-charts


    【解决方案1】:

    是的,确实可以重新计算视图常量,即使它不包含在层次结构中。对于 IOS-Charts,它将如下所示:

    override func refreshContent(entry: ChartDataEntry, highlight: Highlight) {
        lblValue.text = String(entry.y)
        
        // Recalculate marker sized based on lblValue width
        setNeedsLayout()
        layoutIfNeeded()
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多