MijickCameraView 2.1.0

MijickCameraView 2.1.0

Mijick 维护。



  • Tomasz Kurylik

CameraView Logo

简化相机制作

快速创建完全可定制的相机视图。保持您的代码清洁

尝试我们准备的演示


SwiftUI logo Platforms: iOS, iPadOS, macOS, tvOS Current Version License: MIT

Made in Kraków Follow us on X Let's work together Stargazers

Popup Examples Popup Examples Popup Examples


Mijick 的 CameraView 是一个强大的开源库,简化了相机展示过程,使其超快且完全可定制,让您能够关注项目的重要元素,同时隐藏技术复杂性。

  • 完全自定义您的 UI。使用我们设计的干净现代 UI,或在几分钟内完全更改它!
  • 涵盖整个流程。我们的库不仅可以展示相机控制器,请求权限,如果未授予权限,显示错误视图,还可以在单独的视图中显示捕获结果(如果您希望的话)。
  • 提高代码质量。让您能够关注最重要的东西,在这个强大的库内部隐藏实现细节。
  • 针对 SwiftUI 设计。在我们开发这个库的过程中,我们利用了 SwiftUI 的功能,为您提供了实现流程的强大工具。

入门指南

✋ 要求

平台 最低 Swift 版本
iOS 14+ 5.10

⏳ 安装

Swift 包管理器是一个用于自动分发 Swift 代码的工具,它集成到 Swift 编译器中。

一旦您的 Swift 包设置好,将 PopupView 添加为依赖项就像将其添加到 Package.swiftdependencies 值一样简单。

dependencies: [
    .package(url: "https://github.com/Mijick/CameraView.git", branch(“main”))
]

CocoaPods 是 Swift 和 Objective-C Cocoa 项目的依赖项管理器,有助于优雅地扩展它们。

安装步骤

    pod init
  • 将 CocoaPods 依赖项添加到您的 Podfile
    pod 'MijickCameraView'
  • 安装依赖项并生成 .xcworkspace 文件
    pod install
  • 使用新的 XCode 项目文件 .xcworkspace

用法

1. 修改 info.plist 文件

打开您的项目 info.plist 文件。添加两个新键: Privacy - Microphone Usage DescriptionPrivacy - Camera Usage Description。值将在用户拒绝上述权限之一时默认显示在错误屏幕中。

CleanShot 2024-05-06 at 13 41 25

2. 将 MCameraController 插入到选定的视图中

MCameraController 包含三个屏幕 - CameraViewCameraPreview(可以关闭)和 CameraErrorView。因此,我们建议在声明 MCameraController 的视图中不应有任何其他元素。我们围绕我们的经验和所了解的开发者的需要设计了此系统。但是,如果您的偏好不同,我们很高兴满足您的期望,并调整我们的库。通过为此项目创建一个 问题 与我们分享它们。

struct CameraView: View {

    (...)
   
    var body: some View {
        MCameraController()
    }

    (...)
}

3. 声明 onImageCapturedonVideoCapturedafterMediaCapturedonCloseController

上述函数定义了给定操作之后会发生什么,这些都是可选的;例如,如果您的应用程序仅捕获图像,则不需要声明 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")
            }
    }

    (...)
}

4. (可选)为 MCameraController 块屏幕旋转

由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)
    }

    (...)
}

5. (可选)修改初始相机设置

您可以使用以下列表中的修饰符来修改初始相机设置

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)
    }

    (...)
}

6. (可选)修改CameraView UI

通过创建一个新的结构体,遵循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)
    }

    (...)
}

7. (可选)修改(或禁用)CameraPreview UI

通过创建一个新的结构体,遵循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)
    }

    (...)
}

8. (可选)修改CameraErrorView UI

通过创建一个新的结构体,遵循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以获取详细信息。



我们的其他开源SwiftUI库

PopupView - 允许您显示任何弹出窗口的最强大的弹出库
Navigattie - 通过您的应用更简单、更干净的方式导航
CalendarView - 立即创建自己的日历对象
GridView - 无需费劲就能布局您的数据
Timer - 现代计时器API