gpt4 book ai didi

ios - 加速 View 的碎片化

转载 作者:搜寻专家 更新时间:2023-11-01 06:58:37 26 4
gpt4 key购买 nike

我有以下代码(在 UIView 的扩展中)将 UIView 分成一定数量的片段:

public func fragment(into numberOfFragments: Int) -> [UIView] {

var fragments = [UIView]()

guard let containerView = superview, let snapshot = snapshotView(afterScreenUpdates: true) else { return fragments }

let fragmentWidth = snapshot.frame.width / CGFloat(numberOfFragments)
let fragmentHeight = snapshot.frame.height / CGFloat(numberOfFragments)

for x in stride(from: 0.0, to: snapshot.frame.width, by: fragmentWidth) {
for y in stride(from: 0.0, to: snapshot.frame.height, by: fragmentHeight) {

let rect = CGRect(x: x, y: y, width: fragmentWidth, height: fragmentHeight)

if let fragment = snapshot.resizableSnapshotView(from: rect, afterScreenUpdates: true, withCapInsets: .zero) {

fragment.frame = convert(rect, to: containerView)
containerView.addSubview(fragment)
fragments.append(fragment)

}

}

}

return fragments

}

但是,对于 numberOfFragments=20,此代码大约需要 2 秒才能完成。有什么方法可以更快地实现同样的结果吗? 我应该改用动画/过渡吗?

非常感谢。

最佳答案

此解决方案使用 UIImageViews 而不是 UIViews。它裁剪单个捕获的屏幕截图,而不是调用更昂贵的 resizableSnapshotView 400 次。如果 afterScreenUpdates 设置为 false(适用于我的测试用例),时间从 ~2.0 秒减少到 0.088 秒。如果您的目的需要 afterScreenUpdates,则时间约为 0.15 秒。仍然 - 比 2.0 秒快得多!

public func fragment(into numberOfFragments: Int) -> [UIImageView] {

var fragments = [UIImageView]()

guard let containerView = superview else { return fragments }

let renderer = UIGraphicsImageRenderer(size: containerView.bounds.size)
let image = renderer.image { ctx in
containerView.drawHierarchy(in: containerView.bounds, afterScreenUpdates: false)
}

let fragmentWidth = containerView.frame.width / CGFloat(numberOfFragments)
let fragmentHeight = containerView.frame.height / CGFloat(numberOfFragments)

for x in stride(from: 0.0, to: containerView.frame.width, by: fragmentWidth) {
for y in stride(from: 0.0, to: containerView.frame.height, by: fragmentHeight) {

let rect = CGRect(x: x, y: y, width: fragmentWidth, height: fragmentHeight)

if let imageFrag = cropImage(image, toRect: rect) {
let fragment = UIImageView(image: imageFrag)
fragment.frame = convert(rect, to: containerView)
containerView.addSubview(fragment)
fragments.append(fragment)
}
}
}

return fragments

}


func cropImage(_ inputImage: UIImage, toRect cropRect: CGRect) -> UIImage?
{

let imageViewScale = UIScreen.main.scale

// Scale cropRect to handle images larger than shown-on-screen size
let cropZone = CGRect(x:cropRect.origin.x * imageViewScale,
y:cropRect.origin.y * imageViewScale,
width:cropRect.size.width * imageViewScale,
height:cropRect.size.height * imageViewScale)

// Perform cropping in Core Graphics
guard let cutImageRef: CGImage = inputImage.cgImage?.cropping(to:cropZone)
else {
return nil
}

// Return image to UIImage
let croppedImage: UIImage = UIImage(cgImage: cutImageRef)
return croppedImage
}

关于ios - 加速 View 的碎片化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51921982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com