0

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

这是.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];
}

任何想法会发生什么?

对不起我的英语。英语不是我的母语。

4

1 回答 1

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];
}

十分感谢大家....

于 2013-04-17T11:57:51.383 回答