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 图像的主要内容,如果未能解决你的问题,请参考以下文章
ListView下面的WPF按钮 - 当ListView太大时消失
当vector的大小太大时,如何解决C++中内存不足的问题?