我正在使用自动布局
我想制作一个较小的UISwitch,然后使用view.transform = CGAffineTransformMakeScale(0.5, 0.5)
来实现它。
此开关上方还有另一个视图。 此开关的前导应与此视图的前沿对齐,并且在视图和开关之间有一个固定的垂直空间,如下图所示:
iOS7上的观点
然而,iOS8上有不同的外观:
iOS上的观点
似乎约束不适用于此开关。
但是我打电话给self.view.layoutSubviews()
和
self.view.layoutIfNeeded()
它没有用。
如何让这个开关始终贴在上面视图的右下角?
这里是没有按比例缩小的开关
答案 0 :(得分:0)
您有两种可能的方法:在子类UISwitch中尝试在子类中应用所有需要的修改,或者定义一个新的UIView,其中包含一个修改过的UISwitch作为子视图。子类可能是最快的,但由于UISwitch不打算成为这种修改的子类,因此它更加棘手且风险更大。
假设您进入子类路由,以下是您需要进行的修改:
显然将缩放变换应用于self
。
覆盖alignmentRectForFrame:
,因此会返回super.alignmentRectForFrame:
以及缩放转换。
覆盖intrinsicContentSize
,因此返回super.intrinsicContentSize
加上缩放转换
基本上,数字1应该执行实际的视觉转换。但需要2和3来通知自动布局有关新视图的大小,因为默认情况下AL不知道变换。
答案 1 :(得分:0)
视图的转换发生在视图的中心周围,所以当你打电话时
view.transform = CGAffineTransformMakeScale(0.5, 0.5)
在iOS 8中看起来很有意义,因为它在iOS 7中看起来不错,可能是因为iOS 7中存在错误。
尝试更改前导约束的常量,如下所示:
self.switchLeadingConstraint.constant = -(self.mySwitch.bounds.size.width/4)
通过这种方式,您可以弥补iOS 8中的越位。