Изменить TintColor UIImagePickerController - PullRequest
0 голосов
/ 13 июня 2018

Я установил глобальное tintColor в своем приложении, вызвав:

UIView.appearance().tintColor = myColor

Однако этот же цвет применяется к UIImagePickerController и только к некоторымэлементы пользовательского интерфейса окрашены: например, значок sun имеет пользовательский tintColor , в то время как рамка фокусировки имеет стандартную.

Каквозможно ли не применять глобальную конфигурацию внешнего вида к 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)
    }
  }

Представление вспомогательного ввода:

Чтобы добавить представление вспомогательного ввода,Прежде всего, необходимо создать 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

Ответы [ 3 ]

0 голосов
/ 20 июня 2018

После изменения window?.tintColor, inputAccessoryView.tintColor не изменяется, потому что inputAccessoryView не является подпредставлением текущего окна (у них нет иерархии того же представления), поэтому 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 для каждого просмотра, который отображается на 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 delegate на self.

0 голосов
/ 24 июня 2018

Я считаю, что это то, что вы ищете, попробуйте это и настройте на свой вкус:

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

Категория носителя для захвата камеры.

Настройка поведения вспышки

class func isFlashAvailable(for: UIImagePickerControllerCameraDevice)

Указывает, имеет ли данная камера подсветку вспышкивозможность.

var cameraFlashMode: UIImagePickerControllerCameraFlashMode

Режим вспышки, используемый активной камерой.

enum UIImagePickerControllerCameraFlashMode

Режим вспышки для использования с активной камерой.

НастройкаЭкспорт пресетов

var imageExportPreset: UIImagePickerControllerImageURLExportPreset

Набор настроек, используемый при подготовке изображений для экспорта в ваше приложение.

enum UIImagePickerControllerImageURLExportPreset

Константы, указывающие, как экспортировать изображения в клиентское приложение.

var videoExportPreset: String

Предварительная настройка для использования при подготовке видео к экспорту в ваше приложение.

Я просмотрел документацию и не нашел способа изменить вид фокуса.Возможно, яблоко не позволяет вам сделать это.Может быть, есть собственный каркас PickerView на Cocoapods или каркас камеры.

0 голосов
/ 13 июня 2018

Исправлено путем установки глобального tintColor на Window вместо UIAppearance прокси:

window?.tintColor = myColor
...