无法使用SwiftUI使自定义UIView纵横比适合/填充

时间:2019-09-17 07:37:17

标签: swiftui

SwiftUI中没有公共API可以响应View协议的可调整大小的修饰符。 SwiftUI中只有Image可以与.resizable()一起使用。像UIView for GIF这样的自定义UIView现在无法调整大小。

我使用SDWebImageSwiftUI AnimatedImage,它支持UIKit视图SDAnimatedImageView。 AnimatedImage无法响应.resizable()、. scaleToFit,.aspectRatio(contentMode:.fit)等。WebImage支持SwiftUI Image,因此工作正常。

import SwiftUI
import SDWebImageSwiftUI

struct ContentView: View {
    let url = URL(string: "https://media.giphy.com/media/H62DGtBRwgbrxWXh6t/giphy.gif")!
    var body: some View {
        VStack {
            AnimatedImage(url: url)
                .scaledToFit()
                .frame(width: 100, height: 100)
            WebImage(url: url)
                .scaledToFit()
                .frame(width: 100, height: 100)
        }
    }
}

不确定这是否是Apple错误。期望像SDWebImageSwiftUI AnimatedImage这样的自定义视图能够响应SwiftUI大小相关的修饰符,例如.scaledToFit()。

相关问题:https://github.com/SDWebImage/SDWebImageSwiftUI/issues/3

2 个答案:

答案 0 :(得分:4)

SwiftUI使用抗压缩优先级和内容包含优先级来确定可能的大小调整。

如果要将视图的大小调整到其固有内容大小以下,则需要降低抗压缩性优先级。

示例:

func makeUIView(context: Context) -> UIView {
    let imageView = UIImageView(image: UIImage(named: "yourImage")!)
    imageView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
    imageView.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
    return imageView
}

这将使您可以将.frame(width:height:)设置为所需的任何大小。

答案 1 :(得分:0)

最后找到了解决方案。

在SDAnimationImageView或UIImageView外部制作一个UIView包装器,然后重写layoutSubviews()设置子视图的框架。

这是我的完整代码。

SDWebImageSwiftUI还发布了一个新版本,该版本使用包装器解决了此问题。

SELECT * FROM your_table_name 
WHERE name LIKE '%a%' 
      OR note LIKE '%a%'