ios - 如何调整 CALayer 大小以适应父视图
问题描述
我创建了一个与父级大小相同的分层视图(使用 PocketSVG 的SVGImageView ):
var body: some View {
GeometryReader { reader in
SVGImageLayered("world", width: reader.size.width, height: reader.size.height)
.frame(width: reader.size.width, height: reader.size.height, alignment: .center)
...
SVGImageLayered 定义如下:
struct SVGImageLayered: UIViewRepresentable {
var resourcePath: String
var frameWidth: CGFloat
var frameHeight: CGFloat
init(_ resourceName: String, width: CGFloat, height: CGFloat) {
resourcePath = resourceName
frameWidth = width
frameHeight = height
}
func makeUIView(context: Context) -> UIView {
let svgView = UIView(frame: UIScreen.main.bounds)
let url = Bundle.main.url(forResource: resourcePath, withExtension: "svg")!
let paths = SVGBezierPath.pathsFromSVG(at: url)
let imageLayer = CALayer()
for (index, path) in paths.enumerated() {
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
imageLayer.addSublayer(shapeLayer)
}
imageLayer.frame = CGRect(x: 0, y: 0, width: frameWidth, height: frameHeight)
svgView.layer.addSublayer(imageLayer)
return svgView
}
func updateUIView(_ view: UIView, context: Context) {
}
}
问题是源 SVG 图像比父视图大,因此只有一部分是可见的。我希望源图像适合框架;与具有以下设置的 UIImageView 的情况相同:
imageView.frame = svgView.bounds
imageView.contentMode = .scaleAspectFit
有谁知道如何缩放源图像以适应框架?
解决方案
问题是您正在使用形状图层。形状图层具有路径。路径对层的大小一无所知!即使是零大小的形状图层也会以完全相同的方式显示其路径。
你需要调整的是路径。如果这是 UIBezierPath,可以通过对其应用转换轻松完成。
推荐阅读
- javascript - 如何在 iOS 中控制警报使用排毒?
- javascript - 如何使用文本而不是图标作为反应工具箱菜单?
- java - JNI:从 Java 调用 C# 方法
- javascript - 多会话视频广播的 Tokbox 替代方案
- r - R: Picking values from matrix by indice matrix
- vue.js - Vue Cli 根路由器仅在工作
- hiveql - hive 中分析函数的错误结果
- python - 在 python 中从单元测试用例为 reqparse.RequestParser 发送参数
- python - Tensorflow InvalidArgumentError:通过 Lambda 层对输入进行切片后的形状不兼容
- vuejs2 - 为什么我的 v-if 不起作用