UIView可表示@state值未更新



我有一个UIViewRepresentable,我正试图将UIImage封装在其中。

import SwiftUI
struct ImageView: UIViewRepresentable {

var name: String

fileprivate var imageView: UIImageView = UIImageView()
fileprivate var originalImage: UIImage
@State fileprivate var size: CGSize

init(name: String) {
self.name = name
self.originalImage = UIImage(named: name)!
self._size = State(initialValue: self.originalImage.size)
print(111, self.size)
}

func makeUIView(context: Context) -> UIImageView {
imageView.image = self.originalImage
return imageView;
}

func updateUIView(_ uiView: UIImageView, context: Context) {
self.imageView.image = scaledImage()
}

fileprivate func scaledImage() -> UIImage {
print(333, self.size)
if (self.originalImage.size == self.size || self.size.width <= CGFloat(1) || self.size.height <= CGFloat(1)) {
return self.originalImage
}

UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
self.originalImage.draw(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

return image!;
}

func resize(width: CGFloat, height: CGFloat) -> some View {
self.size = CGSize(width: width, height: height)
print(222, self.size, width, height)

return self.frame(width: width, height: height)
}
}

问题是当调用.resize时,size状态不会更新。这是3条打印线:

111 (2000.0, 2000.0)
222 (2000.0, 2000.0) 100.0 100.0
333 (2000.0, 2000.0)

这是使用ImageView的测试View。。。

struct Test: View {
var body: some View {
ZStack {
ImageView(name: "Letter-T")
.resize(width: 100, height: 100)
}
}
}

我做错了什么??

也许这正是您想要的?

struct ContentView: View {
@State private var size = CGSize(width: 1000, height: 1000)

var body: some View {
ZStack {
ImageView(name: "letter-t", size: $size)
}.onAppear {
self.size = CGSize(width: 100, height: 100)
}
}
}
struct ImageView: UIViewRepresentable {

var name: String

fileprivate var imageView: UIImageView = UIImageView()
fileprivate var originalImage: UIImage
fileprivate var size: Binding<CGSize>

init(name: String, size: Binding<CGSize>) {
self.name = name
self.originalImage = UIImage(named: name)!
self.size = size
print(111, self.size.wrappedValue)
}

func makeUIView(context: Context) -> UIImageView {
imageView.image = self.originalImage
return imageView;
}

func updateUIView(_ uiView: UIImageView, context: Context) {
self.imageView.image = scaledImage()
}

fileprivate func scaledImage() -> UIImage {
print(333, self.size.wrappedValue)
if (self.originalImage.size == self.size.wrappedValue || self.size.wrappedValue.width <= CGFloat(1) || self.size.wrappedValue.height <= CGFloat(1)) {
return self.originalImage
}

UIGraphicsBeginImageContextWithOptions(size.wrappedValue, false, 0.0)
self.originalImage.draw(in: CGRect(x: 0, y: 0, width: self.size.wrappedValue.width, height: self.size.wrappedValue.height))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

return image!;
}
}

我不得不说,在UIViewRepresentable中使用@State非常奇怪,在任何地方都没有见过,也不认为它有效。

最新更新