【问题标题】:Update view's frame keeping constraints更新视图的框架保持约束
【发布时间】:2015-10-29 11:08:19
【问题描述】:

简单来说,看下面的图片:

  1. 我设计了一个视图,把约束放在左上右下。更改视图方向时它可以正常工作。

  1. 放一个简单的代码来改变视图高度:

    // 代码

    -(BOOL)textFieldShouldReturn:(UITextField *)textField
    {
       self.view.translatesAutoresizingMaskIntoConstraints = NO;
    
       CGRect updateViewFrame = self.updatingView.frame;
       updateViewFrame.size.height = textField.text.floatValue;
       self.updatingView.frame = updateViewFrame;
    
       [self.view setNeedsLayout];
    
       return YES;
     }
    

???为什么SO里面的代码格式乱七八糟?

我应该如何在代码中 使 UITextfield 与视图的高度一起向上移动,而不直接更改 textField 的框架?更改视图的框架后,我的自动布局约束不再起作用。

其他说明: 1、containerView是scrollView,不用担心高度太长。 2. 请问有没有不直接改变UITextField的frame的方法,因为后面我会添加更多的views,controls。如果我必须为每个控件更新框架,可能会导致混乱:(

【问题讨论】:

标签: ios objective-c autolayout constraints


【解决方案1】:

如果你想在 Interface Builder 中创建你的自动布局约束,你可以为它们创建IBOutlets,方法与视图、按钮等相同。你可以更改此类约束的常量并动画/刷新视图:

@interface ViewController ()

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

@end

@implementation ViewController

- (void)someMethod {

    self.topSpace.constant = 60;

    [UIView animateWithDuration:1 animations:^{
        [self.view layoutSubviews]; //just this line if you don't want the animation
    }];

}

@end

手动设置框架会破坏链接到该视图的所有约束。

【讨论】:

  • 那么除了直接把框架弄乱之外没有别的办法了吗?设置常量对我来说也差不多.....
  • 不,有办法——修改约束。 “设置常数对我来说也很重要”是什么意思?是不是太难了?如果是,为什么?
  • 这就像,如果我有太多视图,我将不得不设置那么多常量,这就是我的意思。另外,我昨天调试过,顶部约束出口的常量仍然是我在 IB 中设置的常量,即使框架已经改变。奇怪吗?
  • 嗯,这取决于。请记住,如果您更改一个约束常数,其他约束常数将“适应”。但是如果你想要一个包含很多动画和移动部件的复杂(意味着很多视图)布局,也许你最好在代码中设置约束并使用某种布局帮助库,比如Masonry(@例如 987654321@)。
猜你喜欢
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
相关资源
最近更新 更多