Objective c iOS8不同的行为:带有view.transform=CGAffineTransformMakeScale(0.5,0.5)的自动布局,视图未正确定位

Objective c iOS8不同的行为:带有view.transform=CGAffineTransformMakeScale(0.5,0.5)的自动布局,视图未正确定位,objective-c,autolayout,ios8,cgaffinetransform,uiswitch,Objective C,Autolayout,Ios8,Cgaffinetransform,Uiswitch,我用的是自动布局 我想制作一个更小的UISwitch,然后使用view.transform=CGAffineTransformMakeScale(0.5,0.5)来实现它 此开关上方还有另一个视图。 此开关的前缘应与此视图的前缘对齐,并且视图和开关之间有固定的垂直空间,如下图所示: 对iOS7的看法 但是,iOS8上有不同的外观: 对iOS8的看法 似乎约束未应用于此开关 但是我调用了self.view.layoutSubviews()和 self.view.layoutifneed() 它不起

我用的是自动布局

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

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

对iOS7的看法

但是,iOS8上有不同的外观:

对iOS8的看法

似乎约束未应用于此开关

但是我调用了self.view.layoutSubviews()和
self.view.layoutifneed()

它不起作用

如何让此开关始终粘贴到上述视图的右下角

这是一个未按比例缩小的开关


这里有两种可能的方法:要么子类UISwitch并尝试在子类中应用所有需要的修改,要么定义一个新的UIView,其中包含一个修改后的UISwitch作为子视图。子类可能是最快的,但它更复杂,风险更大,因为UISwitch并不打算成为这种修改的子类

假设您选择子类化路线,以下是您需要进行的修改:

  • 显然,将缩放变换应用于
    self

  • 覆盖
    alignmentRectForFrame:
    ,因此它返回
    super.alignmentRectForFrame:
    加上缩放变换

  • 重写
    intrinsicContentSize
    ,因此它返回
    super.intrinsicContentSize
    加上缩放变换


  • 基本上,数字1应该执行实际的视觉转换。但是2和3对于通知Auto Layout新视图的大小是必需的,因为默认情况下AL不知道变换。

    视图的变换发生在视图的中心周围,因此当您调用

    view.transform = CGAffineTransformMakeScale(0.5, 0.5)
    
    在iOS 8中看起来像这样是有道理的,在iOS 7中看起来不错的原因可能是因为iOS 7中有一个bug

    尝试更改前导约束的常量,如下所示:

    self.switchLeadingConstraint.constant = -(self.mySwitch.bounds.size.width/4)
    

    这样你就可以弥补你在iOS 8中的越位

    自动布局不适用于图层transforms@MaxMacLeod我只是想知道为什么相同的代码在iOS7和iOS8上有不同的行为。我想你的意思是这个答案,对吧?我猜它的行为是这样的,因为UISwitch的固有内容大小保持在默认的w:51px h:31px,尽管视图转换发生了变化。您应该尝试对UISwitch进行子类化,并通过返回CGSizeMake(25.5f,15.5f)重写-(CGSize)intrinsicContentSize方法