带有 UIImagePickerController iOS 的圆形裁剪器相机?

Posted

技术标签:

【中文标题】带有 UIImagePickerController iOS 的圆形裁剪器相机?【英文标题】:Circular Cropper Camera with UIImagePickerController iOS? 【发布时间】:2015-09-24 18:14:40 【问题描述】:

我正在使用带有 cameraSource 类型的 UIImagePickerController。但我注意到有 方形裁剪器 而不是带有“移动和缩放”的圆形裁剪器

ios 原生联系人应用中,有一个带有“移动和缩放”标题的圆形裁剪器。但是当我使用带有相机源类型的 UIImagePickerController 时,我得到了一个没有标题的方形裁剪器。

请推荐一些库或代码

这是用户选择使用相机拍照时的 iOS 原生应用屏幕截图。我想要一样的

谢谢

【问题讨论】:

你试过这个吗:***.com/questions/9362712/…? @Mr.T 感谢您的回复。让我检查一下.. @Mr.T 此库不适用于 camera 。只显示相机和默认裁剪器。请建议我在拍摄 iPhone 原生联系人应用程序等照片后如何显示圆形裁剪器。谢谢 【参考方案1】:

我会展示我是如何做到的。

我创建了一个视图控制器 (PhotoPicker) 来用相机拍照并用他的圆形图层裁剪它们。它在底部包含一个工具栏,带有重拍和完成按钮以及滚动视图中的图像视图(请参阅此处我的 PhotoPicker 的屏幕截图:http://imgur.com/MleuKmh)。

当我想拍照时,我使用以下代码打开我的PhotoPicker

let photoPickerVC=self.storyboard?.instantiateViewControllerWithIdentifier("photoPickerVC") as! PhotoPicker
photoPickerVC.modalPresentationStyle=UIModalPresentationStyle.OverFullScreen
self.presentViewController(photoPickerVC, animated: true, completion: nil)

我的 PhotoPicker 班级需要UIImagePickerControllerDelegate 才能拍照。

我在viewDidLoad 中调用这个函数来创建裁剪。

func addCropLayer()
        //layer circle
        let circleLayer=CAShapeLayer()
        let squareLength=self.view.frame.width - 40
        innerrect=CGRectMake(20, self.view.center.y - (squareLength/2) - self.toolBar.frame.height, squareLength, squareLength)
        let path2=UIBezierPath(ovalInRect: innerrect)
        path2.usesEvenOddFillRule=true
        circleLayer.path=path2.CGPath
        circleLayer.fillColor=UIColor.clearColor().CGColor

        let path=UIBezierPath(roundedRect: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height - toolBar.frame.height), cornerRadius: 0)
        path.appendPath(path2)
        path.usesEvenOddFillRule=true

        //black layer that contains the transparent circle
        //var fillLayer=CAShapeLayer()
        fillLayer.path=path.CGPath
        fillLayer.fillRule=kCAFillRuleEvenOdd
        fillLayer.fillColor=UIColor.blackColor().CGColor
        fillLayer.opacity=0.8

        self.view.layer.addSublayer(fillLayer)
        self.view.addSubview(toolBar)
    

然后我在viewDidAppear中调用ImagePicker

override func viewDidAppear(animated: Bool) 
    self.showImagePickerForSourceType(UIImagePickerControllerSourceType.Camera)


func showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType)
        print("showImagePickerForSourceType")
        if self.imageView.isAnimating()
            self.imageView.stopAnimating()
        
        //var capturedImages=NSMutableArray()
        if self.capturedImages.count>0 
            self.capturedImages.removeAllObjects()
        

        let imagePickerController=UIImagePickerController()
        imagePickerController.modalPresentationStyle=UIModalPresentationStyle.CurrentContext
        imagePickerController.sourceType=sourceType
        imagePickerController.delegate=self
        imagePickerController.cameraDevice=UIImagePickerControllerCameraDevice.Front

        if sourceType == UIImagePickerControllerSourceType.Camera 
            imagePickerController.showsCameraControls=false
            NSBundle.mainBundle().loadNibNamed("OverlayVC", owner: self, options: nil)
            self.overlayView.frame=UIScreen.mainScreen().bounds
            imagePickerController.cameraOverlayView=self.overlayView
            self.overlayView=nil
        

        print("presentviewcontroller")
        self.imagePickerController=imagePickerController

        let screenSize:CGSize=UIScreen.mainScreen().bounds.size
        let cameraAspectRatio:CGFloat=3.0/4.0
        print("camera aspect ratio: \(cameraAspectRatio)")
        let scale=(screenSize.height / screenSize.width) * cameraAspectRatio
        print("scale: \(scale)")
        let yOffset=(screenSize.height - screenSize.width / cameraAspectRatio)/2
        print("y offset: \(yOffset)")
        let translate:CGAffineTransform=CGAffineTransformMakeTranslation(0, yOffset)
        let fullScreen:CGAffineTransform=CGAffineTransformMakeScale(scale, scale)
        let fullTransform:CGAffineTransform=CGAffineTransformConcat(fullScreen, translate)
        self.imagePickerController.cameraViewTransform=fullTransform

        let iOS:NSString=UIDevice.currentDevice().systemVersion
        let iOSint:Int=iOS.integerValue
        print("iOS int value: \(iOSint)")

        if iOSint < 8 
            print("ios < 8")
            var rect:CGRect=self.imagePickerController.view.frame
            rect.size.height = screenSize.width / cameraAspectRatio
            rect.size.width = screenSize.width
            print("rect: \(rect)")
            self.imagePickerController.view.frame=rect
            self.imagePickerController.view.transform=fullTransform
        else
            self.imagePickerController.view.frame=UIScreen.mainScreen().bounds
        

        self.presentViewController(self.imagePickerController, animated: true, completion: nil)
    


@IBAction func takePhoto(sender: AnyObject) 
        print("takePhoto")
        self.imagePickerController.takePicture()
    

如您所见,当我显示 ImagePicker 时,我调用了 OverlayVC。这是我创建的另一个视图,请在此处查看屏幕截图:http://imgur.com/6nr4PNW。但它的网点也连接到PhotoPicker。不要创建另一个类,只创建故事板中的视图并将按钮和 co 连接到 PhotoPicker 类。

【讨论】:

感谢您的回复。但我不能理解太多。我在我的代码中使用objectivec..请写更多文档。 您需要在情节提要(PhotoPicker)中创建一个视图控制器和另一个作为视图的xib文件(Overlay)。两者都连接到一个类(PhotoPicker.swift),您可以在其中拥有我给您的代码,该代码允许您拍摄和裁剪照片。但是很抱歉我不能给你 Obj-C 中的代码。 谢谢。当我在相机捕获屏幕上时它没有像 iOS 原生联系人应用程序那样显示全屏图像捕获请看一下这个***.com/questions/32822246/… showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType)方法中查看具有纵横比、比例等的部分。

以上是关于带有 UIImagePickerController iOS 的圆形裁剪器相机?的主要内容,如果未能解决你的问题,请参考以下文章

ViewController 生命周期 UINavigationController

如何从 webview 使用 UIImagePickerController

iPhone OS 3.0 中的 UIImagePickerController

iOS开发——打开手机相册,获取图片

如何使用 iphone 中的核心数据将图像存储到 sqlite? [复制]

带有多个链接的 NSAttributedString 的 UILabel,带有行限制,显示尾部截断,带有未见文本的 NSBackgroundColorAttributeName