2015-02-12 3 views
0

Я разрабатываю приложение, которое позволяет пользователю делать фотографии. Я начал использовать AVCam яблоко дает, но я на самом деле есть проблема Просто я не могу расположить камеры слой, где я хочу, но он автоматически позиционируется на центр ViewAVCaptureVideoPreviewLayer и предварительный просмотр с позиции камеры

enter image description here

На левой стороне вы можете видеть, что у меня на самом деле есть, с правой стороны, что я хотел бы иметь. The View, который содержит предварительный просмотр, который исходит от камеры является UIView подкласс и это код

class AVPreviewView : UIView { 
    override class func layerClass() -> AnyClass { 
     return AVCaptureVideoPreviewLayer.self 
    } 
    func session() -> AVCaptureSession { 
     return (self.layer as AVCaptureVideoPreviewLayer).session 
    } 

    func setSession(session : AVCaptureSession) -> Void { 
     (self.layer as AVCaptureVideoPreviewLayer).session = session; 
     (self.layer as AVCaptureVideoPreviewLayer).videoGravity = AVLayerVideoGravityResizeAspect; 

    } 
} 

Любая помощь приветствуется

ответ

9

Сначала получите размер экрана, так что вы можете рассчитать соотношение сторон

let screenWidth = UIScreen.mainScreen().bounds.size.width 
    let screenHeight = UIScreen.mainScreen().bounds.size.height 
    var aspectRatio: CGFloat = 1.0 

    var viewFinderHeight: CGFloat = 0.0 
    var viewFinderWidth: CGFloat = 0.0 
    var viewFinderMarginLeft: CGFloat = 0.0 
    var viewFinderMarginTop: CGFlaot = 0.0 

Теперь рассчитать размер слоя предварительного просмотра.

func setSession(session : AVCaptureSession) -> Void { 

     if screenWidth > screenHeight { 
      aspectRatio = screenHeight/screenWidth * aspectRatio 
      viewFinderWidth = self.bounds.width 
      viewFinderHeight = self.bounds.height * aspectRatio 
      viewFinderMarginTop *= aspectRatio 
     } else { 
      aspectRatio = screenWidth/screenHeight 
      viewFinderWidth = self.bounds.width * aspectRatio 
      viewFinderHeight = self.bounds.height 
      viewFinderMarginLeft *= aspectRatio 
     } 

     (self.layer as AVCaptureVideoPreviewLayer).session = session; 

Установите слоя videoGravity в AVLayerVideoGravityResizeAspectFill так, чтобы слой растягивается, чтобы заполнить данный пользовательский вид.

 (self.layer as AVCaptureVideoPreviewLayer).videoGravity = AVLayerVideoGravityResizeAspectFill; 

Наконец, установите рамку вашего слоя предварительного просмотра в значения, вычисленные выше, с любым смещением, которое вам нравится.

 (self.layer as AVCaptureVideoPreviewLayer).frame = CGRectMake(viewFinderMarginLeft, viewFinderMarginTop, viewFinderWidth, viewFinderHeight) 

    } 

Это может занять некоторое тонкой настройки, так как я не проверял его вживую, но вы должны быть в состоянии создать более гибкую VideoPreviewArea, ограниченную пределами вашего APPreviewView.

1

То, что вы видите, это не тот слой, который находится так, насколько он отличается от аспекта вида/слоя, который не соответствует формату изображения камеры, поэтому он использует свойство и аспект, заполняющий его (videoGravity) который всегда подразумевает центрирование)

Когда вы создаете слой, размер его так, чтобы соотношение сторон было правильным, затем поместите его по желанию. Или, в этом случае, измените размер представления на правильное соотношение сторон, затем представление можно поместить по желанию.

0

Я столкнулся с этой проблемой, и предоставленный код не исправил ситуацию, даже несмотря на то, что код работал. Я создаю свое приложение с помощью конструктора интерфейса.

В инспекторе атрибутов там под краями расширены настройки, которые все виды должны быть расширены под верхними барами и под нижними барами. Мои настройки были проверены, что отбрасывало расчеты для позиционирования представления.

utilities navigator

Продлить настройки края:

extend edges settings

Смежные вопросы