ios - 更改 UIImagePickerController 的 TintColor

标签 ios swift uiimagepickercontroller uiappearance tintcolor

我通过调用以下命令在我的应用中设置了全局 tintColor:

UIView.appearance().tintColor = myColor

但是,相同的颜色适用于 UIImagePickerController 并且只有一些 UI 元素是彩色的: 例如,太阳 图标有一个自定义的 tintColorfocus frame 有默认的。

如何不对 UIImagePickerController 应用全局外观配置?

enter image description here

我提出的解决方案没有完全解决这个问题,因为 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

enter image description here

最佳答案

更改 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.

  1. 定义一个扩展来改变所有 subview 的tintColor

    extension UIView {
      func changeTintColor(color: UIColor) -> Void {
        for view in subviews{
          view.tintColor = color
          view.changeTintColor(color: color);
        }
      }
    }
    
  2. 使用UINavigationControllerDelegate获取显示在UIImagePickerView上的UIViewController。在此 Controller 内更改 View 的 tintColor

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
      viewController.view.changeTintColor(color: .red)
    }
    
  3. 不要忘记将 UIImagePickerControllerdelegate 设置为 self

关于ios - 更改 UIImagePickerController 的 TintColor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50835655/

相关文章:

ios - 发送大尺寸图像、视频和音频时 XMPP 客户端断开连接

iphone - 2G/3G下使用UIImagePickerController选择视频

uiimagepickercontroller - 带有 UIImagePickerController 图像裁剪的 iOS 8 错误

ios - 在 UITableView 中使用 UIButton 发送多个标签

swift - 如何将 CURL 命令转换为 Swift

iphone - cameraOverlayView 在 UIImagePickerController 中裁剪结果

ios - PromiseKit.framework : bundle format unrecognized, 无效或不合适

ios - 如何从 shoutcast 目录中获取 XML 电台列表?

ios - 使一个小的 UIImageView 易于被点击

ios - 在 SwiftUI 中平滑地加速旋转