调整 swift ui 真实链接的大小以适合框架

问题描述 投票:0回答:1

您好,我已经在 swift 中创建了一个真实的链接,该链接显示带有预览的站点。我希望预览的框架 maxWidth 为 300,maxHeight 为 200。当我这样做时,预览会变形。我尝试添加一个 scall 来配合和填充 .aspect ratio 修饰符,但这不起作用。如何调整预览大小以使其适合框架而不剪切部分预览?

这就是预览的样子

这就是当我想缩小它时会发生的情况:

import SwiftUI

struct SwiftUIView: View {
    @State var text = "https://www.youtube.com/watch?v=Phaq5p6SAmM"
    
    var body: some View {
        if let url = checkForFirstUrl(text: text){
            LinkPreviewView(url: url)
                .aspectRatio(contentMode: .fill)
                .frame(maxWidth: 300, maxHeight: 200, alignment: .leading)
                .cornerRadius(15)
        }
    }
}



import LinkPresentation
import UIKit
import SwiftUI

struct LinkPreviewView: UIViewRepresentable {
    let url: URL

    func makeUIView(context: Context) -> UIView {
        return LPLinkView()
    }

    func updateUIView(_ uiView: UIView, context: Context) {
        let provider = LPMetadataProvider()
        provider.startFetchingMetadata(for: url) { metaData, error in
            guard let data = metaData, error == nil else { return }
            DispatchQueue.main.async {
                if let linkPreview = uiView as? LPLinkView {
                    linkPreview.metadata = data
                }
            }
        }
    }
}

func checkForFirstUrl(text: String) -> URL? {
    let types: NSTextCheckingResult.CheckingType = .link

    do {
        let detector = try NSDataDetector(types: types.rawValue)
        let matches = detector.matches(in: text, options: .reportCompletion, range: NSMakeRange(0, text.count))
        if let firstMatch = matches.first {
            return firstMatch.url
        }
    } catch {
        print("")
    }

    return nil
}
ios swift xcode swiftui hyperlink
1个回答
0
投票

经过大量测试,我发现frame.size = (300, 200) 和intrinsicSize = (350, 285),所以预览应该被剪裁。

我认为问题是LinkPreviewView设置的

frame
与LPLinkView的
intrinsicSize

不匹配

你可以尝试一下

class CustomLinkView: LPLinkView {
    init() {
        super.init(frame: .zero)
    }
    
    override var intrinsicContentSize: CGSize {
        CGSize(width: frame.width, height: frame.height)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.