iOS 14 Инструмент пипетки UIColorPicker не возвращает выбранный цвет

#swift #uiviewcontroller #autolayout #ios14 #uicolorpickerviewcontroller

Вопрос:

В настоящее время я пытаюсь реализовать новый UIColorPicker для iOS 14. Все работает отлично, за исключением eye dropper функциональности UIColorPicker. После выбора глазной пипетки и выборки цвета поведение по умолчанию должно заключаться в повторном открытии UIColorPicker с выбранным вами цветом в качестве активного. По какой-то причине этого не происходит. Вот моя реализация, она довольно стандартная, поэтому я не уверен, почему пипетка ведет себя не так, как ожидалось.

У меня есть эти функции, которые передаются в качестве селекторов, когда я нажимаю на некоторые элементы пользовательского интерфейса

 @objc func pickColorSky(sender: UIControl){
  presentColorPicker(tag: 1, sender: sender)
}

@objc func pickColorBackground(sender: UIControl){
  presentColorPicker(tag: 2, sender: sender)
}
  
@objc func pickColorGround(sender: UIControl){
  presentColorPicker(tag: 3, sender: sender)
}
 

Вот функция, которая представляет сам UIColorPickerView

 @objc private func presentColorPicker(tag: Int, sender: UIControl){
    let vc = UIColorPickerViewController()
    vc.supportsAlpha = false
    vc.delegate = self
    vc.view.tag = tag
    vc.modalPresentationStyle = .popover
    vc.popoverPresentationController?.sourceView = sender
    vc.popoverPresentationController?.sourceRect = sender.bounds
    self.present(vc, animated: true)
}
 

И методы делегирования для обработки взаимодействия с палитрой цветов

 extension myViewController: UIColorPickerViewControllerDelegate {
  
  func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
    guard let options = editor?.apiView?.getRenderingOptions() else { return }
      if viewController.view.tag == 1 {
        let newColor = getMobileApiColor(color: viewController.selectedColor)
        options.skyColor = newColor
        skyRow.color.backgroundColor = newColor.uiColor
      }
      else if viewController.view.tag == 2 {
        let newColor = getMobileApiColor(color: viewController.selectedColor)
        options.backgroundColor = newColor
        backgroundRow.color.backgroundColor = newColor.uiColor
      }
      else if viewController.view.tag == 3 {
        let newColor = getMobileApiColor(color: viewController.selectedColor)
        options.groundColor = newColor
        groundRow.color.backgroundColor = newColor.uiColor
      }
      editor?.modelView?.setNeedsDisplay()
  }
 

Комментарии:

1. Извините, Йогеш прав. Мое невежество…

Ответ №1:

Попробуйте этот метод colorPickerViewControllerDidSelectColor

 extension ViewController: UIColorPickerViewControllerDelegate {
    
    //  Called once you have finished picking the color.
    func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
        self.view.backgroundColor = viewController.selectedColor
        
    }
    
    //  Called on every color selection done in the picker.
    func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) {
            self.view.backgroundColor = viewController.selectedColor
    }
}
 

Комментарии:

1. Думаю, вы правы.

2. Здравствуйте @benjamin-моррис, Если этот ответ подходит вам, пожалуйста, примите этот ответ, чтобы он был полезен и для других.

3. @YogeshPatel это не было решением моей проблемы, я не буду отмечать это как принятое.