当键盘出现在我的应用程序中时,我可以将视图向上滑动,以便可以看到文本字段并且它工作得很好。但是,由于它基于键盘通知,因此仅在键盘出现时才有效。
意思是,我选择一个文本字段,键盘出现并且视图相应地向上滑动,但是如果我然后直接点击另一个文本字段,则视图不会调整,因为键盘已经存在。
这是我正在使用的代码,任何帮助我们在上述情况下工作的帮助都将非常感激。
-(void)registerForKeyboardNotifications
{
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
[center addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
// add a tap gesture to drop first responder
UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapToHideKeyboard:)];
[self.view addGestureRecognizer:tapGR];
}
-(void)keyboardDidShow:(NSNotification *)notification
{
CGRect keyboardFrameW = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
CGRect keyboardFrame = [window convertRect:keyboardFrameW toView:self.view];
//Have a minimum space between the keyboard and textfield
CGFloat textFieldBuffer = 40;
CGFloat textFieldKeyboardDifference = 0;
if (activeTextField.frame.origin.y + activeTextField.frame.size.height > keyboardFrame.origin.y) textFieldKeyboardDifference = (activeTextField.frame.origin.y + activeTextField.frame.size.height + textFieldBuffer) - keyboardFrame.origin.y;
else if (activeTextField.frame.origin.y + activeTextField.frame.size.height < keyboardFrame.origin.y) textFieldKeyboardDifference = 0;
[self translateView:self.view toRect:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y - textFieldKeyboardDifference, self.view.frame.size.width, self.view.frame.size.height) withDuration:0.3];
}
-(void)keyboardWillHide:(NSNotification *)notification
{
//Revert to y origin 0
[self translateView:self.view toRect:CGRectMake(self.view.frame.origin.x, 0, self.view.frame.size.width, self.view.frame.size.height) withDuration:0.3];
}
编辑:
我尝试在调用textFieldDidBeginEditing
时手动调用键盘通知:
[self keyboardDidShow:[NSNotification notificationWithName:UIKeyboardDidShowNotification object:nil]];
没有运气。该方法被调用,但没有进行调整,原因是我无法解决。
答案 0 :(得分:2)
您可能希望在此处执行的操作是为您的所有UITextField
提供委托,并在委托上实施- (void)textFieldDidBeginEditing:(UITextField *)textField
以触发您的滚动操作。只要有人开始在文本字段上进行编辑,就会调用此方法,并将文本字段作为参数传递给方法。
编辑:使用您的代码作为起点,这就是我提出的。每次更改文本字段时都会调用它:
@interface SOViewController () <UITextFieldDelegate>
@property (nonatomic, readwrite, assign) UITextField* activeTextField;
@property (nonatomic, readwrite, assign) CGRect keyboardFrame;
@end
@implementation SOViewController
@synthesize activeTextField;
@synthesize keyboardFrame;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self registerForKeyboardNotifications];
self.keyboardFrame = CGRectNull;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
self.activeTextField = textField;
[self updatePosition];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
self.activeTextField = nil;
}
-(void)registerForKeyboardNotifications
{
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
[center addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
// // add a tap gesture to drop first responder
// UITapGestureRecognizer *tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapToHideKeyboard:)];
// [self.view addGestureRecognizer:tapGR];
}
- (void)translateView: (UIView*)view toRect: (CGRect)rect withDuration: (NSTimeInterval)duration
{
NSLog(@"Translating view to rect: %@ overDuration: %g", NSStringFromCGRect(rect), duration);
}
- (void)updatePosition
{
if (self.activeTextField && !CGRectIsNull(self.keyboardFrame))
{
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
CGRect localKeyboardFrame = [window convertRect: self.keyboardFrame toView:self.view];
//Have a minimum space between the keyboard and textfield
CGFloat textFieldBuffer = 40;
CGRect textFieldFrame = self.activeTextField.frame;
CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 0;
if (CGRectGetMaxY(textFieldFrame) + textFieldBuffer > CGRectGetMinY(localKeyboardFrame))
{
viewFrame.origin.y = -1.0 * (CGRectGetMaxY(textFieldFrame) + textFieldBuffer - CGRectGetMinY(localKeyboardFrame));
}
[self translateView: self.view toRect: viewFrame withDuration: 0.3];
}
else
{
CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 0;
[self translateView: self.view toRect: viewFrame withDuration: 0.3];
}
}
-(void)keyboardDidShow:(NSNotification *)notification
{
self.keyboardFrame = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
[self updatePosition];
}
-(void)keyboardWillHide:(NSNotification *)notification
{
self.keyboardFrame = CGRectNull;
[self updatePosition];
}
@end
答案 1 :(得分:0)
我喜欢在像你这样的情况下使用UITableViewController
子类。只需使用UITableView
标题页脚和单元格构建您的视图。如果您需要在UITextView
或字段UITableViewController
内进行文字修改,则会自动排版所有内容。
即使你将scrollEnabled
属性设置为NO;