我有意见
struct CustomImageView : View {
var body: some View {
Image("someImage")
}
}
Run Code Online (Sandbox Code Playgroud)
当我在外面引用这个视图时,我无法调整图像大小。我知道我可以传递参数,但我正在寻找一种更简洁的方法来通过修饰符来做到这一点?
VStack {
CustomImageView()
.resizable() // This does not work
}
Run Code Online (Sandbox Code Playgroud)
resizable 似乎只能直接处理图像。有谁知道如何使 CustomImageView 可调整大小?
更新:我知道我可以使用参数,但是无论如何可以使用修饰符来做到这一点?Resizable 只是一种属性,但还有其他属性。并将它们全部列为单个变量将太多
基于@matteo-pacini 实现的答案 它使用 AlamofireImage 在 ImageView 中加载远程图像。
struct RemoteImage : View {
var url: URLConvertible
@ObjectBinding var imageLoader = AlamofireImageLoader()
private (set) var _resizable: (capInsets: EdgeInsets, resizingMode: Image.ResizingMode) = (EdgeInsets(), .stretch)
var body: some View {
Image(uiImage: imageLoader.image)
.resizable(capInsets: _resizable.capInsets, resizingMode: _resizable.resizingMode)
.onAppear() {
self.imageLoader.loadImage(url: self.url)
}
}
func resizable(capInsets: EdgeInsets = EdgeInsets(), resizingMode: Image.ResizingMode = .stretch) -> RemoteImage {
return RemoteImage(url: url, _resizable: (capInsets, resizingMode))
}
}
class AlamofireImageLoader: BindableObject {
var didChange = PassthroughSubject<Void, Never>()
var image = UIImage() {
didSet {
DispatchQueue.main.async {
self.didChange.send(Void())
}
}
}
convenience init(url: URLConvertible) {
self.init()
loadImage(url: url)
}
func loadImage(url: URLConvertible) {
Alamofire.request(url).responseImage { response in
if let image = response.result.value {
self.image = image
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
struct CustomImageView : View {
private var isResizable = false
var body: some View {
let image = Image("someImage")
return isResizable ? image.resizable() : image
}
func resizable() -> CustomImageView {
return CustomImageView(isResizable: true)
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它。
struct ContentView: View {
var body: some View {
VStack {
CustomImageView()
.resizable()
}
}
}
Run Code Online (Sandbox Code Playgroud)