Ios Xcode在工具栏中使用PDF图像按钮项目大小过大

Ios Xcode在工具栏中使用PDF图像按钮项目大小过大,ios,swift,xcode,interface-builder,Ios,Swift,Xcode,Interface Builder,我的Xcode项目中的图像资源文件中有一个PDF文件。我正在尝试创建一个使用该PDF图像的工具栏按钮项。但每当我将Interface Builder中的image属性设置为图像时,它就会接管大部分选项卡栏并删除标题 我有一个带有系统项stop的左栏按钮项。所以它看起来像一个X图标。我想做同样的事情,在右侧与我的设置PDF图像我有 有没有办法在Interface Builder中解决此大小调整问题?如果不是,我如何在代码中修复此问题?使用代码当图像大小太大时,我会在UIControl上渲染/设置之

我的Xcode项目中的图像资源文件中有一个PDF文件。我正在尝试创建一个使用该PDF图像的工具栏按钮项。但每当我将Interface Builder中的image属性设置为图像时,它就会接管大部分选项卡栏并删除标题

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


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

使用代码当图像大小太大时,我会在
UIControl
上渲染/设置之前调整
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)
    }

}

我希望它有帮助

所以在故事板本身中没有办法做到这一点?我猜应该是创建一个
IBDesignable
UIBarButtonItem
子类,该子类具有一些
IBInspectable
属性,可以帮助重新缩放图像。使用
IBDesignable
效果很好。非常感谢。将在最后奖励赏金。@sbru hi请再次查看我的答案,这大概是我的答案,但请注意,我还没有测试此代码。我通过在可选代码上添加一个防护并在其为零时返回self来修复它。执行时,它会尝试以0作为值的宽度或高度进行缩放,这似乎会为UIGraphicsGetImageFromCurrentImageContext()生成一个nil。