J'utilise UITextField pour recevoir des entrées d'utilisateur. Cependant, comme mes champs de texte sont situés vers le milieu/le bas de la pointe, ils sont masqués lorsque le clavier apparaît. Y a-t-il un moyen de le glisser avec le clavier pour qu'il soit en haut du clavier lors de la sélection? De plus, puisque j'utilise également le pavé numérique, existe-t-il un moyen simple d'inclure un bouton terminé quelque part?
Merci pour l'aide.
Pour faire défiler lorsque le clavier apparaît, j'aime ce tutoriel de Cocoa With Love.
Pour fermer le clavier numérique, vous pouvez placer un bouton personnalisé "Terminé" sur le clavier ou créer un bouton invisible sur le reste de l'écran. J'ai fait ce dernier avec du code, mais ce tutoriel utilise Interface Builder.
J'ai fait une application simple pour ce problème. Il vérifie automatiquement la position du champ de texte et si le clavier le cache, il se déplacera automatiquement selon les besoins.
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[self animateTextField:textField up:YES];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self animateTextField:textField up:NO];
}
- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
int animatedDistance;
int moveUpValue = textField.frame.Origin.y+ textField.frame.size.height;
UIInterfaceOrientation orientation =
[[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationPortrait ||
orientation == UIInterfaceOrientationPortraitUpsideDown)
{
animatedDistance = 216-(460-moveUpValue-5);
}
else
{
animatedDistance = 162-(320-moveUpValue-5);
}
if(animatedDistance>0)
{
const int movementDistance = animatedDistance;
const float movementDuration = 0.3f;
int movement = (up ? -movementDistance : movementDistance);
[UIView beginAnimations: nil context: nil];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration: movementDuration];
self.view.frame = CGRectOffset(self.view.frame, 0, movement);
[UIView commitAnimations];
}
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return YES;
}
Vous devrez le faire manuellement. Découvrez cette réponse . UITextField: déplacez la vue lorsque le clavier apparaît
si quelqu'un en a besoin, j'ai traduit la solution de ValayPatel en Swift
func animatedTextField(textField: UITextField, up: Bool){
var animatedDistance : Int = 0
let moveUpValue : Int = Int(textField.frame.Origin.y) + Int(textField.frame.size.height)
switch UIDevice.currentDevice().orientation {
case .Portrait , .PortraitUpsideDown:
animatedDistance = 216 - (460 - moveUpValue - 5)
default:
animatedDistance = 162 - (320 - moveUpValue - 5)
}
if (animatedDistance > 0 ){
let movementDistance : Int = animatedDistance
let movementDuration : Float = 0.3
let movement = up ? -movementDistance : movementDistance
UIView.beginAnimations(nil, context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(NSTimeInterval(movementDuration))
self.view.frame = CGRectOffset(self.view.frame, 0, CGFloat(movement))
UIView.commitAnimations()
}
}
Utilisez ce code:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:self.view.window];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHide:)
name:UIKeyboardDidHideNotification
object:self.view.window];
}
- (void)viewDidDisappear:(BOOL)animated {
// unregister for keyboard notifications while not visible.
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIKeyboardDidHideNotification
object:nil];
}
- (void)keyboardDidHide:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft))
viewFrame.size.height += 140;
else viewFrame.size.height += 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = NO;
}
- (void)keyboardDidShow:(NSNotification *)n
{
CGRect viewFrame = scrollView.frame;
UIDeviceOrientation orientSide = [[UIDevice currentDevice] orientation];
if ((orientSide == UIDeviceOrientationLandscapeRight) || (orientSide == UIDeviceOrientationLandscapeLeft))
viewFrame.size.height -= 140;
else viewFrame.size.height -= 216; //portrait mode
scrollView.frame = viewFrame;
keyboardVisible = YES; }
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
CGRect viewFrame = scrollView.frame;
if ((interfaceOrientation == UIDeviceOrientationLandscapeRight) || (interfaceOrientation == UIDeviceOrientationLandscapeLeft)) //wants to change to landscape mode
if (keyboardVisible == NO)//currently in portrait,check if keyboard was present
viewFrame.size = CGSizeMake(480,250);
else viewFrame.size = CGSizeMake(480,170);
else {//wants to change to portrait mode
if (keyboardVisible == NO)//currently in landscape,check if keyboard was present
viewFrame.size = CGSizeMake(320,416);
else viewFrame.size = CGSizeMake(320,200);
}
scrollView.frame = viewFrame;
return YES;
}
Fonctionne aussi en mode paysage, mais uniquement pour iphone. Pour iPad, modifiez les paramètres du cadre en conséquence. La méthode textFieldShouldReturn:
fera en sorte que le clavier se cache lorsque vous appuyez sur la touche return. J'espère que cela t'aides...
Le code ci-dessous fonctionne parfaitement pour moi.
[textFieldFocused becomeFirstResponder];
[self.view addSubview:startView];
[textFieldFocused resignFirstResponder];
Cette situation est un peu nulle sur l'iPhone. Ce que vous êtes censé faire est de concevoir votre interface de manière à ce que les champs soient visibles lorsque le clavier apparaît ou de déplacer le champ vers le haut lorsque le clavier apparaît. (Et redescendre quand vous avez terminé)
Je suggère de regarder certaines applications Apple telles que Contacts ou Paramètres pour voir comment elles gèrent cela.
De plus, je suis sûr que l'iPhone HIG a quelque chose à dire à ce sujet.
J'ai cherché d'innombrables réponses à des questions similaires. Pour les applications à écran unique de base, cette solution fonctionne à merveille et est incroyablement simple à mettre en œuvre: https://github.com/michaeltyson/TPKeyboardAvoiding
Certes, il existe des solutions plus élégantes, mais cela permettra d'accomplir le travail rapidement.
Je sais que je suis un peu en retard pour répondre à cette question, mais j'ai trouvé une solution très simple. Si vous utilisez un contrôleur UITableView plutôt qu'un UIViewController contenant un objet tableView, ce problème n'apparaît pas.
Lorsque vous cliquez sur le champ de texte qui se trouve en bas du tableau, le clavier apparaît et l'affichage du tableau défile automatiquement jusqu'à ce que le champ de texte en cours de modification soit visible.
Toutefois, le défilement automatique ne fonctionne pas lorsque nous utilisons le bouton de retour du clavier. Dans ce scénario, faites défiler la table manuellement pour afficher le champ de texte.
J'espère que ça aide
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[self animateTextField:textField up:YES];
}
Veuillez utiliser ce code dans votre fichier controller.m de vue ..Utilisez ce code lorsque vous cliquez sur le champ de texte pour que le clavier apparaisse.
C'est simple comme mettre UITableView en mode édition!
- (void)viewDidLoad {
[super viewDidLoad];
[self.tableView setEditing:YES];
}
Si vous souhaitez masquer une suppression de bulles, à la gauche d'une cellule, implémentez une méthode UITableViewDelegate:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
return NO;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
NSLog(@"%f",textField.frame.Origin.y);
CGPoint scrollPoint = CGPointMake(0, textField.frame.Origin);
[scrollView setContentOffset:scrollPoint animated:YES];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[scrollView setContentOffset:CGPointZero animated:YES];
}