快速创建完全可定制的相机视图。保持您的代码清洁
Mijick 的 CameraView 是一个强大的开源库,简化了相机展示过程,使其超快且完全可定制,让您能够关注项目的重要元素,同时隐藏技术复杂性。
- 完全自定义您的 UI。使用我们设计的干净现代 UI,或在几分钟内完全更改它!
- 涵盖整个流程。我们的库不仅可以展示相机控制器,请求权限,如果未授予权限,显示错误视图,还可以在单独的视图中显示捕获结果(如果您希望的话)。
- 提高代码质量。让您能够关注最重要的东西,在这个强大的库内部隐藏实现细节。
- 针对 SwiftUI 设计。在我们开发这个库的过程中,我们利用了 SwiftUI 的功能,为您提供了实现流程的强大工具。
平台 | 最低 Swift 版本 |
---|---|
iOS 14+ | 5.10 |
Swift 包管理器是一个用于自动分发 Swift 代码的工具,它集成到 Swift 编译器中。
一旦您的 Swift 包设置好,将 PopupView 添加为依赖项就像将其添加到 Package.swift
的 dependencies
值一样简单。
dependencies: [
.package(url: "https://github.com/Mijick/CameraView.git", branch(“main”))
]
CocoaPods 是 Swift 和 Objective-C Cocoa 项目的依赖项管理器,有助于优雅地扩展它们。
安装步骤
- 安装 CocoaPods 1.10.0(或更高版本)
- 为您的项目生成 CocoaPods
pod init
- 将 CocoaPods 依赖项添加到您的
Podfile
pod 'MijickCameraView'
- 安装依赖项并生成
.xcworkspace
文件
pod install
- 使用新的 XCode 项目文件
.xcworkspace
打开您的项目 info.plist 文件。添加两个新键: Privacy - Microphone Usage Description
和 Privacy - Camera Usage Description
。值将在用户拒绝上述权限之一时默认显示在错误屏幕中。
MCameraController 包含三个屏幕 - CameraView
,CameraPreview
(可以关闭)和 CameraErrorView
。因此,我们建议在声明 MCameraController
的视图中不应有任何其他元素。我们围绕我们的经验和所了解的开发者的需要设计了此系统。但是,如果您的偏好不同,我们很高兴满足您的期望,并调整我们的库。通过为此项目创建一个 问题 与我们分享它们。
struct CameraView: View {
(...)
var body: some View {
MCameraController()
}
(...)
}
上述函数定义了给定操作之后会发生什么,这些都是可选的;例如,如果您的应用程序仅捕获图像,则不需要声明 onVideoCaptured
等。
struct CameraView: View {
(...)
var body: some View {
MCameraController()
.onImageCaptured { data in
print("IMAGE CAPTURED")
}
.onVideoCaptured { url in
print("VIDEO CAPTURED")
}
.afterMediaCaptured {
print("IMAGE OR VIDEO WAS PROCESSED. WHAT'S NEXT?")
}
.onCloseController {
print("CLOSE THE CONTROLLER")
}
}
(...)
}
由Mijick开发的CameraView库,可以让您为MCameraController
锁定屏幕旋转,即使设备旋转已解锁。为了实现这一点,创建一个遵循MApplicationDelegate
的AppDelegate类,在@main struct
中声明@UIApplicationDelegateAdaptor
并设置lockOrientation(AppDelegate.self)
用于MCameraController
。
class AppDelegate: NSObject, MApplicationDelegate {
static var orientationLock = UIInterfaceOrientationMask.all
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { AppDelegate.orientationLock }
}
@main struct CameraView_DemoApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup(content: CameraView.init)
}
}
struct CameraView: View {
(...)
var body: some View {
MCameraController()
.lockOrientation(AppDelegate.self)
}
(...)
}
您可以使用以下列表中的修饰符来修改初始相机设置
struct CameraView: View {
(...)
var body: some View {
MCameraController()
.outputType(.video)
.cameraPosition(.front)
.flashMode(.auto)
.gridVisible(false)
.focusImage(.init(named: "icon-focus")!)
.focusImageColor(.blue)
.focusImageSize(120)
}
(...)
}
通过创建一个新的结构体,遵循MCameraView
并使用cameraScreen
修饰符,您可以更改CameraView
的外观。
struct CustomCameraView: MCameraView {
@ObservedObject var cameraManager: MijickCameraView.CameraManager
let namespace: Namespace.ID
let closeControllerAction: () -> ()
var body: some View {
VStack(spacing: 0) {
createNavigationBar()
createCameraView()
createCaptureButton()
}
}
}
private extension CustomCameraView {
func createNavigationBar() -> some View {
Text("This is a Custom Camera View")
.padding(.top, 12)
.padding(.bottom, 12)
}
func createCaptureButton() -> some View {
Button(action: captureOutput) { Text("Click to capture") }
.padding(.top, 12)
.padding(.bottom, 12)
}
}
struct CameraView: View {
(...)
var body: some View {
MCameraController()
.cameraScreen(CustomCameraView.init)
}
(...)
}
通过创建一个新的结构体,遵循MCameraPreview
并使用mediaPreviewScreen
修饰符,您可以更改CameraPreview
的外观。
注意:要禁用捕获媒体的预览,请使用带有nil作为参数的mediaPreviewScreen修饰符。
struct CustomCameraPreview: MCameraPreview {
let capturedMedia: MijickCameraView.MCameraMedia
let namespace: Namespace.ID
let retakeAction: () -> ()
let acceptMediaAction: () -> ()
var body: some View {
VStack(spacing: 0) {
Spacer()
createContentView()
Spacer()
createButtons()
}
}
}
private extension CustomCameraPreview {
func createContentView() -> some View { ZStack {
if let image = capturedMedia.image { createImageView(image) }
else { EmptyView() }
}}
func createButtons() -> some View {
HStack(spacing: 24) {
createRetakeButton()
createSaveButton()
}
}
}
private extension CustomCameraPreview {
func createImageView(_ image: Data) -> some View {
Image(uiImage: .init(data: image) ?? .init())
.resizable()
.aspectRatio(contentMode: .fit)
.ignoresSafeArea()
}
func createRetakeButton() -> some View {
Button(action: retakeAction) { Text("Retake") }
}
func createSaveButton() -> some View {
Button(action: acceptMediaAction) { Text("Save") }
}
}
struct CameraView: View {
(...)
var body: some View {
MCameraController()
.mediaPreviewScreen(CustomCameraPreview.init)
}
(...)
}
通过创建一个新的结构体,遵循MCameraErrorView
并使用errorScreen
修饰符,您可以更改CameraErrorView
的外观。
struct CustomCameraErrorView: MCameraErrorView {
let error: CameraManager.Error
let closeControllerAction: () -> ()
var body: some View {
Button(action: openAppSettings) { Text("Open Settings") }
}
}
struct CameraView: View {
(...)
var body: some View {
MCameraController()
.errorScreen(CustomCameraErrorView.init)
}
(...)
}
通过克隆我们创建的项目亲自查看其工作方式
CameraView以MIT许可证发布。请参阅LICENSE以获取详细信息。
PopupView - 允许您显示任何弹出窗口的最强大的弹出库
Navigattie - 通过您的应用更简单、更干净的方式导航
CalendarView - 立即创建自己的日历对象
GridView - 无需费劲就能布局您的数据
Timer - 现代计时器API