使用 SVG 图像时,如何设置作为 UIBarButtonItem 的自定义视图添加的 Button 的宽度和高度?
How to set width and heigh of UIButton that is added as custom view of UIBarButtonItem when using SVG images?
我有一张矢量图,下载自 phosphor-icons:
我下载了 .svg 版本的图标。
当您在图像编辑器中打开此矢量文件时,您会看到它有 192x192
尺寸。
我猜这与矢量文件无关,但是...
我有这个代码:
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
button.imageView?.contentMode = .scaleAspectFit
button.backgroundColor = .yellow
button.setImage(UIImage(named: "alien"), for: .normal)
button.setTitle(nil, for: .normal)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
let item = UIBarButtonItem(customView: button)
navigationItem.setRightBarButtonItems([item], animated: true)
现在的问题是,如果我使用这个原始 svg
图像 (192x192),按钮会缩小,看起来像这样:
但我不希望此按钮具有这些尺寸,而是那些设置为:
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
现在,如果我转到图像编辑器,并将此矢量文件的大小更改为 22x22
(它仍然是 svg
文件),它会显示如下:
我想要的样子。
问题是,我认为 Xcode 会根据设备的像素密度从这个 svg
生成所需的 png
文件。因此,在这种情况下,比方说,在使用 @3x
图像的较新设备上,在编译时,由于我的按钮被定义为 32x32
点,因此将创建 96px X 96px
图像并将其用作 @3x
图片.
此外,我认为无论物理 .svg
文件的“尺寸”是多少,我都认为这会像描述的那样工作,因为它是一个 向量 ,它应该 up/down 根据视图指示缩放。我哪里错了,以及如何使这个按钮看起来与第二张图片相同,无论实际尺寸是多少。svg
尺寸?
编辑:
在 Attributes Inspector 中,为此资产,我设置了 Preserve Vector Data 并选择了 Single Scale 选项。
添加按钮作为条形按钮项的 customView
时,UIKit 将自动使用 auto-layout。
所以,你的初始化 UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
没有任何效果。
我从您链接到的网站上抓取了“alien.svg”并使用了它 un-edited,设置如下:
然后,使用此代码(在 viewDidLoad()
中):
let button = UIButton()
button.backgroundColor = .yellow
button.setImage(UIImage(named: "alien"), for: .normal)
button.setTitle(nil, for: .normal)
// adding the button as a custom bar button item view
// automatically uses auto-layout
button.widthAnchor.constraint(equalToConstant: 32).isActive = true
button.heightAnchor.constraint(equalTo: button.widthAnchor).isActive = true
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
let item = UIBarButtonItem(customView: button)
// you can use either
//navigationItem.rightBarButtonItem = item
// or
navigationItem.setRightBarButtonItems([item], animated: true)
我们得到这个结果:
另一种不使用自动布局约束实现此目的的方法,就像您评论的那样,是对 customview
使用 UIView()
let view = UIView(frame: button.frame)
view.addSubview(button)
let item = UIBarButtonItem(customView: view)
self.navigationItem.setRightBarButtonItems([item], animated: true)
我有一张矢量图,下载自 phosphor-icons:
我下载了 .svg 版本的图标。
当您在图像编辑器中打开此矢量文件时,您会看到它有 192x192
尺寸。
我猜这与矢量文件无关,但是...
我有这个代码:
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
button.imageView?.contentMode = .scaleAspectFit
button.backgroundColor = .yellow
button.setImage(UIImage(named: "alien"), for: .normal)
button.setTitle(nil, for: .normal)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
let item = UIBarButtonItem(customView: button)
navigationItem.setRightBarButtonItems([item], animated: true)
现在的问题是,如果我使用这个原始 svg
图像 (192x192),按钮会缩小,看起来像这样:
但我不希望此按钮具有这些尺寸,而是那些设置为:
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
现在,如果我转到图像编辑器,并将此矢量文件的大小更改为 22x22
(它仍然是 svg
文件),它会显示如下:
我想要的样子。
问题是,我认为 Xcode 会根据设备的像素密度从这个 svg
生成所需的 png
文件。因此,在这种情况下,比方说,在使用 @3x
图像的较新设备上,在编译时,由于我的按钮被定义为 32x32
点,因此将创建 96px X 96px
图像并将其用作 @3x
图片.
此外,我认为无论物理 .svg
文件的“尺寸”是多少,我都认为这会像描述的那样工作,因为它是一个 向量 ,它应该 up/down 根据视图指示缩放。我哪里错了,以及如何使这个按钮看起来与第二张图片相同,无论实际尺寸是多少。svg
尺寸?
编辑:
在 Attributes Inspector 中,为此资产,我设置了 Preserve Vector Data 并选择了 Single Scale 选项。
添加按钮作为条形按钮项的 customView
时,UIKit 将自动使用 auto-layout。
所以,你的初始化 UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
没有任何效果。
我从您链接到的网站上抓取了“alien.svg”并使用了它 un-edited,设置如下:
然后,使用此代码(在 viewDidLoad()
中):
let button = UIButton()
button.backgroundColor = .yellow
button.setImage(UIImage(named: "alien"), for: .normal)
button.setTitle(nil, for: .normal)
// adding the button as a custom bar button item view
// automatically uses auto-layout
button.widthAnchor.constraint(equalToConstant: 32).isActive = true
button.heightAnchor.constraint(equalTo: button.widthAnchor).isActive = true
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
let item = UIBarButtonItem(customView: button)
// you can use either
//navigationItem.rightBarButtonItem = item
// or
navigationItem.setRightBarButtonItems([item], animated: true)
我们得到这个结果:
另一种不使用自动布局约束实现此目的的方法,就像您评论的那样,是对 customview
UIView()
let view = UIView(frame: button.frame)
view.addSubview(button)
let item = UIBarButtonItem(customView: view)
self.navigationItem.setRightBarButtonItems([item], animated: true)