【问题标题】:SwiftUI -Unable to set frame for LPLinkView when loading Rich Links using LinkPresentation frameworkSwiftUI - 使用 LinkPresentation 框架加载富链接时无法为 LPLinkView 设置框架
【发布时间】:2021-05-28 19:40:51
【问题描述】:

我在 SwiftUI 项目中使用 LinkPresentation 框架在列表视图中显示丰富的链接。该链接正在显示,但我无法设置(更改)LPLinkView 的框架。 LPLinkView 包装在 HStack 中并显示在列表中。


import SwiftUI
import LinkPresentation

struct ContentView: View {
    @State var redrawPreview = false
    let links: [StringLink]  = [StringLink(id: UUID(), string: "https://www.youtube.com/watch?v=HXoVSbwWUIk"),
                                 StringLink(id: UUID(), string: "https://www.youtube.com/watch?v=F2ojC6TNwws"),
                                 StringLink(id: UUID(), string: "https://www.youtube.com/watch?v=bz6GTYaIQXU")]
    var body: some View {
        List(links) { l in
            HStack {
                Image(systemName: "person.fill")
                    .resizable()
                    .scaledToFit()
                    .frame(width: 40.0, height: 40.0)
                LinkRow(previewURL: URL(string: l.string)!, redraw: self.$redrawPreview)
            }
        }.environment(\.defaultMinListRowHeight, 50)
    }
}

struct LinkRow : UIViewRepresentable {
    
    var previewURL:URL
    @Binding var redraw: Bool
    
    func makeUIView(context: Context) -> LPLinkView {
        let view = LPLinkView(url: previewURL)
        
        let provider = LPMetadataProvider()
        provider.startFetchingMetadata(for: previewURL) { (metadata, error) in
            if let md = metadata {
                DispatchQueue.main.async {
                    view.metadata = md
                    view.sizeToFit()
                    self.redraw.toggle()
                }
            }
            else if error != nil
            {
                let md = LPLinkMetadata()
                md.title = "Custom title"
                view.metadata = md
                view.sizeToFit()
                self.redraw.toggle()
            }
        }
        
        return view
    }
    
    func updateUIView(_ view: LPLinkView, context: Context) {
        // New instance for each update
    }
}

struct StringLink : Identifiable{
    var id = UUID()
    var string : String
}

【问题讨论】:

  • 如果您在设置 UIView 时删除 sizeToFit 并仅通过设置框架调整 SwiftUI 大小,从而将 UIView 保持在固有大小,会发生什么情况?然后将 .fixedSize 添加到 SwiftUI 视图以忽略提供的大小。
  • @CenkBilgen 尝试了您建议的选项。它不工作。

标签: swift url swiftui swiftui-list url-link


【解决方案1】:

ScrollView + LazyVStack 而不是List 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2013-03-23
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2022-01-02
    相关资源
    最近更新 更多