Xcode 在条形按钮项目大小太大时使用 PDF 图像

Posted

技术标签:

【中文标题】Xcode 在条形按钮项目大小太大时使用 PDF 图像【英文标题】:Xcode Use PDF Image in Bar Button Item Size Too Big 【发布时间】:2017-10-10 22:14:09 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

当图像尺寸太大时,我会使用代码来调整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))
        
    

【讨论】:

那么故事板本身就没有办法做到这一点吗? 我的猜测是创建一个 IBDesignable UIBarButtonItem 子类,它有一些 IBInspectable 属性可以帮助重新缩放图像。 使用IBDesignable 效果很好。非常感谢。将在最后奖励赏金。 @sbru 嗨,请再看一下我的答案,大概是这个样子,但请注意,我还没有测试过这段代码。 我通过在可选对象上添加一个守卫并在它为 nil 时返回 self 来修复它。当执行发生时,它会尝试以 0 作为值的宽度或高度进行缩放,这似乎会为 UIGraphicsGetImageFromCurrentImageContext() 生成 nil。【参考方案2】:

公认的解决方案是一个好方法。但是,就我而言,我有一个项目 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)
    


希望对你有帮助

【讨论】:

以上是关于Xcode 在条形按钮项目大小太大时使用 PDF 图像的主要内容,如果未能解决你的问题,请参考以下文章

大小太大时 VBO + glBufferData 崩溃

ListView下面的WPF按钮 - 当ListView太大时消失

当vector的大小太大时,如何解决C++中内存不足的问题?

iOS 5:使用 Xcode/Storyboard 在工具栏中定位条形按钮项

我的列表大小是整个屏幕,看不到下面的按钮或滚动

ios/xcode:更改条形按钮项的标题