【发布时间】:2014-09-26 02:18:13
【问题描述】:
我正在尝试更改 iOS 中 UISwitch 元素的默认高度和宽度,但没有成功。
你能改变 UISwitch 元素的默认高度和宽度吗?
是否应该以编程方式创建元素?
【问题讨论】:
我正在尝试更改 iOS 中 UISwitch 元素的默认高度和宽度,但没有成功。
你能改变 UISwitch 元素的默认高度和宽度吗?
是否应该以编程方式创建元素?
【问题讨论】:
import UIKit
extension UISwitch {
static let standardHeight: CGFloat = 31
static let standardWidth: CGFloat = 51
@IBInspectable var width: CGFloat {
set {
set(width: newValue, height: height)
}
get {
frame.width
}
}
@IBInspectable var height: CGFloat {
set {
set(width: width, height: newValue)
}
get {
frame.height
}
}
func set(width: CGFloat, height: CGFloat) {
let heightRatio = height / UISwitch.standardHeight
let widthRatio = width / UISwitch.standardWidth
transform = CGAffineTransform(scaleX: widthRatio, y: heightRatio)
}
}
【讨论】:
即使可以使 UISwitch 更小,这也会对用户体验产生负面影响。 Apple 的Human Interface Guidelines 建议触摸目标的最小尺寸为 44 点。
为交互元素提供充足的触摸目标。尽量保持所有控件的最小可点击区域为 44pt x 44pt
通过将其缩放到小于标准尺寸,用户点击将变得更加困难,并且还会引入可访问性问题。在缩小 UI 元素之前,请考虑视力或运动控制不够完美的用户。
最后,这里有一段精彩的 article about touch target sizes 的摘录,说明了当控件太小时会发生什么。
采访者——“我注意到,你在这个屏幕上提交你的电子邮件地址时遇到了一些问题,你能告诉我那是什么感觉吗?”
用户——“哦,是的,我不太擅长技术。”
采访者——“你认为是什么让你在那个时候挣扎?”
用户——“这些按钮很难点击,我一直在塞。”
【讨论】:
斯威夫特 5:
import UIKit
extension UISwitch {
func set(width: CGFloat, height: CGFloat) {
let standardHeight: CGFloat = 31
let standardWidth: CGFloat = 51
let heightRatio = height / standardHeight
let widthRatio = width / standardWidth
transform = CGAffineTransform(scaleX: widthRatio, y: heightRatio)
}
}
【讨论】:
斯威夫特 4
@IBOutlet weak var switchDemo: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
switchDemo.transform = CGAffineTransform(scaleX: 0.75, y: 0.75)
}
【讨论】:
我测试了理论,看来您可以使用scale transform 来增加UISwitch 的大小
UISwitch *aSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(120, 120, 51, 31)];
aSwitch.transform = CGAffineTransformMakeScale(2.0, 2.0);
[self.view addSubview:aSwitch];
【讨论】:
这是我为此目的编写的一个不错的 UISwitch 子类,它也是 IBDesignable,因此您可以从 Storyboard / xib 控制它
@IBDesignable class BigSwitch: UISwitch {
@IBInspectable var scale : CGFloat = 1{
didSet{
setup()
}
}
//from storyboard
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
//from code
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
private func setup(){
self.transform = CGAffineTransform(scaleX: scale, y: scale)
}
override func prepareForInterfaceBuilder() {
setup()
super.prepareForInterfaceBuilder()
}
}
【讨论】:
不可能。 UISwitch 具有锁定的固有高度 51 x 31 。
您可以在设计时在 xib 中强制对开关进行约束...
但在运行时它会恢复到其固有大小。
您可以通过 .onImage / .offImage 属性提供另一张图片,但同样来自文档。
此图片的大小必须小于或等于 77 磅宽 和27分高。如果您指定较大的图像,边缘可能是 剪辑。
如果你想要另一种尺寸,你将不得不烘烤自己的定制。
【讨论】: