更改 UIImagePickerController 的 TintColor
Change TintColor of UIImagePickerController
我通过调用以下命令在我的应用程序中设置了全局 tintColor:
UIView.appearance().tintColor = myColor
但是,相同的颜色适用于 UIImagePickerController,只有一些 UI 元素是彩色的:
例如,sun 图标具有自定义的 tintColor 而 focus frame 具有默认值。
怎么可能不对 UIImagePickerController
应用全局外观配置?
我提出的解决方案没有完全解决这个问题,因为 inputAccessoryView 仍然有自己的 tintColor:
window?.tintColor = myColor
更新:
我在启动时配置应用程序范围的 tintcolor:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
configureWindowAndInitialViewController()
UIView.appearance().tintColor = .cyan // Setting a global tintColor
return true
}
然后,我显示一个 UIImagePickerController:
func presentPhotoPicker(sourceType: UIImagePickerController.SourceType) {
if let mediaTypes = UIImagePickerController.availableMediaTypes(for: sourceType)?
.filter({[=13=] == kUTTypeImage as String}),
!mediaTypes.isEmpty {
let picker = UIImagePickerController()
picker.delegate = self
picker.mediaTypes = mediaTypes
picker.sourceType = sourceType
picker.allowsEditing = true
controller?.present(picker, animated: true, completion: nil)
}
}
输入附件视图:
要添加输入附件视图,首先,应创建一个 textField。然后可以将工具栏附加到 Textfield:
let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: sefl.view, action: #selector(UIView.endEditing))
items.append(contentsOf: [spacer, doneButton])
toolbar.setItems(items, animated: false)
textField.inputAccessoryView = toolbar
已通过在 Window 而不是 UIAppearance 代理上设置全局 tintColor 来修复:
window?.tintColor = myColor
更改 window?.tintColor
后,inputAccessoryView.tintColor
没有更改,因为 inputAccessoryView
不是当前 window 的子视图(它们没有相同的视图层次结构) 所以 window.tintColor
不会影响 inputAccessoryView
.
为了解决问题,我建议使用NotificationCenter
观察并在每次新的UIWindow
可见时更改window.tintColor
。你可以把代码放在AppDelegate
里面
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
NotificationCenter.default.addObserver(self, selector: #selector(self.windowDidBecomeVisible), name: .UIWindowDidBecomeVisible, object: nil)
return true
}
@objc func windowDidBecomeVisible(notification: NSNotification) {
// Each time an `UIWindow` becomes visible, change its |tintColor|
let visibleWindow = notification.object as! UIWindow
visibleWindow.tintColor = .red
}
如果您只想为 UIImagePickerController
更改 tintColor
,则需要为 UIImagePickerController
上显示的每个视图更改 tintColor
。
定义一个扩展来改变所有子视图的tintColor
.
extension UIView {
func changeTintColor(color: UIColor) -> Void {
for view in subviews{
view.tintColor = color
view.changeTintColor(color: color);
}
}
}
使用UINavigationControllerDelegate
得到显示在UIImagePickerView
上的UIViewController
。更改此控制器内的视图 tintColor
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
viewController.view.changeTintColor(color: .red)
}
不要忘记将 UIImagePickerController
的 delegate
设置为 self
。
我相信这就是您要找的东西试试这个并根据您的喜好进行调整:
let myImagePicker = UIImagePickerController()
myImagePicker.navigationBar.translucent = false
myImagePicker.navigationBar.barTintColor = .blueColor() // Background color
myImagePicker.navigationBar.tintColor = .whiteColor() // Cancel button ~ any UITabBarButton items
myImagePicker.navigationBar.titleTextAttributes = [
NSForegroundColorAttributeName : UIColor.whiteColor()
] // Title color
这是我找到的所有内容:
自定义相机控件
var showsCameraControls: Bool
指示图像选择器是否显示默认相机控件。
var cameraOverlayView: UIView?
显示在默认图像选择器界面顶部的视图。
var cameraViewTransform: CGAffineTransform
应用于相机预览图像的变换。
拍摄静止图像或电影
func takePicture()
使用相机拍摄静止图像。
func startVideoCapture()
使用 UIImagePickerControllerCameraDevice 指定的摄像头开始视频捕获 属性。
func stopVideoCapture()
停止视频捕获。
配置要使用的相机
class func isCameraDeviceAvailable(UIImagePickerControllerCameraDevice)
Returns 一个布尔值,指示给定相机是否可用。
var cameraDevice: UIImagePickerControllerCameraDevice
图像选择器控制器使用的相机。
enum UIImagePickerControllerCameraDevice
用于图像或电影捕捉的相机。
配置摄像头拍摄模式
class func availableCaptureModes(for: UIImagePickerControllerCameraDevice)
Returns NSNumber 对象数组,指示给定相机设备支持的捕获模式。
var cameraCaptureMode: UIImagePickerControllerCameraCaptureMode
相机使用的拍摄模式。
enum UIImagePickerControllerCameraCaptureMode
相机捕捉的媒体类别。
配置 Flash 行为
class func isFlashAvailable(for: UIImagePickerControllerCameraDevice)
指示给定相机是否具有闪光灯照明功能。
var cameraFlashMode: UIImagePickerControllerCameraFlashMode
当前相机使用的闪光灯模式。
enum UIImagePickerControllerCameraFlashMode
活动相机使用的闪光灯模式。
配置导出预设
var imageExportPreset: UIImagePickerControllerImageURLExportPreset
准备图像以导出到您的应用程序时使用的预设。
enum UIImagePickerControllerImageURLExportPreset
指示如何将图像导出到客户端应用程序的常量。
var videoExportPreset: String
准备视频导出到您的应用程序时使用的预设。
我翻阅了文档,但没有找到更改焦点视图的方法。也许苹果不允许你那样做。也许cocoapods上有自定义的PickerView框架或者自定义的camera框架。
我通过调用以下命令在我的应用程序中设置了全局 tintColor:
UIView.appearance().tintColor = myColor
但是,相同的颜色适用于 UIImagePickerController,只有一些 UI 元素是彩色的: 例如,sun 图标具有自定义的 tintColor 而 focus frame 具有默认值。
怎么可能不对 UIImagePickerController
应用全局外观配置?
我提出的解决方案没有完全解决这个问题,因为 inputAccessoryView 仍然有自己的 tintColor:
window?.tintColor = myColor
更新:
我在启动时配置应用程序范围的 tintcolor:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
configureWindowAndInitialViewController()
UIView.appearance().tintColor = .cyan // Setting a global tintColor
return true
}
然后,我显示一个 UIImagePickerController:
func presentPhotoPicker(sourceType: UIImagePickerController.SourceType) {
if let mediaTypes = UIImagePickerController.availableMediaTypes(for: sourceType)?
.filter({[=13=] == kUTTypeImage as String}),
!mediaTypes.isEmpty {
let picker = UIImagePickerController()
picker.delegate = self
picker.mediaTypes = mediaTypes
picker.sourceType = sourceType
picker.allowsEditing = true
controller?.present(picker, animated: true, completion: nil)
}
}
输入附件视图:
要添加输入附件视图,首先,应创建一个 textField。然后可以将工具栏附加到 Textfield:
let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: sefl.view, action: #selector(UIView.endEditing))
items.append(contentsOf: [spacer, doneButton])
toolbar.setItems(items, animated: false)
textField.inputAccessoryView = toolbar
已通过在 Window 而不是 UIAppearance 代理上设置全局 tintColor 来修复:
window?.tintColor = myColor
更改 window?.tintColor
后,inputAccessoryView.tintColor
没有更改,因为 inputAccessoryView
不是当前 window 的子视图(它们没有相同的视图层次结构) 所以 window.tintColor
不会影响 inputAccessoryView
.
为了解决问题,我建议使用NotificationCenter
观察并在每次新的UIWindow
可见时更改window.tintColor
。你可以把代码放在AppDelegate
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
NotificationCenter.default.addObserver(self, selector: #selector(self.windowDidBecomeVisible), name: .UIWindowDidBecomeVisible, object: nil)
return true
}
@objc func windowDidBecomeVisible(notification: NSNotification) {
// Each time an `UIWindow` becomes visible, change its |tintColor|
let visibleWindow = notification.object as! UIWindow
visibleWindow.tintColor = .red
}
如果您只想为 UIImagePickerController
更改 tintColor
,则需要为 UIImagePickerController
上显示的每个视图更改 tintColor
。
定义一个扩展来改变所有子视图的
tintColor
.extension UIView { func changeTintColor(color: UIColor) -> Void { for view in subviews{ view.tintColor = color view.changeTintColor(color: color); } } }
使用
UINavigationControllerDelegate
得到显示在UIImagePickerView
上的UIViewController
。更改此控制器内的视图tintColor
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { viewController.view.changeTintColor(color: .red) }
不要忘记将
UIImagePickerController
的delegate
设置为self
。
我相信这就是您要找的东西试试这个并根据您的喜好进行调整:
let myImagePicker = UIImagePickerController()
myImagePicker.navigationBar.translucent = false
myImagePicker.navigationBar.barTintColor = .blueColor() // Background color
myImagePicker.navigationBar.tintColor = .whiteColor() // Cancel button ~ any UITabBarButton items
myImagePicker.navigationBar.titleTextAttributes = [
NSForegroundColorAttributeName : UIColor.whiteColor()
] // Title color
这是我找到的所有内容:
自定义相机控件
var showsCameraControls: Bool
指示图像选择器是否显示默认相机控件。
var cameraOverlayView: UIView?
显示在默认图像选择器界面顶部的视图。
var cameraViewTransform: CGAffineTransform
应用于相机预览图像的变换。 拍摄静止图像或电影
func takePicture()
使用相机拍摄静止图像。
func startVideoCapture()
使用 UIImagePickerControllerCameraDevice 指定的摄像头开始视频捕获 属性。
func stopVideoCapture()
停止视频捕获。
配置要使用的相机
class func isCameraDeviceAvailable(UIImagePickerControllerCameraDevice)
Returns 一个布尔值,指示给定相机是否可用。
var cameraDevice: UIImagePickerControllerCameraDevice
图像选择器控制器使用的相机。
enum UIImagePickerControllerCameraDevice
用于图像或电影捕捉的相机。 配置摄像头拍摄模式
class func availableCaptureModes(for: UIImagePickerControllerCameraDevice)
Returns NSNumber 对象数组,指示给定相机设备支持的捕获模式。
var cameraCaptureMode: UIImagePickerControllerCameraCaptureMode
相机使用的拍摄模式。
enum UIImagePickerControllerCameraCaptureMode
相机捕捉的媒体类别。
配置 Flash 行为
class func isFlashAvailable(for: UIImagePickerControllerCameraDevice)
指示给定相机是否具有闪光灯照明功能。
var cameraFlashMode: UIImagePickerControllerCameraFlashMode
当前相机使用的闪光灯模式。
enum UIImagePickerControllerCameraFlashMode
活动相机使用的闪光灯模式。
配置导出预设
var imageExportPreset: UIImagePickerControllerImageURLExportPreset
准备图像以导出到您的应用程序时使用的预设。
enum UIImagePickerControllerImageURLExportPreset
指示如何将图像导出到客户端应用程序的常量。
var videoExportPreset: String
准备视频导出到您的应用程序时使用的预设。
我翻阅了文档,但没有找到更改焦点视图的方法。也许苹果不允许你那样做。也许cocoapods上有自定义的PickerView框架或者自定义的camera框架。