Мне нужна помощь, чтобы попытаться настроить в UIViewController клавиатуру: (a) не зависать над обоими полями UIText, поэтому скроллер должен быть расположен правильно; и (b) когда пользователь касается фона, клавиатура исчезает.
Я еще не пробовал (б), но пытаюсь (а), и код, который я получил от поиска в Google, не дал мне желаемого эффекта. Фактически, это заставляет мои текстовые поля исчезать, когда я касаюсь одного из них. Я уверен, что моя реализация activeField также неверна. Я получил этот пример из раздела Клавиатура Apple Development.
Код, который у меня есть, находится ниже:
@interface FirstViewController : UIViewController {
IBOutlet UITextField *emailAddress;
IBOutlet UITextField *password;
IBOutlet UIButton *loginButton;
IBOutlet UIScrollView *scroller;
BOOL keyboardShown;
UITextField *activeField;
ASIHTTPRequest *requestRequiringAuthentication;
ASINetworkQueue *networkQueue;
}
- (IBAction) LoginUser:(id)sender;
@property (nonatomic,retain) IBOutlet UITextField *emailAddress;
@property (nonatomic,retain) IBOutlet UITextField *password;
@property (nonatomic, retain) IBOutlet UIScrollView *scroller;
@property (nonatomic, retain) UITextField *activeField;
@property (retain) ASINetworkQueue *networkQueue;
@property (retain) ASIHTTPRequest *requestRequiringAuthentication;
@end
@implementation FirstViewController
@synthesize requestRequiringAuthentication;
@synthesize networkQueue;
@synthesize password;
@synthesize emailAddress;
@synthesize scroller;
@synthesize activeField;
#pragma mark -
#pragma mark LifeCycle
- (void)awakeFromNib
{
NSLog(@"awaking from nib");
[self setNetworkQueue:[[[ASINetworkQueue alloc] init] autorelease]];
}
- (void)viewDidLoad {
NSLog(@"viewdidload");
[super viewDidLoad];
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated {
keyboardShown = NO;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasHidden:) name:UIKeyboardDidHideNotification object:nil];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super viewWillDisappear:animated];
}
// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
if (keyboardShown)
return;
NSDictionary* info = [aNotification userInfo];
// Get the size of the keyboard.
NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;
// Resize the scroll view (which is the root view of the window)
CGRect viewFrame = [scroller frame];
viewFrame.size.height -= keyboardSize.height;
scroller.frame = viewFrame;
// Scroll the active text field into view.
CGRect textFieldRect = [activeField frame];
[scroller scrollRectToVisible:textFieldRect animated:YES];
keyboardShown = YES;
}
// Called when the UIKeyboardDidHideNotification is sent
- (void)keyboardWasHidden:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
// Get the size of the keyboard.
NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;
// Reset the height of the scroll view to its original value
CGRect viewFrame = [scroller frame];
viewFrame.size.height += keyboardSize.height;
scroller.frame = viewFrame;
keyboardShown = NO;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
activeField = textField;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
activeField = nil;
}