You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何启动含工具栏(滤镜、计时器等)的iPhone默认相机App?现有代码仅显闪光灯图标

关于调用带高级工具栏的iPhone原生相机的问题

嘿,刚好我之前研究过这个问题,直接给你说结论:你没法通过UIImagePickerController调出带滤镜、计时器这些橙色框功能的原生相机App界面——因为这个控件本质是系统提供的简化版相机组件,不是原生相机App本身,它只保留了最基础的拍摄、闪光灯、简单编辑功能。

为什么你的代码只显示闪光灯图标?

你当前的代码里设置了allowsEditing = true,这个属性会让拍摄完成后直接进入照片编辑界面,反而会隐藏拍摄界面的一些基础控件。就算你把它改成false,UIImagePickerController的相机界面也还是没有滤镜、计时器这些原生相机的高级功能——苹果没给这个控件开放这些接口。

两种可行的解决方案

如果你想要类似原生相机的那些功能,有两个方向可以走:

1. 自己基于AVFoundation构建自定义相机界面

这是最灵活的方式,完全可以复刻原生相机的所有功能,包括滤镜、计时器、实况照片等。举个简单的框架示例:

import AVFoundation
import UIKit

class CustomCameraViewController: UIViewController {
    var captureSession = AVCaptureSession()
    var previewLayer: AVCaptureVideoPreviewLayer!
    var timer: Timer?
    var countdownSeconds = 3

    override func viewDidLoad() {
        super.viewDidLoad()
        setupCaptureSession()
        setupCustomToolbar()
    }

    // 配置相机会话
    func setupCaptureSession() {
        captureSession.sessionPreset = .photo
        guard let backCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else { return }
        
        do {
            let input = try AVCaptureDeviceInput(device: backCamera)
            if captureSession.canAddInput(input) {
                captureSession.addInput(input)
            }
            
            let output = AVCapturePhotoOutput()
            if captureSession.canAddOutput(output) {
                captureSession.addOutput(output)
            }
            
            previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
            previewLayer.frame = view.bounds
            previewLayer.videoGravity = .resizeAspectFill
            view.layer.addSublayer(previewLayer)
            
            captureSession.startRunning()
        } catch {
            print(error.localizedDescription)
        }
    }

    // 添加自定义工具栏(包含计时器、滤镜按钮)
    func setupCustomToolbar() {
        let toolbar = UIToolbar(frame: CGRect(x: 0, y: view.frame.height - 80, width: view.frame.width, height: 80))
        toolbar.backgroundColor = .black.withAlphaComponent(0.7)
        
        // 计时器按钮
        let timerButton = UIBarButtonItem(title: "3秒计时", style: .plain, target: self, action: #selector(startCountdown))
        // 滤镜选择按钮
        let filterButton = UIBarButtonItem(title: "滤镜", style: .plain, target: self, action: #selector(showFilters))
        // 拍摄按钮
        let captureButton = UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: #selector(takePhoto))
        
        toolbar.items = [timerButton, filterButton, captureButton]
        view.addSubview(toolbar)
    }

    @objc func startCountdown() {
        countdownSeconds = 3
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateCountdown), userInfo: nil, repeats: true)
    }

    @objc func updateCountdown() {
        countdownSeconds -= 1
        if countdownSeconds == 0 {
            timer?.invalidate()
            takePhoto()
        }
    }

    @objc func showFilters() {
        // 这里可以弹出滤镜选择器,用Core Image实现实时滤镜
        print("显示滤镜选项")
    }

    @objc func takePhoto() {
        guard let photoOutput = captureSession.outputs.first as? AVCapturePhotoOutput else { return }
        let photoSettings = AVCapturePhotoSettings()
        photoOutput.capturePhoto(with: photoSettings, delegate: self)
    }
}

extension CustomCameraViewController: AVCapturePhotoCaptureDelegate {
    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        // 处理拍摄后的照片
        if let imageData = photo.fileDataRepresentation() {
            let capturedImage = UIImage(data: imageData)
            // 后续逻辑:比如展示照片、保存到相册等
        }
    }
}

这个示例只是基础框架,你可以在此基础上扩展滤镜功能(用Core Image的CIFilter)、调整计时器逻辑,完全自定义UI来匹配原生相机的体验。

2. 使用第三方相机库

如果不想自己从零构建,可以用成熟的第三方库,比如BSImagePicker或者YPImagePicker,这些库已经封装了类似原生相机的高级功能,你只需要简单配置就能调用。

重要提醒:无法直接打开原生相机App

之前iOS支持用URL Scheme(比如camera://)打开原生相机,但iOS 10之后苹果已经禁用了这个功能,现在没有合法的方式直接唤起原生相机App并指定显示那些高级工具栏——这是出于系统权限和隐私保护的考虑。

内容的提问来源于stack exchange,提问作者Asahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:18:02