iOS10如何自定义相机功能
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章主要介绍了iOS10如何自定义相机功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下//// TGCameraVC
千家信息网最后更新 2025年02月06日iOS10如何自定义相机功能
这篇文章主要介绍了iOS10如何自定义相机功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
具体内容如下
//// TGCameraVC.swift// TGPhotoPicker//// Created by targetcloud on 2017/7/25.// Copyright © 2017年 targetcloud. All rights reserved.//import UIKitimport AVFoundationimport Photos@available(iOS 10.0, *)class TGCameraVC: UIViewController { var callbackPicutureData: ((Data?) -> ())? private var device: AVCaptureDevice? private var input: AVCaptureDeviceInput? private var imageOutput: AVCapturePhotoOutput? private var session: AVCaptureSession? private var previewLayer: AVCaptureVideoPreviewLayer? fileprivate var showImageContainerView: UIView? fileprivate var showImageView: UIImageView? fileprivate var picData: Data? private var flashMode: AVCaptureFlashMode = .auto private weak var flashButton: UIButton? override func viewDidLoad() { super.viewDidLoad() setupCamera() setupUI() if #available(iOS 9.0, *) { let isVCBased = Bundle.main.infoDictionary?["UIViewControllerBasedStatusBarAppearance"] as? Bool ?? false if !isVCBased{ UIApplication.shared.setStatusBarHidden(false, with: .none) } }else { UIApplication.shared.statusBarStyle = .lightContent UIApplication.shared.setStatusBarHidden(false, with: .none) } } override var prefersStatusBarHidden: Bool{ return false } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } private func setupCamera() { AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { success in if !success { let alertVC = UIAlertController(title: TGPhotoPickerConfig.shared.cameraUsage, message: TGPhotoPickerConfig.shared.cameraUsageTip, preferredStyle: .actionSheet) alertVC.addAction(UIAlertAction(title: TGPhotoPickerConfig.shared.confirmTitle, style: .default, handler: nil)) self.present(alertVC, animated: true, completion: nil) } } device = cameraWithPosistion(.back) input = try? AVCaptureDeviceInput(device: device) guard input != nil else { return } imageOutput = AVCapturePhotoOutput() session = AVCaptureSession() session?.beginConfiguration() session?.sessionPreset = TGPhotoPickerConfig.shared.sessionPreset if session!.canAddInput(input) { session!.addInput(input) } if session!.canAddOutput(imageOutput) { session!.addOutput(imageOutput) } previewLayer = AVCaptureVideoPreviewLayer(session: session) previewLayer?.frame = view.bounds previewLayer?.videoGravity = TGPhotoPickerConfig.shared.videoGravity view.layer.addSublayer(previewLayer!) session?.commitConfiguration() session?.startRunning() } private func cameraWithPosistion(_ position: AVCaptureDevicePosition) -> AVCaptureDevice { let type = AVCaptureDeviceType(rawValue: TGPhotoPickerConfig.shared.captureDeviceType.rawValue) return AVCaptureDevice.defaultDevice(withDeviceType: type, mediaType: AVMediaTypeVideo, position: position) } private func setupUI() { let takeButton = UIButton(frame: CGRect(x: 0, y: 0, width: TGPhotoPickerConfig.shared.takeWH, height: TGPhotoPickerConfig.shared.takeWH)) takeButton.center = CGPoint(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height - TGPhotoPickerConfig.shared.buttonEdge.bottom) takeButton.setImage(UIImage.size(width: TGPhotoPickerConfig.shared.takeWH, height: TGPhotoPickerConfig.shared.takeWH).border(width: 3).border(color: .white).color(.clear).corner(radius: TGPhotoPickerConfig.shared.takeWH / 2).image + UIImage.size(width: TGPhotoPickerConfig.shared.takeWH - 10, height: TGPhotoPickerConfig.shared.takeWH - 10).color(UIColor(white: 0.95, alpha: 1) ).corner(radius: (TGPhotoPickerConfig.shared.takeWH - 10) / 2).image, for: .normal) takeButton.setImage(UIImage.size(width: TGPhotoPickerConfig.shared.takeWH, height: TGPhotoPickerConfig.shared.takeWH).border(width: 3).border(color: .white).color(.clear).corner(radius: TGPhotoPickerConfig.shared.takeWH / 2).image + UIImage.size(width: TGPhotoPickerConfig.shared.takeWH - 10, height: TGPhotoPickerConfig.shared.takeWH - 10).color(UIColor(white: 0.8, alpha: 1) ).corner(radius: (TGPhotoPickerConfig.shared.takeWH - 10) / 2).image, for: .highlighted) takeButton.addTarget(self, action: #selector(takePhotoAction), for: .touchUpInside) view.addSubview(takeButton) let cameraChangeButton = UIButton(frame: CGRect(x: 0, y: 0, width: TGPhotoPickerConfig.shared.takeWH * 0.6, height: TGPhotoPickerConfig.shared.takeWH * 0.6)) cameraChangeButton.setImage(TGPhotoPickerConfig.getImageNo2x3xSuffix("camera"), for: .normal) cameraChangeButton.center = CGPoint(x: UIScreen.main.bounds.width - TGPhotoPickerConfig.shared.buttonEdge.right, y: takeButton.center.y) cameraChangeButton.addTarget(self, action: #selector(changeCameraPositionAction), for: .touchUpInside) cameraChangeButton.contentMode = .scaleAspectFit view.addSubview(cameraChangeButton) let flashChangeButton = UIButton(frame: CGRect(x: 0, y: 0, width: TGPhotoPickerConfig.shared.takeWH * 0.5, height: TGPhotoPickerConfig.shared.takeWH * 0.5)) flashChangeButton.center = CGPoint(x: cameraChangeButton.center.x, y: TGPhotoPickerConfig.shared.buttonEdge.top) flashChangeButton.setImage(TGPhotoPickerConfig.getImageNo2x3xSuffix("flashauto"), for: .normal) flashChangeButton.addTarget(self, action: #selector(flashChangeAction), for: .touchUpInside) flashChangeButton.contentMode = .scaleAspectFit flashButton = flashChangeButton view.addSubview(flashChangeButton) let backButton = UIButton(frame: CGRect(x: 0, y: 0, width: TGPhotoPickerConfig.shared.takeWH * 0.4, height: TGPhotoPickerConfig.shared.takeWH * 0.4)) backButton.center = CGPoint(x: TGPhotoPickerConfig.shared.buttonEdge.left , y: flashChangeButton.center.y) backButton.setImage(UIImage.size(width: TGPhotoPickerConfig.shared.takeWH * 0.4, height: TGPhotoPickerConfig.shared.takeWH * 0.4) .corner(radius: TGPhotoPickerConfig.shared.takeWH * 0.2) .color(.clear) .border(color: UIColor.white.withAlphaComponent(0.7)) .border(width: TGPhotoPickerConfig.shared.isShowBorder ? TGPhotoPickerConfig.shared.checkboxLineW : 0) .image .with({ context in context.setLineCap(.round) UIColor.white.setStroke() context.setLineWidth(TGPhotoPickerConfig.shared.checkboxLineW) let WH = TGPhotoPickerConfig.shared.takeWH * 0.4 context.move(to: CGPoint(x: WH * 0.6, y: WH * 0.2)) context.addLine(to: CGPoint(x: WH * 0.35, y: WH * 0.5)) context.move(to: CGPoint(x: WH * 0.35, y: WH * 0.5)) context.addLine(to: CGPoint(x: WH * 0.6, y: WH * 0.8)) context.strokePath() }), for: .normal) backButton.contentMode = .scaleAspectFit backButton.addTarget(self, action: #selector(backAction), for: .touchUpInside) view.addSubview(backButton) showImageContainerView = UIView(frame: view.bounds) showImageContainerView?.backgroundColor = TGPhotoPickerConfig.shared.previewBGColor view.addSubview(showImageContainerView!) let height = showImageContainerView!.bounds.height - TGPhotoPickerConfig.shared.takeWH - TGPhotoPickerConfig.shared.buttonEdge.bottom - TGPhotoPickerConfig.shared.previewPadding * 2 showImageView = UIImageView(frame: CGRect(x: TGPhotoPickerConfig.shared.previewPadding, y: TGPhotoPickerConfig.shared.previewPadding * 2, width: showImageContainerView!.bounds.width - 2 * TGPhotoPickerConfig.shared.previewPadding, height: height)) showImageView?.contentMode = .scaleAspectFit showImageContainerView?.addSubview(showImageView!) showImageContainerView?.isHidden = true let giveupButton = createImageOperatorButton(nil, CGPoint(x: TGPhotoPickerConfig.shared.takeWH * 1.5, y: showImageContainerView!.bounds.height - TGPhotoPickerConfig.shared.takeWH * 1.5), TGPhotoPickerConfig.shared.getCheckboxImage(true, true, .circle, TGPhotoPickerConfig.shared.takeWH * 0.7).unselect) giveupButton.addTarget(self, action: #selector(giveupImageAction), for: .touchUpInside) showImageContainerView?.addSubview(giveupButton) let ensureButton = createImageOperatorButton(nil, CGPoint(x: showImageContainerView!.bounds.width - TGPhotoPickerConfig.shared.takeWH * 1.5, y: showImageContainerView!.bounds.height - TGPhotoPickerConfig.shared.takeWH * 1.5), TGPhotoPickerConfig.shared.getCheckboxImage(true, false, .circle, TGPhotoPickerConfig.shared.takeWH * 0.7).select) ensureButton.addTarget(self, action: #selector(useImageAction), for: .touchUpInside) showImageContainerView?.addSubview(ensureButton) } private func createImageOperatorButton(_ title: String?, _ center: CGPoint, _ img: UIImage?) -> UIButton { let btn = UIButton(frame: CGRect(x: 0, y: 0, width: TGPhotoPickerConfig.shared.takeWH * 0.7, height: TGPhotoPickerConfig.shared.takeWH * 0.7)) btn.center = center btn.setTitle(title, for: .normal) btn.setImage(img, for: .normal) btn.contentMode = .scaleAspectFit return btn } @objc private func flashChangeAction() { switch flashMode { case .auto: flashMode = .on flashButton?.setImage(TGPhotoPickerConfig.getImageNo2x3xSuffix("flash"), for: .normal) case .on: flashMode = .off flashButton?.setImage(TGPhotoPickerConfig.getImageNo2x3xSuffix("flashno"), for: .normal) case .off: flashMode = .auto flashButton?.setImage(TGPhotoPickerConfig.getImageNo2x3xSuffix("flashauto"), for: .normal) } } @objc private func backAction() { dismiss(animated: true, completion: nil) } @objc private func takePhotoAction() { let connection = imageOutput?.connection(withMediaType: AVMediaTypeVideo) guard connection != nil else { return } let photoSettings = AVCapturePhotoSettings() photoSettings.flashMode = flashMode imageOutput?.capturePhoto(with: photoSettings, delegate: self) } @objc private func changeCameraPositionAction() { let animation = CATransition() animation.duration = 0.5 animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) animation.type = TGPhotoPickerConfig.shared.transitionType let newDevice: AVCaptureDevice! let newInput: AVCaptureDeviceInput? let position = input?.device.position if position == .front { newDevice = cameraWithPosistion(.back) animation.subtype = kCATransitionFromLeft } else { newDevice = cameraWithPosistion(.front) animation.subtype = kCATransitionFromRight } newInput = try? AVCaptureDeviceInput(device: newDevice) guard newInput != nil else{ return } previewLayer?.add(animation, forKey: nil) session?.beginConfiguration() session?.removeInput(input) if session!.canAddInput(newInput) { session?.addInput(newInput!) input = newInput } else { session?.addInput(input) } session?.commitConfiguration() } @objc private func giveupImageAction() { showImageView?.image = UIImage() showImageContainerView?.isHidden = true } @objc private func useImageAction() { callbackPicutureData?(picData) dismiss(animated: true, completion: nil) }}@available(iOS 10.0, *)extension TGCameraVC: AVCapturePhotoCaptureDelegate { func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { if error != nil { print("error = \(String(describing: error?.localizedDescription))") } else { if let imageData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer!, previewPhotoSampleBuffer: previewPhotoSampleBuffer){ picData = imageData showImageContainerView?.isHidden = false showImageView?.image = UIImage(data: imageData) if TGPhotoPickerConfig.shared.saveImageToPhotoAlbum{ self.saveImageToPhotoAlbum(UIImage(data: imageData)!) } } } } fileprivate func saveImageToPhotoAlbum(_ savedImage:UIImage){ UIImageWriteToSavedPhotosAlbum(savedImage, self, #selector(imageDidFinishSavingWithErrorContextInfo), nil) } @objc fileprivate func imageDidFinishSavingWithErrorContextInfo(image:UIImage,error:NSError?,contextInfo:UnsafeMutableRawPointer?){ if canUseAlbum(){ let msg = (error != nil) ? TGPhotoPickerConfig.shared.saveImageFailTip : TGPhotoPickerConfig.shared.saveImageSuccessTip let alert = UIAlertView(title: TGPhotoPickerConfig.shared.saveImageTip, message: msg, delegate: self, cancelButtonTitle: TGPhotoPickerConfig.shared.confirmTitle) alert.show() } } fileprivate func canUseAlbum()-> Bool{ if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.authorized { let alertView = UIAlertView(title: TGPhotoPickerConfig.shared.PhotoLibraryUsage, message: TGPhotoPickerConfig.shared.PhotoLibraryUsageTip, delegate: nil, cancelButtonTitle: TGPhotoPickerConfig.shared.confirmTitle, otherButtonTitles: TGPhotoPickerConfig.shared.cancelTitle) alertView.tag = TGPhotoPickerConfig.shared.alertViewTag alertView.show() return false }else{ return true } }}
感谢你能够认真阅读完这篇文章,希望小编分享的"iOS10如何自定义相机功能"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
篇文章
功能
相机
价值
兴趣
内容
同时
更多
朋友
知识
编带
行业
资讯
资讯频道
频道
参考
学习
帮助
支持
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全策划演讲稿
数据库索引丢失
网络安全是开发的吗
确保网络安全工作做到位
海外代办服务器
软件开发计划表excel
台州网络安全保卫支队
键值对数据库怎么设计
广州所有软件开发微信开发
服务器托管服务商
微盟数据库网络安全吗
国家医保目录数据库
软件开发公司前景分析
网络安全市场总体支出
博朗高西软件开发成都
联通服务器安装员
高斯数据库查询用户权限
软件开发工资高不高
数据库审计中用多少数据库
中古银行软件开发岗位
中央情报局网络安全
饭圈乱象 网络安全
美国网络安全评价体系研究
网络安全确保成效
计算机网络技术人员四级
谜底是网络安全用词的谜语
泰拉瑞亚服务器怎么看版本
软件开发 什么研究方法
西藏算力服务器租赁收费
爱博驰网络技术北京