无法使用 SwiftUI 使自定义 UIView 方面比例适合/填充

Mau*_*ime 2 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不知道是不是苹果的bug。期望像 SDWebImageSwiftUI AnimatedImage 这样的自定义视图响应 SwiftUI 大小相关的修饰符,如 .scaledToFit()。

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

Tom*_*art 6

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
}
Run Code Online (Sandbox Code Playgroud)

这将允许您设置.frame(width:height:)为您想要的任何大小。