Программно установленная барная кнопка "Системный элемент" - PullRequest
1 голос
/ 29 мая 2020

Я хочу установить кнопку «Поделиться» на правой панели навигационного контроллера. Я не хочу добавлять собственные изображения, я хочу использовать изображение кнопки общего доступа, предоставленное Xcode. Именно так я и делаю в раскадровке. Я установил Style и установил System_Item как Action .

enter image description here

enter image description here

Теперь вопрос в том, как программно установить System_Item , если я создаю barbuttonitem программно?

let shareButton = UIBarButtonItem(title: "",
                                  style: .plain,
                                  target: self,
                                  action: #selector(shareAction(sender:)))
    shareButton.tintColor = AppColor.barButtonColor

    navigationItem.rightBarButtonItem = shareButton

Ответы [ 2 ]

1 голос
/ 29 мая 2020

вам нужно использовать опцию UIBarButtonSystemItemAction, чтобы напрямую получить действие общего доступа

   let share = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(shareAction(sender:)))
    shareButton.tintColor = AppColor.barButtonColor
    navigationItem.rightBarButtonItem = share

и обработать действие как

@objc func shareAction(sender: UIBarButtonItem) {

}
1 голос
/ 29 мая 2020

Вы можете создать расширение для этого ->

public extension UIViewController {

    func setRightBarButtonItem(tintColor: UIColor = AppColor.barButtonColor) {
        let button = UIButton(type: .system)

        button.tintColor = tintColor
        button.setImage(UIImage(.action), for: .normal) // <-- Set system icon to button

        button.translatesAutoresizingMaskIntoConstraints = false

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
        button.addGestureRecognizer(tapGesture)

        navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)
    }

    @objc func tap() {
        // Do stuff
    }
}

Затем в вашем ViewController

override func viewDidLoad() {
    super.viewDidLoad()
    setRightBarButtonItem()

    // OR

    setRightBarButtonItem(tintColor: .blue)
}

Расширение UIImage для использования системных значков без контроля версий

extension UIImage {

  public convenience init?(_ systemItem: UIBarButtonItem.SystemItem) {

    guard let sysImage = UIImage.imageFrom(systemItem: systemItem)?.cgImage else {
      return nil
    }

    self.init(cgImage: sysImage)
  }

  private class func imageFrom(systemItem: UIBarButtonItem.SystemItem) -> UIImage? {

    let sysBarButtonItem = UIBarButtonItem(barButtonSystemItem: systemItem, target: nil, action: nil)

    let toolBar = UIToolbar()
    toolBar.setItems([sysBarButtonItem], animated: false)
    toolBar.snapshotView(afterScreenUpdates: true)

    if let buttonView = sysBarButtonItem.value(forKey: "view") as? UIView{
      for subView in buttonView.subviews where subView is UIButton {
        let button = subView as! UIButton
        let image = button.imageView!.image!
        return image
      }
    }
    return nil
  }
}
...