我正在尝试做一个简单的应用程序,它将在iphone屏幕的上半部分显示后置摄像头所看到的原始预览,而在下半部分显示相同的预览,但应用了不同的滤镜。
我首先得到了原始的预览部分,并不是太难,这要归功于几篇SO和博客文章。我要显示的UIImageView将占据该部分的整个屏幕。
为了得到半屏视图,我只需将图像视图的高度除以2,然后设置它的contentMode来显示所有内容,同时保持相同的纵横比:
imageView = UIImageView(frame: CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height/2))
imageView.contentMode = UIViewContentMode.ScaleAspectFit降低高度是有效的,但视图中的图像是垂直压缩的(例如,直视的硬币看起来像水平的椭圆形)。我不认为这是巧合,预览的外观看起来像contentMode的默认ScaleToFill,但我没有尝试改变模式。
完整的代码如下-该项目有一个场景和一个视图控制器类;所有的工作都是通过编程完成的。
谢谢!
import UIKit
import AVFoundation
class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate
{
var imageView : UIImageView!
override func viewDidLoad()
{
super.viewDidLoad()
imageView = UIImageView(frame: CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height/2))
imageView.contentMode = UIViewContentMode.ScaleAspectFit
view.addSubview(imageView)
let captureSession = AVCaptureSession()
captureSession.sessionPreset = AVCaptureSessionPresetHigh
let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
do
{
let input = try AVCaptureDeviceInput(device: backCamera)
captureSession.addInput(input)
}
catch
{
print("Camera not available")
return
}
// Unused but required for AVCaptureVideoDataOutputSampleBufferDelegate:captureOutput() events to be fired
let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
view.layer.addSublayer(previewLayer)
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: dispatch_queue_create("SampleBufferDelegate", DISPATCH_QUEUE_SERIAL))
if captureSession.canAddOutput(videoOutput)
{
captureSession.addOutput(videoOutput)
}
videoOutput.connectionWithMediaType(AVMediaTypeVideo).videoOrientation = AVCaptureVideoOrientation.Portrait
captureSession.startRunning()
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!)
{
let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
let cameraImage = CIImage(CVPixelBuffer: pixelBuffer!)
dispatch_async(dispatch_get_main_queue())
{
self.imageView.image = UIImage(CIImage: cameraImage)
}
}
}发布于 2016-10-12 05:10:08
我猜这行有问题,因为它在viewDidLoad()方法中。
我不确定这是否与你的问题有关,但我觉得这对你来说很重要。
imageView = UIImageView(frame: CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height/2))你不能在viewDidLoad()函数中获得正确的视图大小。
此外,在iOS 10中,我发现在(0, 0, 1000, 1000)布局引擎正确布局控件之前,控件的大小最初是从故事板调整到iOS的。
此外,您在viewDidLoad()中获得的大小可以是故事板中的视图控制器的大小。因此,如果你在4英寸的屏幕上布局控件,即使你在iPhone6或更大的屏幕上运行应用程序,它也会在viewDidLoad()方法中返回4英寸屏幕的大小。
此外,请将imageView.layer.maskToBounds属性设置为true,以防止图像的任何外框。
另一件事是,当视图边界发生变化(如屏幕旋转)时,您应该放置适当的代码来布局图像视图。
https://stackoverflow.com/questions/39986579
复制相似问题