更改 UIImagePickerController 的 TintColor
Posted
技术标签:
【中文标题】更改 UIImagePickerController 的 TintColor【英文标题】:Change TintColor of UIImagePickerController 【发布时间】:2018-06-13 11:05:42 【问题描述】:我通过调用在我的应用中设置了一个全局 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($0 == 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
【问题讨论】:
您使用的是哪个 ios 版本?我在 iOS 11.4 上试过,它按预期工作 我使用的是 iOS 11.3,我可以使用 Beta 12 进行测试 你能张贴你的结果的截图吗? @trungduc 刚刚检查了最新的 iOS 12 测试版,“太阳”或“亮度”图标的颜色仍然不正确。截图:user-images.githubusercontent.com/8013017/… 2021年还不能直接设置色调。 【参考方案1】:更改window?.tintColor
后,inputAccessoryView.tintColor
不会更改,因为inputAccessoryView
不是当前窗口的子视图(它们没有相同的视图层次结构)所以window.tintColor
不会影响inputAccessoryView
.
为了解决问题,我建议每次看到新的UIWindow
时使用NotificationCenter
来观察和更改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
得到UIViewController
显示在UIImagePickerView
上。在此控制器中更改视图的tintColor
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool)
viewController.view.changeTintColor(color: .red)
别忘了将UIImagePickerController
的delegate
设置为self
。
【讨论】:
有趣的想法!有什么方法可以只为UIImagePickerController
更改tintColor
?
@RichardTopchiy 我的解决方案更改了应用程序范围的 tintColor,而不会像您预期的那样影响 UIImagePickerController UI 元素。有什么问题吗?【参考方案2】:
通过在 Window 上设置全局 tintColor 而不是 UIAppearance 代理来修复:
window?.tintColor = myColor
【讨论】:
【参考方案3】:我相信这就是您正在寻找的东西,试试这个并根据您的喜好进行调整:
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)
返回一个布尔值,指示给定相机是否可用。
var cameraDevice: UIImagePickerControllerCameraDevice
图像选择器控制器使用的相机。
enum UIImagePickerControllerCameraDevice
用于图像或电影捕捉的相机。 配置相机拍摄模式
class func availableCaptureModes(for: UIImagePickerControllerCameraDevice)
返回一个 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 框架或一个自定义的相机框架。
【讨论】:
添加了一些额外的信息希望这会有所帮助 谢谢,这个问题实际上是由于 Apple 的 UIImagePickerController 中的一个错误......所以没有“干净”的方式来更新整个应用程序的 TintColor。 我建议最好通过开发人员门户向他们报告。以便他们了解该问题并在将来解决它。 如果您不举报,您将不会发现。希望我至少能提供一点帮助。以上是关于更改 UIImagePickerController 的 TintColor的主要内容,如果未能解决你的问题,请参考以下文章
ViewController 生命周期 UINavigationController
如何从 webview 使用 UIImagePickerController
iPhone OS 3.0 中的 UIImagePickerController