【问题标题】:Capture snapshot of unselected UITabBarItem?捕获未选择的 UITabBarItem 的快照?
【发布时间】:2022-09-23 09:25:02
【问题描述】:

我正在为应用程序编写一些教程代码,并想制作未选择的标签栏项目的屏幕截图。这是我到目前为止编写的代码:

extension UIView {
    var globalFrame: CGRect {
        superview?.convert(frame, to: nil) ?? .zero
    }
}

extension UIView {
    var snapshot: UIImage {
        UIGraphicsImageRenderer(size: bounds.size).image { _ in
            drawHierarchy(in: frame, afterScreenUpdates: false)
        }
    }
}

extension UITabBar {
    func snapshotDataForTab(atIndex index: Int) -> (UIImage, CGRect) {
        var tabs = subviews.compactMap { (view: UIView) -> UIControl? in
            if let view = view as? UIControl {
                return view
            }
            return nil
        }
        tabs.sort(by: { $0.frame.origin.x < $1.frame.origin.x })
        return (tabs[index].snapshot, tabs[index].globalFrame)
    }
}

主控制器:

class MainTabBarController: UITabBarController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        selectedIndex = 0
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.presentTooltip(forTabAtIndex: 0)
        }
    }
    
    private func presentTooltip(forTabAtIndex index: Int) {
        
        let dimView = UIView(frame: view.frame)
        dimView.backgroundColor = .red
        view.addSubview(dimView)
        
        let (image, frame) = tabBar.snapshotDataForTab(atIndex: index)
        let imageView = UIImageView(image: image)
        imageView.frame = frame
        dimView.addSubview(imageView)
    }
}

有趣的是,当 selectedIndex 为 0 并且我调用 presentTooltip 为值 0 时,一切都按预期工作。但是,如果我用 1 调用 presentTooltip,则不会呈现任何内容。如果我将 selectedIndex 切换为 1,那么它会反转,并且不会为 presentTooltip 渲染任何内容为 0。

似乎我无法捕获非活动选项卡的快照?

    标签: swift uitabbarcontroller uitabbar snapshot


    【解决方案1】:

    快照功能有问题。我可以拍摄未选择的 UITabbar 项目的快照。

    下面是正确的快照函数:

      var snapshot: UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: self.bounds)
        return renderer.image { (context) in
            self.layer.render(in: context.cgContext)
        }
      }
    

    在这里查看项目Github Repo

    这是显示未选择的 UITabbaritem 快照的屏幕截图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多