我通过调用以下命令在我的应用中设置了全局 tintColor:
UIView.appearance().tintColor = myColor
但是,相同的颜色适用于 UIImagePickerController 并且只有一些 UI 元素是彩色的: 例如,太阳 图标有一个自定义的 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)
}
}
输入附件 View :
要添加输入附件 View ,首先应创建一个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?.tintColor
后,inputAccessoryView.tintColor
不会更改,因为 inputAccessoryView
不是当前窗口的 subview (它们没有相同的 View 层次结构)所以 window.tintColor
不会影响 inputAccessoryView
。
为了解决这个问题,我建议使用NotificationCenter
来观察和改变window.tintColor
每次一个新的UIWindow
变得可见。你可以把代码放在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
,则需要为显示在 上的每个 View 更改
.tintColor
UIImagePickerController
定义一个扩展来改变所有 subview 的
tintColor
。extension UIView { func changeTintColor(color: UIColor) -> Void { for view in subviews{ view.tintColor = color view.changeTintColor(color: color); } } }
使用
UINavigationControllerDelegate
获取显示在UIImagePickerView
上的UIViewController
。在此 Controller 内更改 View 的tintColor
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) { viewController.view.changeTintColor(color: .red) }
不要忘记将
UIImagePickerController
的delegate
设置为self
。
关于ios - 更改 UIImagePickerController 的 TintColor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50835655/