如何在使用 drawrect() 绘制后删除标签
How to remove labels from after drawing with drawrect()
我对以编程方式绘图还很陌生。我设法绘制了一个折线图,其中包含点、线、自动缩放轴和轴标签。在其他屏幕中,我可以更改图形的特性,当我 return 到屏幕时,我在包含 viewController 的 viewWillAppear 函数中使用 setNeedsDisplay() 刷新它。当我这样做时,线条被完美地重新绘制。
在其他屏幕中添加的新数据可能需要重新缩放坐标轴。问题在于,当重绘图形时,轴上的数字标签只是添加到图形中,并没有删除旧的,这意味着一些标签可能被覆盖,而一些旧的标签只是留在新标签旁边。
我想我明白为什么会发生这种情况,因为我正在创建标签并添加子视图,但没有删除它。我想我认为由于线条被擦除并重新绘制,标签也会如此。如何干净地重新标记我的轴?有一个更好的方法吗?下面列出了我创建标签的功能。此函数由 drawRect()
调用
func createXAxisLabels(interval: Float, numIntervals: Int) {
let xstart: CGFloat = marginLeft
let yval: CGFloat = marginTop + graphHeight + 10 // 10 pts below the x-axis
var xLabelVals : [Float] = [0]
var xLabelLocs : [CGFloat] = [] // gives the locations for each label
for i in 0...numIntervals {
xLabelLocs.append(xstart + CGFloat(i) * graphWidth/CGFloat(numIntervals))
xLabelVals.append(Float(i) * interval)
}
if interval >= 60.0 {
xUnits = "Minutes"
xUnitDivider = 60
}
for i in 0...numIntervals {
let label = UILabel(frame: CGRectMake(0, 0, 50.0, 16.0))
label.center = CGPoint(x: xLabelLocs[i], y: yval)
label.textAlignment = NSTextAlignment.Center
if interval < 1.0 {
label.text = "\(Float(i) * interval)"
} else {
label.text = "\(i * Int(interval/xUnitDivider))"
}
label.font = UIFont.systemFontOfSize(14)
label.textColor = graphStructureColor
self.addSubview(label)
}
}
drawRect
应该只是绘制矩形,而不是更改视图层次结构。可以反复调用。那些其他标签是其他视图并自己绘制。
你有几个选择
- 不要使用标签 -- 而只是将文本绘制到矩形上。
-或-
- Add/remove 视图控制器中的标签。
编辑(来自评论):OP 提供了他们的解决方案
I just replaced my code inside the for loop with:
let str : NSString = "\(xLabelVals[i])"
let paraAttrib = NSMutableParagraphStyle()
paraAttrib.alignment = NSTextAlignment.Center
let attributes = [
NSFontAttributeName: UIFont.systemFontOfSize(14),
NSForegroundColorAttributeName: UIColor.whiteColor(),
NSParagraphStyleAttributeName: paraAttrib]
let xLoc : CGFloat = CGFloat(xLabelLocs[i] - 25)
let yLoc : CGFloat = yval - 8.0
str.drawInRect(CGRectMake(xLoc, yLoc, 50, 16), withAttributes: attributes)
我对以编程方式绘图还很陌生。我设法绘制了一个折线图,其中包含点、线、自动缩放轴和轴标签。在其他屏幕中,我可以更改图形的特性,当我 return 到屏幕时,我在包含 viewController 的 viewWillAppear 函数中使用 setNeedsDisplay() 刷新它。当我这样做时,线条被完美地重新绘制。
在其他屏幕中添加的新数据可能需要重新缩放坐标轴。问题在于,当重绘图形时,轴上的数字标签只是添加到图形中,并没有删除旧的,这意味着一些标签可能被覆盖,而一些旧的标签只是留在新标签旁边。
我想我明白为什么会发生这种情况,因为我正在创建标签并添加子视图,但没有删除它。我想我认为由于线条被擦除并重新绘制,标签也会如此。如何干净地重新标记我的轴?有一个更好的方法吗?下面列出了我创建标签的功能。此函数由 drawRect()
调用 func createXAxisLabels(interval: Float, numIntervals: Int) {
let xstart: CGFloat = marginLeft
let yval: CGFloat = marginTop + graphHeight + 10 // 10 pts below the x-axis
var xLabelVals : [Float] = [0]
var xLabelLocs : [CGFloat] = [] // gives the locations for each label
for i in 0...numIntervals {
xLabelLocs.append(xstart + CGFloat(i) * graphWidth/CGFloat(numIntervals))
xLabelVals.append(Float(i) * interval)
}
if interval >= 60.0 {
xUnits = "Minutes"
xUnitDivider = 60
}
for i in 0...numIntervals {
let label = UILabel(frame: CGRectMake(0, 0, 50.0, 16.0))
label.center = CGPoint(x: xLabelLocs[i], y: yval)
label.textAlignment = NSTextAlignment.Center
if interval < 1.0 {
label.text = "\(Float(i) * interval)"
} else {
label.text = "\(i * Int(interval/xUnitDivider))"
}
label.font = UIFont.systemFontOfSize(14)
label.textColor = graphStructureColor
self.addSubview(label)
}
}
drawRect
应该只是绘制矩形,而不是更改视图层次结构。可以反复调用。那些其他标签是其他视图并自己绘制。
你有几个选择
- 不要使用标签 -- 而只是将文本绘制到矩形上。
-或-
- Add/remove 视图控制器中的标签。
编辑(来自评论):OP 提供了他们的解决方案
I just replaced my code inside the for loop with:
let str : NSString = "\(xLabelVals[i])"
let paraAttrib = NSMutableParagraphStyle()
paraAttrib.alignment = NSTextAlignment.Center
let attributes = [
NSFontAttributeName: UIFont.systemFontOfSize(14),
NSForegroundColorAttributeName: UIColor.whiteColor(),
NSParagraphStyleAttributeName: paraAttrib]
let xLoc : CGFloat = CGFloat(xLabelLocs[i] - 25)
let yLoc : CGFloat = yval - 8.0
str.drawInRect(CGRectMake(xLoc, yLoc, 50, 16), withAttributes: attributes)