您好,我已经在 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
}
经过大量测试,我发现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)
}
}