我正在开发一个在窗口中绘制波形的应用程序,该窗口可在主视图中滑动和滑动。我发现,如果我多次打开滑动视图,应用程序就会开始变慢。我发现使用UIBezierPath绘制波形会使我的应用变慢。我想知道是否需要做一些事情来终止当前的UIBezierPath并避免内存泄漏。感谢我对使用UIBezierPath不太熟悉的任何建议。在此先感谢您的帮助!
import UIKit
class WaveView: UIView {
enum WaveType{
case sin
case triangle
case square
case noise
case sawtooth
}
var waveType: WaveType = .sin { didSet { setNeedsDisplay() } }
var color = UIColor.black { didSet { setNeedsDisplay() } }
let path = UIBezierPath()
var isSelected = false {
didSet {
let tempColor: UIColor = self.backgroundColor!
self.backgroundColor = color
color = tempColor
}
}
private var labelColor: UIColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
override func draw(_ rect: CGRect) {
let middle: CGPoint = CGPoint(x: rect.midX, y: rect.midY)
let width = rect.width
let height = rect.height
let graphWidth: CGFloat = 0.6
let amplitude: CGFloat = 0.2
let midOrigin = CGPoint(x: width * (1 - graphWidth) / 2, y: height * 0.50)
switch waveType {
case .sin:
path.move(to: midOrigin)
for angle in stride(from: 5.0, through: 360.0, by: 5.0) {
let x = midOrigin.x + CGFloat(angle/360.0) * width * graphWidth
let y = midOrigin.y - CGFloat(sin(angle/180.0 * Double.pi)) * height * amplitude
path.addLine(to: CGPoint(x: x, y: y))
}
case .triangle:
let d = rect.width * 0.2
path.move(to: CGPoint(x: middle.x, y: middle.y - d))
path.addLine(to: CGPoint(x: middle.x + d, y: middle.y + d))
path.move(to: CGPoint(x: middle.x, y: middle.y - d))
path.addLine(to: CGPoint(x: middle.x - d, y: middle.y + d))
case .square:
let d = rect.width * 0.2
path.move(to: CGPoint(x: middle.x - d, y: middle.y + d))
path.addLine(to: CGPoint(x: middle.x - d/3, y: middle.y + d))
path.addLine(to: CGPoint(x: middle.x - d/3, y: middle.y - d))
path.addLine(to: CGPoint(x: middle.x + d/3, y: middle.y - d))
path.addLine(to: CGPoint(x: middle.x + d/3, y: middle.y + d))
path.addLine(to: CGPoint(x: middle.x + d, y: middle.y + d))
case.sawtooth:
let d = rect.width * 0.2
path.move(to: CGPoint(x: middle.x - d, y: middle.y + d))
path.addLine(to: CGPoint(x: middle.x + d, y: middle.y - d))
path.addLine(to: CGPoint(x: middle.x + d, y: middle.y + d))
case .noise:
path.move(to: midOrigin)
for angle in stride(from: 3.0, through: 360.0, by: 3.0) {
let x = midOrigin.x + CGFloat(angle/360.0) * width * graphWidth
let y = midOrigin.y - CGFloat(Float.random(in: -1..<1)) * height * amplitude
path.addLine(to: CGPoint(x: x, y: y))
}
}
color.setStroke()
path.lineCapStyle = .round
path.stroke()
}
}
答案 0 :(得分:0)
不要将路径实例设为类成员变量-只需在draw()方法中声明本地UIBezierPath变量即可。
class App extends Component {
constructor(props) {
super(props);
this.state = {
bootcampName: "Nucamp"
};
}
render() {
return (
<div className="App">
<Welcome {this.state.bootcampName}>;
</div>
);
};
}
function Welcome(props) {
return (
<h1>Welcome to {this.props.bootcampName}!</h1>
);
}
}
ReactDOM.render(<App />, document.getElementById('root'));
这将确保释放用于一次draw()调用的路径指令和数据。