2016-12-19 4 views
1

У меня есть просмотр сканера QR-кода, в котором у меня есть AVCaptureVideoPreviewLayer и UIButton.Почему мой текст кнопки не отображается, когда поверх AVCaptureVideoPreviewLayer?

Когда отображается это представление, текст внутри кнопки не отображается. Он должен отображать слово «Отмена». Если я касаюсь кнопки или прокручиваю кнопку, но не нажимаю ее, текст кнопки будет отображаться в этой точке.

Кто-нибудь знает, как я могу правильно отобразить текст кнопки?

Вот что мое мнение иерархия выглядит следующим образом:

enter image description here

Когда я сначала введите вид сканера, кнопки выглядят следующим образом:

enter image description here

Там нет текста. Текст будет отображаться только после того, как я касаюсь кнопки:

enter image description here

Одна последняя вещь, это кажется, что это проблема только IOS 10 ...

Любые предложения приветствуются. Благодаря!

ответ

0

Да. Вам нужно добавить оверлейный вид.

Главный вид, содержащий предварительный просмотр видео и наложение. Оверлей вид содержит кнопки.

Для каждой кнопки, вы можете использовать эти события, если вы хотите анимировать:

  • TouchDown
  • TouchUpInside
  • TouchOutInside
+0

Спасибо за хорошие предложения, но, к сожалению, это не работает. Кажется, что AVCaptureVideoPreviewLayer имеет фокус. Если я касаюсь кнопки - или любой кнопки, которую я добавляю к этому представлению, все они ведут себя одинаково. Нет текста, пока они не коснутся. Кто-нибудь знает, как явно установить фокус на UIButton? – jekie

+0

И вы слой является подслоем просмотра видео предварительного просмотра? –

+0

нет, это родственный слой. если я сделаю его подслоем, кнопка вообще не появится. – jekie

0

В документации AVCaptureSession состояний, startRunning() блоков вызова основной поток, чтобы ваш пользовательский интерфейс не был правильно нарисован.

Метод startRunning() представляет собой блокирующий вызов, который может занять некоторое время, поэтому вы должны выполнить установку сеанса на последовательной очереди таким образом, что основной очереди не блокируется (который держит интерфейс реагирует). См. 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() 
    } 
} 
0

Использование layer.insertSublayer (..., выше: ...) или layer.insertSublayer (..., ниже: ...), Чтобы контролировать CALayers Вот подобный ответ link или немного более подробные инструкции для Swift, как вставить изображение в верхней части видеопотока manual