gpt4 book ai didi

ios - resignFirstResponder 更改帧值

转载 作者:行者123 更新时间:2023-11-29 03:59:43 27 4
gpt4 key购买 nike

我有一个带有两个文本字段和一个按钮的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。这工作得很好。
  • 当我输入一些不正确的字符时,程序几乎执行相同的操作,但将按钮向下移动到其原始位置。
  • 某些字符输入并点击 View 中任意位置时的行为相同

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

这是我的键盘隐藏:

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

知道会发生什么吗?

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

最佳答案

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

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

@property NSLayoutConstraint *loginButtonVerticalSpace;

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

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

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

关于ios - resignFirstResponder 更改帧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16046523/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com