VFL更新约束产生的问题

需求:监听键盘frame发生改变时,让inputView跟随键盘显示、隐藏更新位置

在viewDidLoad方法中添加子控件inputView

  - (void)viewDidLoad {
    [super viewDidLoad];

    // 添加底部inputView
    self.view.backgroundColor = [UIColor whiteColor];
    XYInputView *inputView = [[XYInputView alloc] init];
    [self.view addSubview:inputView];
    self.inputView = inputView;

    // 监听键盘frame发生改变的通知
   // 注意: 在这个监听通知的block中要注意循环引用,第一次忘记使用__weak导致当前控制器未被销毁,使用__weak修饰self就解决了
    __weak typeof(self) weakSelf = self;
    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillChangeFrameNotification
                                                  object:nil queue:nil
                                              usingBlock:^(NSNotification * _Nonnull note) {
    // 更新inputView的约束
    [weakSelf modifyConstraint:note];
                                                
                                              }];
  }

在viewWillLayoutSubviews方法中给子控件设置约束

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];

    self.inputView.translatesAutoresizingMaskIntoConstraints = NO;
    // 设置inputView约束
    NSDictionary *views = NSDictionaryOfVariableBindings(_inputView);
    NSDictionary *metrics = @{@"height": @44};
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_inputView]|"
                                                                      options:0 metrics: metrics views:views]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_inputView(height)]|"
                                                                  options:0 metrics: metrics views:views]];
}

问题:
由于设置约束使用的是VFL,在键盘frame发生改变时,根据【屏幕的高度】-【键盘结束时的y值】动态改变inputView的y值,但是更新约束时产生问题: 就是键盘显示时inputView会跟随改变y值,当键盘即将隐藏时,inputView并不会改变y值。最后我通过设置inputView.transform解决了

-(void)modifyConstraint:(NSNotification *)note {

    // 取出键盘结束时的frame
    CGRect endFrame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat y = kScreenH - endFrame.origin.y; // inputView的y值跟随键盘显示、消失而改变

    [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^{

        self.inputView.transform = CGAffineTransformMakeTranslation(0, -y);
    }];

    /**************下面是更新约束的代码,这里使用VFL和Masonry都有问题,虽然修改transform可以解决,但是我也要mark下,以后找答案*********************/
    // 更改inputView的底部约束
    // 根据键盘键盘的y值更新约束会产生问题,就是当键盘隐藏时y为0,但是inputView约束却不改变,未解决,😢
    //        [self.inputView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:-y].active = YES;
    //        [self.view layoutIfNeeded];

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于布局约束的发展史: 1.通过代码计算frame 2.Autoresizing(设置控件与父控件的相对关系,从而...
    4d49353c3819阅读 6,205评论 0 1
  • ios布局约束 关于布局约束的发展史: 1.通过代码计算fram...
    孤独烈酒_1阅读 2,675评论 0 1
  • 开始iOS 7中自动布局教程(一) 发布于:2013-12-03 13:53阅读数:86977 到目前为止,如果你...
    谁的青春不迷茫阅读 4,425评论 0 2
  • iOS有三种基本的界面布局的方法,分别是手写UI,xib和storyboard。手写UI是最早进行UI界面布局的方...
    o慢慢o阅读 23,249评论 0 20
  • 今天下午,我送儿子画画后,去健身房锻炼了身体。这算我头一次健身,感觉新奇又好玩。 两星期前,也是送儿子去画画,我被...
    金错刀618阅读 1,598评论 0 3

友情链接更多精彩内容