4

我通过调用在我的应用程序中设置了一个全局tintColor :

UIView.appearance().tintColor = myColor

但是,相同的颜色适用于UIImagePickerController,并且只有一些 UI 元素被着色:例如,太阳图标具有自定义的tintColor,而焦点框具有默认的颜色。

怎么可能不将全局外观配置应用于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

在此处输入图像描述

4

3 回答 3

4

更改后window?.tintColorinputAccessoryView.tintColor不会更改,因为inputAccessoryView不是当前窗口的子视图(它们没有相同的视图层次结构),因此window.tintColor不会影响inputAccessoryView.

为了解决问题,我建议每次看到新的时候使用NotificationCenter观察和更改。你可以把代码放在里面window.tintColorUIWindowAppDelegate

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
}

如果您只想更改tintColor,则UIImagePickerController需要更改tintColor显示在 上的每个视图UIImagePickerController

  1. 定义一个扩展来更改所有子视图的tintColor.

    extension UIView {
      func changeTintColor(color: UIColor) -> Void {
        for view in subviews{
          view.tintColor = color
          view.changeTintColor(color: color);
        }
      }
    }
    
  2. 用于UINavigationControllerDelegate获取UIViewController在 上显示的内容UIImagePickerView。更改tintColor此控制器内的视图

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

于 2018-06-20T13:51:38.663 回答
2

通过在 Window 而不是UIAppearance代理上设置全局 tintColor 来修复:

window?.tintColor = myColor
于 2018-06-13T11:41:52.377 回答
0

我相信这就是您正在寻找的东西,试试这个并根据您的喜好进行调整:

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 框架或一个自定义的相机框架。

于 2018-06-24T12:32:39.603 回答