resignFirstResponder更改帧值

时间:2013-04-16 20:33:03

标签: ios objective-c resignfirstresponder

我有一个LoginViewController,有两个文本字段和一个按钮。我使用了storyboard,因此这些都不是以编程方式创建的。他们在彼此之下。

这是.h文件

@interface LoginViewController : UIViewController <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *pw1;
@property (weak, nonatomic) IBOutlet UITextField *pw2;
@property (weak, nonatomic) IBOutlet UIButton *loginBtn;
- (IBAction)loginBtnPressed:(id)sender;
- (IBAction)singleTapRecognized:(id)sender;
@end

pw2仅在第一次运行时显示,当用户创建新密码并在pw2中确认时。否则它是隐藏的。在这种情况下,我将按钮向上移动以使按钮更靠近pw1

    CGSize size = self.pw2.frame.size;
    CGRect rect = self.loginBtn.frame;
    CGRect newFrame = CGRectMake(rect.origin.x, rect.origin.y-size.height, rect.size.width,rect.size.height);
    [self.loginBtn setFrame:newFrame];

到目前为止,这么好。到目前为止所有工作都按预期进行。但现在......

  • 当我将pw1留空时,程序会检查该字段,检测到该字段为空,隐藏键盘并显示UIAlertView。这很好。
  • 当我输入一些不正确的字符时,程序几乎完全相同,但将按钮移动到原来的位置。
  • 在视图中的任何位置输入和点按某些字符时的相同行为

我发现,只有当我隐藏键盘时才会发生这种情况。否则按钮会按预期保持在“上升”位置。

这是我的键盘隐藏:

-(void) hideKeyboard {
    if (self.pw1.isFirstResponder)
        [self.pw1 resignFirstResponder];
    else if (self.pw2.isFirstResponder)
        [self.pw2 resignFirstResponder];
}

任何想法会发生什么?

抱歉我的英语。英语不是我的母语。

1 个答案:

答案 0 :(得分:1)

我想与您分享我的解决方案。我确信有一种更优雅的编码方式,但是这个方法对我来说更好。

我在.h文件中添加了属性来保存按钮的新约束。

@property NSLayoutConstraint *loginButtonVerticalSpace;

然后我添加一个例程来查找故事板中定义的“旧”约束。

-(NSLayoutConstraint *) findButtonConstraintForItem:(id) item
                                         secondItem:(id) secondItem     //may be nil
                                     firstAttribute:(NSLayoutAttribute)firstAttribute
                                    secondAttribute:(NSLayoutAttribute)secondAttribute
    {
        NSArray *cons = self.view.constraints;

        for (NSLayoutConstraint *ns in cons) {
        if (ns.firstItem==item)
        {
           if (ns.firstAttribute==firstAttribute)
           {
               if (secondItem==nil)
                   return ns;
               if (ns.secondItem==secondItem && ns.secondAttribute==secondAttribute)
                   return ns;
           }
        }

    }
    return nil;
}

至少我将“moveButton”方法更改为以下内容:

- (void) moveButtonUp{
    NSLayoutConstraint *consOld = [self findButtonConstraintForItem:self.loginBtn
                                                         secondItem:self.pw1
                                                     firstAttribute:NSLayoutAttributeTop
                                                    secondAttribute:NSLayoutAttributeBottom];
    if (!consOld)   // should not happen
        return;

    if (self.loginButtonVerticalSpace)   // work already done
        return;

    CGSize size = self.pw2.frame.size;

    self.loginButtonVerticalSpace =[NSLayoutConstraint
                                   constraintWithItem:self.loginBtn
                                             attribute:NSLayoutAttributeTop
                                             relatedBy:NSLayoutRelationEqual
                                               toItem:self.pw1
                                             attribute:NSLayoutAttributeBottom
                                            multiplier:1.0
                                              constant:consOld.constant-size.height];

    self.loginButtonVerticalSpace.priority=1000;
    [self.view addConstraint:self.loginButtonVerticalSpace];
    [self.view removeConstraint:consOld];
}

非常感谢,伙计......