Я покажу, как я это сделал.
Я создал контроллер вида (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)
}
Тогда я называю ImagePicker
в viewDidAppear
:
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()
}
Как вы можете видеть, что я называю OverlayVC
, когда я показываю ImagePicker. Это другое представление, которое я создал, см. Скриншот здесь: http://imgur.com/6nr4PNW. Но его выходы также подключены к PhotoPicker
. Не создавайте другой класс, просто вид в раскадровке и кнопки подключения & co к классу PhotoPicker
.
Вы попробовали это: http://stackoverflow.com/questions/9362712/uiimagepickercontroller-crops-picture-to-square-in-portrait? –
@ Mr.T Спасибо за ответ. Позвольте мне проверить это. – user100
@ Mr.T Эта библиотека не работает с камерой. просто показывая камеру и культуру по умолчанию. Пожалуйста, предложите мне показать круговой обрезку после захвата фотографии, например, iPhone-приложения для контактов с iPhone. спасибо – user100