Изображение не отображается в BarButtonItem - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу отобразить изображение профиля текущего пользователя на изображении элемента панели кнопок.Будет отображаться изображение по умолчанию, но не изображение профиля пользователя.

Объявление изображения кнопки панели:

lazy var leftButton: UIBarButtonItem = {
    var image = UIImage.init(named: "icons8-kontakte-50")?.withRenderingMode(.alwaysOriginal)
    let button  = UIBarButtonItem.init(image: image, style: .plain, target: self, action: #selector(ConversationViewController.showProfile))
    return button
}()

Здесь я наблюдаю за текущим пользователем и получаю текущее изображение профиля:

 //left bar button image fetching
    self.navigationItem.leftBarButtonItem = self.leftButton
    self.tableView.tableFooterView = UIView.init(frame: CGRect.zero)

    UserApi.shared.observeCurrentUser { (currentUser) in
        self.currentUser = currentUser

        guard let url = URL(string: currentUser.profilImageUrl!) else { return }

        URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in
            if error == nil {
                let image = UIImage.init(data: data!)

                let contentSize = CGSize.init(width: 30, height: 30)
                UIGraphicsBeginImageContextWithOptions(contentSize, false, 0.0)
                let _  = UIBezierPath.init(roundedRect: CGRect.init(origin: CGPoint.zero, size: contentSize), cornerRadius: 14).addClip()
                image!.draw(in: CGRect(origin: CGPoint.zero, size: contentSize))
                let path = UIBezierPath.init(roundedRect: CGRect.init(origin: CGPoint.zero, size: contentSize), cornerRadius: 14)
                path.lineWidth = 2
                UIColor.white.setStroke()
                path.stroke()
                let finalImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!.withRenderingMode(.alwaysOriginal)
                UIGraphicsEndImageContext()
                self.leftButton.image = finalImage

            }
        })

Заранее спасибо за вашу помощь!

1 Ответ

0 голосов
/ 06 декабря 2018

Блок завершения задачи данных может быть вызван в любом потоке, но обновления пользовательского интерфейса должны выполняться в основном потоке.Вам необходимо отправить обратно в главный поток, чтобы обновить UIBarButtonItem.

URLSession.shared.dataTask(with: url) { (data, response, error) in
    guard error == nil, let data = data, let image = UIImage(data: data) else { return }
    let size = CGSize(width: 30, height: 30)
    let rect = CGRect(origin: .zero, size: size)
    let finalImage = UIGraphicsImageRenderer(size: size).image { _ in
        let path = UIBezierPath(ovalIn: rect)
        path.addClip()
        image.draw(in: CGRect(origin: CGPoint.zero, size: size))
        path.lineWidth = 2.0
        UIColor.white.setStroke()
        path.stroke()
    }
    DispatchQueue.main.async {
        self.leftButton.image = finalImage.withRenderMode(.alwaysOriginal)
    }
}.resume()

. Вам также нужно будет позвонить resume() в своей задаче данных.

...