更改UIImagePickerController的TintColor

时间:2018-06-13 11:05:42

标签: ios swift uiimagepickercontroller uiappearance tintcolor

我通过调用以下方式在我的应用中设置了全局 tintColor

UIImagePickerController

但是,相同的颜色适用于 UIImagePickerController ,并且只有部分UI元素是彩色的: 例如, sun 图标具有自定义 tintColor ,而焦点框具有默认值。

如何才能将全局外观配置应用于window?.tintColor = myColor

enter image description here

我提出的解决方案并没有完全解决这个问题,因为 inputAccessoryView 仍然有自己的tintColor:

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    configureWindowAndInitialViewController()
    UIView.appearance().tintColor = .cyan // Setting a global tintColor
    return true
  }

更新:

我在启动时配置应用程序范围的tintcolor:

  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)
    }
  }

然后,我展示了一个 UIImagePickerController

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

输入附件视图:

要添加输入附件视图,首先应创建 textField 。然后可以将工具栏附加到 Textfield

tabLayout.setupWithViewPager(mViewPager);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
tabLayout.setSmoothScrollingEnabled(true);

pagerAdapter = new PagerAdapter(getChildFragmentManager(), getContext(), tabs);
viewPager.setAdapter(pagerAdapter);

if(savedInstanceState == null) {
    pagerAdapter.add(getTab1());
    pagerAdapter.add(getTab2());
    setCustomViews(getContext());
    loadMoreTabs(); //Network call
}

private void loadMoreTabs(){
   //in response of network call
   onResponse(){
       pagerAdapter.addAll(new ArrayList<Object>(response.body()));
       setCustomViews();  //Here whole tab layout scrolls till end
}

enter image description here

3 个答案:

答案 0 :(得分:2)

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

{{1}}

答案 1 :(得分:0)

更改window?.tintColor后,inputAccessoryView.tintColor不会更改,因为inputAccessoryView不是当前窗口的子视图(它们没有相同视图的层次结构),所以{{1} }不会影响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 } 更改tintColor,则需要为UIImagePickerController上显示的每个视图更改tintColor

  1. 定义扩展名以更改所有子视图的UIImagePickerController

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

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

答案 2 :(得分: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

准备将视频导出到应用程序时使用的预设。

我已经翻阅了文档,但没有找到更改焦点视图的方法。也许苹果不允许您这样做。也许在可可足类上有一个自定义的PickerView框架,或者有一个自定义的相机框架。