我有一个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];
}
任何想法会发生什么?
抱歉我的英语。英语不是我的母语。
答案 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];
}
非常感谢,伙计......