Objective c 更改视图是否安全';s帧,如果它具有TranslatesAutoResizengMaskintoConstraints=是

Objective c 更改视图是否安全';s帧,如果它具有TranslatesAutoResizengMaskintoConstraints=是,objective-c,autolayout,nslayoutconstraint,autoresizingmask,Objective C,Autolayout,Nslayoutconstraint,Autoresizingmask,我有一个视图(非自动布局),带有autoresizingMask=ui视图autoresizingflexiblewidth和translatesAutoresizingmask sintoConstraints=YES 它被添加到宽度为320的superview中,因此它也是320宽度。旋转到横向时,宽度变为568。我想把横向旋转的宽度限制在400。我的方法是,当方向改变时,如果superview>400,则将视图的边框设置为400宽度 - (void)orientationChanged:(

我有一个视图(非自动布局),带有
autoresizingMask=ui视图autoresizingflexiblewidth
translatesAutoresizingmask sintoConstraints=YES

它被添加到宽度为320的superview中,因此它也是320宽度。旋转到横向时,宽度变为568。我想把横向旋转的宽度限制在400。我的方法是,当方向改变时,如果superview>400,则将视图的边框设置为400宽度

- (void)orientationChanged:(NSNotification*)notification {
  if (self.superview) {
    float superviewWidth = self.superview.bounds.size.width;

    if (superviewWidth > 400.0) {
      CGRect oldFrame = self.frame;
      self.frame = CGRectMake((superviewWidth - 400.0)/2.0, oldFrame.origin.y, 400.0, oldFrame.size.height);
    }
  }
}
我的问题是,更改视图的框架是否安全

  • 视图是否从其自动调整大小遮罩生成布局约束
  • 是否将视图添加到启用了“自动布局”的superview

  • 通常,当涉及约束时,会通过约束而不是帧来执行大小调整和动画。这也适用于这里吗?我担心对大小可能产生的任何副作用,例如在纯自动布局中设置帧而不是约束动画时可能发生的情况。

    如果视图配置为基于约束的布局,则不应手动调整帧,因为它将在下一次布局过程中更改。通过在视图上设置最大宽度约束,可以轻松完成此操作


    如果未配置基于约束的布局,则当前解决方案将起作用,尽管视图修改自己的框架(视图的框架应由其superview或视图控制器修改)是一种不好的做法。

    它似乎起作用。令人困惑的是,它将遮罩转换为约束,合理的猜测可能是其中一些约束是针对帧的。因此,更改其框架将导致纯自动布局的相同问题。但看起来情况并非如此。@illusionfactory我认为调用
    setFrame:
    会导致自动调整大小掩码生成的约束失效,并基于新帧重新创建。