Xcode Использование изображения PDF в панели кнопок Размер элемента слишком большой

У меня есть файл PDF в файле моих изображений в моем проекте Xcode. Я пытаюсь создать элемент кнопки панели, который использует этот PDF-образ. Но всякий раз, когда я устанавливаю свойство изображения в Interface Builder для изображения, он берет большую часть моей панели вкладок и удаляет заголовок.

У меня есть элемент с левой кнопкой панели с остановкой элемента системы. Таким образом, он выглядит как значок X. Я хотел бы сделать то же самое с правой стороны с моими настройками. У меня есть изображение PDF.

Есть ли способ исправить эту проблему с размерами в Interface Builder? Если нет, то как я могу исправить это в коде?

Ответ 1

Используя код, что я делаю, когда размер изображения слишком велик, я UIImage размер UIImage перед рендерингом/настройками в UIControl. У меня есть это расширение на UIImage которое помогает масштабировать изображение.

// MARK: - Used to scale UIImages
extension UIImage {
    func scaleTo(_ newSize: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
        self.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        let newImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage ?? self
    }
}

Используя это будет выглядеть так

let defaultImage = UIImage(named: "someimagenamehere")?
    .scaleTo(CGSize(width: 40, height: 40))

self.navigationItem.leftBarButtonItem = UIBarButtonItem(
    image: defaultImage,
    style: .plain,
    target: self,
    action: #selector(self.someselectorhere(_:)))

ОБНОВЛЕНИЕ: Это то, на что это было бы похоже, используя @IBDesignable и @IBInspectable

@IBDesignable
class CustomBarButtonItem: UIBarButtonItem {

    @IBInspectable
    var scaledHeight: CGFloat = 0 {
        didSet {
            self.image = self.image?.scaleTo(CGSize(width: self.scaledHeight, height: self.scaledWidth))
        }
    }

    @IBInspectable
    var scaledWidth: CGFloat = 0 {
        didSet {
            self.image = self.image?.scaleTo(CGSize(width: self.scaledHeight, height: self.scaledWidth))
        }
    }
}