使用了autolayout就无法在viewDidLoad中改变视图的frame了吗?


  • 假设,在xib文件中定义了视图控制器的view,其中有一个label,被放置在view的中心位置(通过constraints固定)。

  • 现在想通过触摸屏幕的某个点实现label从左滑入,从右滑出的效果(目标-动作)。于是我在 viewDidLoad 中将label的frame设置到屏幕左边,窗口外侧。可是实现效果却是label从原地冒了出来(就是不知道什么时候label的frame又被改回了xib中的frame)。

  • 我试过在动作方法中对label的frame进行同样的设置,这时效果符合预期。所以我的问题是,为什么不能 viewDidLoad 方法中进行这样的修改,我记得同视图相关的设置都应该在这个方法里完成啊?

ios autolayout

德丽莎观星 9 years, 7 months ago
  1. 从初始位置出现是因为在执行布局操作的时候会根据你的约束来生成 frame,你的初始约束导致的这个行为的发生。

  2. 如果你想从左滑向中间,那么你应该先设置初始约束在屏幕左边 (UILabel)|Screen| 。然后在执行 Target Action 行为时修改 UILabel 约束的 constant。接着执行布局操作。就如 @paul_ding 的第二个答案,不过建议更改成:


 - (IBAction)moveAction:(id)sender {
    self.lb_centerLeadingConstraint.constant=320;//根据需求改变大小
    [UIView animateWithDuration:1 animations:^{
        [self.lb_center layoutIfNeeded];

    }];
}

宫本蕾貝卡 answered 9 years, 7 months ago

1 把label的约束拿出来


 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *lb_centerLeadingConstraint;

2 点击时改变约束


 - (IBAction)moveAction:(id)sender {
    [UIView animateWithDuration:1 animations:^{
        self.lb_centerLeadingConstraint.constant=320;//根据需求改变大小
        [self.lb_center layoutIfNeeded];

    }];
}

不辣的披特 answered 9 years, 7 months ago

Your Answer