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

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

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

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

【问题讨论】:

    标签: ios swift xcode 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)
        }
    
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 2016-09-13
      • 1970-01-01
      • 2015-11-28
      • 2016-09-13
      • 1970-01-01
      • 2023-01-16
      相关资源
      最近更新 更多