【问题标题】:Why doesn't my button text show when on top of AVCaptureVideoPreviewLayer?为什么我的按钮文本在 AVCaptureVideoPreviewLayer 上时不显示?
【发布时间】:2017-05-04 19:29:48
【问题描述】:

我有一个 QR 码扫描仪视图,其中有一个 AVCaptureVideoPreviewLayer 和一个 UIButton。

当此视图显示时,按钮内的文本不会显示。它应该显示“取消”字样。如果我触摸按钮或滑动按钮 - 但不点击它,按钮文本将在此时显示。

有谁知道我怎样才能让按钮文本正确显示?

这是我的视图层次结构的样子:

当我第一次进入 Scanner 视图时,按钮如下所示:

没有文字。只有在我触摸按钮后才会显示文本:

最后一件事,这似乎只是 iOS 10 的问题......

欢迎提出任何建议。谢谢!

【问题讨论】:

    标签: ios objective-c xcode uibutton


    【解决方案1】:

    是的。您需要添加一个覆盖视图。

    包含视频预览和叠加视图的主视图。 覆盖视图包含按钮。

    对于每个按钮,如果您想制作动画,可以使用这些事件:

    • 触地
    • TouchUpInside
    • TouchOutInside

    【讨论】:

    • 感谢您的好建议,但不幸的是,它没有奏效。似乎 AVCaptureVideoPreviewLayer 具有焦点。如果我触摸按钮 - 或我添加到此视图的任何按钮 - 它们的行为都相同。没有文字,直到他们被触摸。任何人都知道一种将焦点明确设置在 UIButton 上的方法吗?
    • 而你层是视频预览视图的子层?
    • 不,它是同级层。如果我将其设为子层,则按钮根本不显示。
    【解决方案2】:

    正如AVCaptureSession 的文档所述,startRunning() 调用会阻塞主线程,因此您的 UI 无法正确绘制。

    startRunning() 方法是一个阻塞调用,可能需要一些时间, 因此,您应该在串行队列上执行会话设置,以便 主队列没有被阻塞(保持 UI 响应)。看 AVCam-iOS:使用 AVFoundation 捕捉图像和电影 实现示例。

    如果您查看 Apple 的示例(Swift 3 和 Objective-C),您可以轻松地为这些操作设置一个新队列,而不会阻塞您的主线程。

    如果您需要,这是 Swift 2.3 的示例。

    // Swift 2.3
    
    private let sessionQueue = dispatch_queue_create("session queue", nil)
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        dispatch_async(sessionQueue) { 
            self.configureSession()
        }
    
        dispatch_async(dispatch_get_main_queue()) { 
            self.setupScreen()
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用 layer.insertSublayer(..., above: ...) 或 layer.insertSublayer(..., below: ...) 来控制你的 CALayers 这是类似的答案link 或 关于 Swift 如何在视频流顶部插入图像的更详细说明manual

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 2017-06-06
        • 1970-01-01
        • 2017-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多