Проектирование раскадровки и создание выходов и свойств в классе ViewController.
let picker = UIImagePickerController()
var circlePath = UIBezierPath()
@IBOutlet weak var crop: CropView!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var scroll: UIScrollView!
Обрезание свойства имеет собственный класс UIView.Добавьте в него функцию делегата ниже.
func point(inside point: CGPoint, with event: UIEvent?) -> Bool{
return false
}
Создать расширение для UIImage и UIImageView - см.Для масштабирования изображения используйте функцию делегата viewForZooming, затем добавьте UIScrollViewDelegate в класс в качестве подтипа и верните imageView.
Выбрать изображение из галереи - Создать IBAction, Чтобы выбрать изображение из альбома и установить тип источника средства выбора в качестве библиотеки фотографийиспользуйте код ниже
picker.sourceType = .photoLibrary
present(picker, animated: true, completion: nil)
и добавьте UIImagePickerControllerDelegate в класс как подтип.В viewDidLoad,
picker.delegate = self
Используйте функцию didFinishPickingMediaWithInfo - UIImagePickerControllerDelegate, чтобы установить изображение для представления после выбора изображения из альбома.
let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
imageView.image = chosenImage.resizeImage()
dismiss(animated:true, completion: nil)
Чтобы закрыть фотоальбом после отмены, используйте imagePickerControllerделегат.
Снимать изображение с камеры - создайте IBAction для съемки изображения с камеры.Сначала проверьте, есть ли SourceTypeAvailable в устройстве.Если установлен режим захвата камеры в качестве фотографии.Иначе обработайте действие. Затем установите тип источника в качестве камеры и режим захвата камеры в качестве фотографии.
if UIImagePickerController.isSourceTypeAvailable(.camera){
picker.sourceType = UIImagePickerControllerSourceType.camera
picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureMode.photo
picker.modalPresentationStyle = .custom
present(picker,animated: true,completion: nil)
}else{
//action performed if there is no camera in device.
}
Обрезка -
Добавьте подслой к выбранному изображению - этослой предоставляет область для исправления рамки обрезки.
let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height), cornerRadius: 0)
Назначьте путь к свойству круга в виде UIBezierPath.Используя BezierPath, вы можете изменить рамку обрезки на различные формы.
circlePath = UIBezierPath(roundedRect: CGRect(x: (self.view.frame.size.width / 2) - (size/2), y: (self.view.frame.size.height / 2) - (size / 2), width: size, height: size, cornerRadius: 0)
path.append(circlePath)
CAShapeLayer, который рисует кубический сплайн Безье в своем координатном пространстве.
let fillLayer = CAShapeLayer()
fillLayer.path = path.cgPath
Наконец, добавьте слой вview,
view.layer.addSublayer(fillLayer)
Добавить область обрезки: Создать область обрезки.Для этого нам нужно установить коэффициент, разделив ширину изображения imageView на установленный масштаб ширины рамки просмотра,
let factor = imageView.image!.size.width/view.frame.width
для масштабирования как scroll zoomScale.
let scale = 1/scroll.zoomScale
Затем установите рамку области кадрирования (x, y, ширина, высота).
let x = (scroll.contentOffset.x + circlePath.bounds.origin.x - imageFrame.origin.x) * scale * factor
let y = (scroll.contentOffset.y + circlePath.bounds.origin.y - imageFrame.origin.y) * scale * factor
let width = circlePath.bounds.width * scale * factor
let height = circlePath.bounds.height * scale * factor
Наконец, создайте IBAction для обрезки изображения.
let croppedCGImage = imageView.image?.cgImage?.cropping(to: croparea)
let croppedImage = UIImage(cgImage: croppedCGImage!)