我正在尝试更改iOS中UISwitch元素的默认高度和宽度,但未成功。
您可以更改UISwitch元素的默认高度和宽度吗? 元素是否应该以编程方式创建?
答案 0 :(得分:36)
我对该理论进行了测试,您似乎可以使用scale transform
来增加UISwitch
UISwitch *aSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(120, 120, 51, 31)];
aSwitch.transform = CGAffineTransformMakeScale(2.0, 2.0);
[self.view addSubview:aSwitch];
答案 1 :(得分:10)
不可能。 UISwitch
的内在高度为51 x 31
。
您可以在设计时在xib ...
中强制对开关施加约束
但是到了运行时它将恢复到其固有的大小。
您可以通过.onImage
/ .offImage
属性提供另一张图片,但也可以从文档中提供。
此图像的大小必须小于或等于77点宽 和27点高。如果指定较大的图像,则边缘可能是 削波。
如果你想要另一种尺寸,你将不得不烘烤自己的自定义。
答案 2 :(得分:8)
这是我为此目的写的一个很好的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()
}
}
答案 3 :(得分:7)
快捷键4
@IBOutlet weak var switchDemo: UISwitch!
override func viewDidLoad() {
super.viewDidLoad()
switchDemo.transform = CGAffineTransform(scaleX: 0.75, y: 0.75)
}
答案 4 :(得分:1)
即使可以将UISwitch缩小,这也会对用户体验产生负面影响。苹果公司Human Interface Guidelines建议触摸目标的最小尺寸为44点。
为交互式元素提供足够的触摸目标。尝试将所有控件的最小可触摸区域保持为44pt x 44pt
通过将其缩放到小于标准尺寸,用户将变得更加难以点击,并带来了可访问性问题。在缩小UI元素之前,请考虑视力或运动控制不佳的用户。
最后,这是摘录自article about touch target sizes的摘录,阐明了控件太小会发生什么情况。
访问者 —“我注意到,您在此屏幕上提交电子邮件地址时遇到了麻烦,您能告诉我您的感觉吗?”
用户-“哦,我不是很擅长技术。”
采访者-“您认为当时导致您挣扎的是什么?”
用户-“这些按钮很难被点击,我一直在塞满它。”
答案 5 :(得分:0)
迅速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)
}
}
答案 6 :(得分:0)
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)
}
}