iOS8的不同行为:使用view.transform = CGAffineTransformMakeScale(0.5,0.5)的Autolayout,视图未正确定位

时间:2014-09-18 03:52:46

标签: objective-c autolayout ios8 cgaffinetransform uiswitch

我正在使用自动布局

我想制作一个较小的UISwitch,然后使用view.transform = CGAffineTransformMakeScale(0.5, 0.5)来实现它。

此开关上方还有另一个视图。 此开关的前导应与此视图的前沿对齐,并且在视图和开关之间有一个固定的垂直空间,如下图所示:

iOS7上的

enter image description here观点

然而,iOS8上有不同的外观:

iOS上的

enter image description here观点

似乎约束不适用于此开关。

但是我打电话给self.view.layoutSubviews()和         self.view.layoutIfNeeded()

它没有用。

如何让这个开关始终贴在上面视图的右下角?

这里是没有按比例缩小的开关

enter image description here

2 个答案:

答案 0 :(得分:0)

您有两种可能的方法:在子类UISwitch中尝试在子类中应用所有需要的修改,或者定义一个新的UIView,其中包含一个修改过的UISwitch作为子视图。子类可能是最快的,但由于UISwitch不打算成为这种修改的子类,因此它更加棘手且风险更大。

假设您进入子类路由,以下是您需要进行的修改:

  1. 显然将缩放变换应用于self

  2. 覆盖alignmentRectForFrame:,因此会返回super.alignmentRectForFrame:以及缩放转换。

  3. 覆盖intrinsicContentSize,因此返回super.intrinsicContentSize加上缩放转换

  4. 基本上,数字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中的越位。