【问题标题】:UIView automatically moving by uitextfield keyboardUIView 通过 uitextfield 键盘自动移动
【发布时间】:2015-03-22 13:12:06
【问题描述】:

所以我手头有一个非常奇怪的问题,并且数小时的搜索没有提供任何结果。

我有一个包含 uitextfield 的 uiview。现在,这个视图最初位于可见屏幕之外,坐标为 x=-500,y=-500。

但是,当按下按钮时,此视图会生成动画并移动到屏幕中心。

现在,每当我点击作为此视图的子视图的 uitextfield 时。此视图将移回屏幕外的原始坐标。

我已经疯狂地检查了我的代码,一旦它进入,没有任何东西会再次将视图移到外面。任何帮助解释这种非常陌生的行为将不胜感激。

此代码将视图移动到屏幕上

- (IBAction)Register:(id)sender {
//(self.view.frame.size.width/2)-(self.SignUp_Screen.frame.size.width/2);
//self.login_Screen.hidden = YES;
self.blurView.hidden = NO;
//self.SignUp_Screen.layer.zPosition = 5;
NSLog(@"Register");
self.SignUp_Screen.hidden = NO;

[UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.SignUp_Screen.frame = CGRectMake(35, 50,self.SignUp_Screen.frame.size.width , self.SignUp_Screen.frame.size.height);
} completion:^(BOOL finished) {

}];
}

这些是文本字段的委托方法

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    NSLog(@"TextFieldEndEditing");
    [textField resignFirstResponder];
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    NSLog(@"textFieldShouldReturn");
    [textField resignFirstResponder];
    return YES;
}

【问题讨论】:

  • 你在使用自动布局吗? - 如果是这样,您应该考虑将 IBOutlet 添加到您的一个或多个约束并为其值设置动画,而不是框架本身。
  • 是的,我正在使用自动布局
  • 我在禁用大小类和自动布局后尝试了您的代码,它工作正常
  • 嗯,这意味着自动布局导致问题

标签: ios objective-c uitextfield first-responder uitextfielddelegate


【解决方案1】:

正如 Wezly 所暗示的,如果您使用自动布局,则不再直接修改框架。那是旧世界。您希望为约束设置一个 Outlet / 属性并为其设置动画。

[UIView animateWithDuration:0.25
                 animations:^{
                   SignUp_Screen.centerXConstraint.constant = ...;
                   SignUp_Screen.centerYConstraint.constant = ...;
                   [SignUp_Screen layoutIfNeeded];
 }];

有关详细信息,请参阅 herehere

【讨论】:

    【解决方案2】:

    我解决此问题的方法是将IBOutlet 链接到我想要更改的约束,然后将其动画化为constant 值。

    .h

    @interface ViewController : UIViewController {
        IBOutlet NSLayoutConstraint *constraintHandle;
    }
    

    .m

    [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        constraintHandle.constant = self.view.center.x;
        [SignUp_Screen layoutIfNeeded];
    } completion:^(BOOL finished) {
    
    }];
    

    不要忘记将 IBOutlet 链接到故事板或 xib 中的约束。

    【讨论】:

    • 约束出口不必放在头文件中,最好放在实现文件中的类扩展中,这样对类来说是私有的。最好只将那些应该公开的内容放在接口 (.h) 文件中。
    【解决方案3】:

    如果您使用自动布局,则不应修改框架。您应该通过动画约束的常量来动画视图。例如:

    NSLayoutConstraint *viewY; //constraint from superview top to view top
    
    viewY.constant = 100;
    [self.view setNeedsUpdateConstraints];
    [UIView animateWithDuration:0.3f animations:^{
        [self.view layoutIfNeeded];
    }];
    

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 2020-05-08
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 2012-10-25
      • 2010-12-19
      • 2015-06-26
      相关资源
      最近更新 更多