首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIViewRepresentable @state值未更新

UIViewRepresentable @state值未更新
EN

Stack Overflow用户
提问于 2020-07-14 10:23:46
回答 1查看 97关注 0票数 0

我有一个正在尝试包装UIImage的UIViewRepresentable。

代码语言:javascript
复制
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状态不是updates。下面是3行打印行:

代码语言:javascript
复制
111 (2000.0, 2000.0)
222 (2000.0, 2000.0) 100.0 100.0
333 (2000.0, 2000.0)

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

代码语言:javascript
复制
struct Test: View {
    var body: some View {
        ZStack {
            ImageView(name: "Letter-T")
            .resize(width: 100, height: 100)
        }
    }
}

我做错了什么??

EN

回答 1

Stack Overflow用户

发布于 2020-07-14 10:44:35

也许这就是你想要的?

代码语言:javascript
复制
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是非常奇怪的,我在任何地方都没有看到过,而且我认为它不起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62887105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档