2013-04-16 38 views
0

我有一个LoginViewController带有两个文本字段和一个按钮。我使用故事板,所以这些不是以编程方式创建的。他们低于彼此。resignFirstResponder更改框架值

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

    任何想法会发生什么?

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

  • +0

    要隐藏键盘,您可以用'[个体经营.view endEditing:YES]'。 –

    +0

    问题是,当您隐藏键盘时,按钮会将位置更改为原始位置?请告诉我更多详细信息(例如,显示故事板或更多代码) –

    +0

    [UIView布局被重置]的可能重复(http://stackoverflow.com/questions/14087245/uiview-layout-being-reset) –

    回答

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

    太感谢你了,伙计们....