Xcode 在栏按钮项目大小太大中使用 PDF 图像

Xcode Use PDF Image in Bar Button Item Size Too Big

我的 Xcode 项目的图像资产文件中有一个 PDF 文件。我正在尝试创建一个使用该 PDF 图像的条形按钮项目。但是每当我在 Interface Builder 中将图像 属性 设置为图像时,它会占据我的大部分标签栏并删除标题。

我有一个带有系统项目停止的左栏按钮项目。所以它看起来像一个 X 图标。我想在右侧使用我的设置 PDF 图像做同样的事情。

有没有办法在 Interface Builder 中解决这个大小调整问题?如果不是,我该如何在代码中解决这个问题?

使用我在图像尺寸太大时所做的代码,我在 UIControl 上的 rendering/setting 之前调整了 UIImage 的大小。我在 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))
        }
    }
}

接受的解决方案是一个很好的方法。但是,就我而言,我有一个 pdf 项目,其余的是 png。我还面临着处理已启动项目的问题,并且所有图标的大小都不同。

我最后做了:

extension UIBarButtonItem {

    convenience init(image: UIImage?, size: CGSize, tintColor: UIColor, target: Any?, action: Selector?) {
        let holderView = UIButton()

        let button: UIButton = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        holderView.addSubview(button)

        button.centerYAnchor.constraint(equalTo: holderView.centerYAnchor).isActive = true
        button.centerXAnchor.constraint(equalTo: holderView.centerXAnchor).isActive = true
        button.heightAnchor.constraint(equalToConstant: size.height).isActive = true
        button.heightAnchor.constraint(equalToConstant: size.width).isActive = true

        button.setImage(image?.withRenderingMode(.alwaysTemplate), for: .normal)
        button.imageView?.contentMode = .scaleAspectFit
        button.tintColor = tintColor

        if let target = target, let action = action {
            button.addTarget(target, action: action, for: .touchUpInside)
        }

        self.init(customView: holderView)
    }

}

希望对你有帮助