I've got an image that I made in PaintCode that I want to animate. PaintCode provides a drawing function for UIKit, not SwiftUI. So for testing I can implement it in UIKit with the following VC:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var paintCode: PaintCodeView!
@IBOutlet weak var slider: UISlider!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func sliderMoved(_ sender: Any) {
paintCode.progress = CGFloat(slider.value)
}
}
class PaintCodeView: UIView {
private var _progress: CGFloat = 0.0
var progress: CGFloat {
set {
if newValue < 0 {
_progress = 0
} else if newValue > 1 {
_progress = 1
} else {
_progress = newValue
}
setNeedsDisplay()
}
get {
return _progress
}
}
override func draw(_ rect: CGRect) {
LinkStyles.drawLogoAnimated(frame: self.bounds, resizing: .aspectFit, animationProgress: _progress)
}
}

But if I try to wrap the same drawing UIView in a UIViewRepresentable to use in SwiftUI, it's not drawing it as expected, instead has a black background and glitching animation.
import SwiftUI
import UIKit
struct TestView: View {
@State var progress: Float = 0.0
var body: some View {
VStack {
Logo(animationProgress: $progress)
.frame(width: 300, height: 300)
Text("\(progress)")
Slider(value: $progress)
.padding(.horizontal)
}
}
}
struct Logo: UIViewRepresentable {
@Binding var animationProgress: Float
func makeUIView(context: Context) -> PaintCodeView {
print("LinkLogo Make: \(animationProgress)")
let view = PaintCodeView()
view.progress = CGFloat(animationProgress)
return view
}
func updateUIView(_ logoView: PaintCodeView, context: Context) {
logoView.progress = CGFloat(animationProgress)
}
}
class PaintCodeView: UIView {
private var _progress: CGFloat = 0.0
var progress: CGFloat {
set {
if newValue < 0 {
_progress = 0
} else if newValue > 1 {
_progress = 1
} else {
_progress = newValue
}
setNeedsDisplay()
}
get {
return _progress
}
}
override func draw(_ rect: CGRect) {
LinkStyles.drawLogoAnimated(frame: self.bounds, resizing: .aspectFit, animationProgress: _progress)
}
}

Any idea what I'm doing wrong?
You need to set the background color to .clear in the UIView subclass (in below example in class MyWidgetView) in order to remove the black background.
import UIKit
class MyWidgetView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
super.backgroundColor = UIColor.clear
}
required init?(coder: NSCoder) {
fatalError()
}
override func draw(_ rect: CGRect) {
PaintCodeClass.drawWidget(frame: self.bounds)
}
}
struct ObstacleView: UIViewRepresentable {
func makeUIView(context: Context) -> some UIView {
ObstacleUIView()
}
func updateUIView(_ uiView: UIViewType, context: Context) {
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With