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)
}
}
希望对你有帮助
我的 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)
}
}
希望对你有帮助