Klaviatura mövcud olduqda UITextField-ə necə hərəkət etmək olar?

İPhone SDK ilə:

UITextFields ilə UIView var, klaviatura çağırır. Bunu bacara bilmək üçün:

  • Klaviatura qaldırıldıqdan sonra digər mətn sahələrini görmək üçün UIScrollView məzmununun kaydırılmasına icazə verin.

  • Avtomatik "jump" (kaydırarak) və ya azaldır

UIScrollView ki, bir UIScrollView lazımdır. Mənim UIView sinifini UIScrollView a UIScrollView , lakin hələ də mətn sahələrini yuxarı və ya aşağıya UIScrollView .

UIView və UIScrollView varmı? Biri içəridə mi var? [EDIT: İndi bir UIScrollView daxilində bir UIView istəyirik və UIScrollView məzmununun UIView çərçivəsində UIView proqramlı olaraq təyin etməkdir.]

Sonra avtomatik olaraq aktiv mətn sahəsinə girməsi üçün nə etmək lazımdır?

İdeal olaraq, komponentlərin bu konfiqurasiyası, mümkün qədər, Interface Builder'da ediləcək. Kodun yalnız nə üçün lazım olduğunu yazmaq istərdim.

Qeyd UIScrollView UIView (və ya UIScrollView ), adi olaraq işləyən bir sekmede ( UITabBar ) göstərilir.


Düzenle: Klaviatura yalnız kaydırma çubuğunu əlavə edirəm. Lazım olmasa da, daha yaxşı bir interfeys təmin etdiyini hiss edirəm, çünki istifadəçi mətn sahələrini hərəkətə keçirə və dəyişə bilər.

Klaviatura yuxarı və aşağı UIScrollView çərçivəsinin ölçüsünü dəyişdiyim bir işim var. Yalnız istifadə edirəm:

 -(void)textFieldDidBeginEditing:(UITextField *)textField { //Keyboard becomes visible scrollView.frame = CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height - 215 + 50); //resize } -(void)textFieldDidEndEditing:(UITextField *)textField { //keyboard will hide scrollView.frame = CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height + 215 - 50); //resize } 

Buna baxmayaraq, mən avtomatik olaraq "yuxarıya doğru" hərəkət edə bilməyəcəyəm və ya görünən ərazidə alt mətn sahələrini mərkəzləşdirmək istəmirəm.

1524
14 июля '09 в 20:06 2009-07-14 20:06 Philfreo tərəfindən təyin 14 İyul '09 saat 20:06 'da 2009-07-14 20:06
@ 87 cavab
  • 1
  • 2
  • 3
  • Artıq tərkibiniz iPhone ekranına uyğun ScrollView , yalnız ScrollView lazımdır. ( ScrollView bir komponent nəzarətçisi kimi əlavə ScrollView , klaviatura qaldırıldıqda TextField ə qədər hərəkət etməli olduqda, lazım deyil.)

  • Klaviaturu gizlətmədən mətn sahələrini göstərmək üçün, standart yol klaviatura göründüyü zaman görünüşü mətn sahələri ilə yuxarı / aşağı hərəkət etməkdir.

Burada nümunə kodu:

 #define kOFFSET_FOR_KEYBOARD 80.0 -(void)keyboardWillShow { // Animate the current view out of the way if (self.view.frame.origin.y >= 0) { [self setViewMovedUp:YES]; } else if (self.view.frame.origin.y < 0) { [self setViewMovedUp:NO]; } } -(void)keyboardWillHide { if (self.view.frame.origin.y >= 0) { [self setViewMovedUp:YES]; } else if (self.view.frame.origin.y < 0) { [self setViewMovedUp:NO]; } } -(void)textFieldDidBeginEditing:(UITextField *)sender { if ([sender isEqual:mailTf]) { //move the main view, so that the keyboard does not hide it. if (self.view.frame.origin.y >= 0) { [self setViewMovedUp:YES]; } } } //method to move the view up/down whenever the keyboard is shown/dismissed -(void)setViewMovedUp:(BOOL)movedUp { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.3]; // if you want to slide up the view CGRect rect = self.view.frame; if (movedUp) { // 1. move the view origin up so that the text field that will be hidden come above the keyboard // 2. increase the size of the view so that the area behind the keyboard is covered up. rect.origin.y -= kOFFSET_FOR_KEYBOARD; rect.size.height += kOFFSET_FOR_KEYBOARD; } else { // revert back to the normal state. rect.origin.y += kOFFSET_FOR_KEYBOARD; rect.size.height -= kOFFSET_FOR_KEYBOARD; } self.view.frame = rect; [UIView commitAnimations]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // register for keyboard notifications [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // unregister for keyboard notifications while not visible. [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; } 
949
14 июля '09 в 21:03 2009-07-14 21:03 Cavab RPDP tərəfindən 14 İyul 09: 09-da saat 21: 37-da verilir

Mən də UIScrollView bir UIScrollView kompozisiyası ilə bir problemi UITextFields , bunlardan biri və ya bir neçəsi onları redaktə edərkən klaviatura ilə bağlanacaq.

UIScrollView düzgün UIScrollView , nəzərə alınacaq bəzi məsələlər.

1) UIScrollView çərçivəsində ölçüsündən daha böyük olduğundan əmin olun. UIScrollViews anlamaq üçün UIScrollViews də müəyyən edilmiş məzmun görünüşünə oxşardır. Buna görə, bir UIScrollView üçün hər hansı bir yerdə kaydırmaq lazımdır, UIScrollView dən daha böyük olmalıdır. Bundan əlavə, contentSize-də müəyyən olunan hər şey artıq görünəndir, çünki kaydırma tələb olunmur. BTW, default contentSize = CGSizeZero .

2) İndi UIScrollView həqiqətən "content" daxil bir pəncərə olduğunu başa düşürük ki, Klaviatura UIScrollView's baxış pəncərəsi gizlətmir təmin etmək yolu UIScrollView's yeniden boyutlandırmaq üçün klaviatura mövcud olduqda, UIScrollView pəncərəsini orijinal UIScrollView frame.size.height ölçüsünə qədər klaviatura hündürlüyü. Bu, pəncərənizin yalnız kiçik görünən sahənin olmasıdır.

3) İşdə tutmaq: İlk CGRect redaktə edilmiş mətn sahəsinin CGRect almaq və UIScrollView's scrollRecToVisible metodunu çağırmaq qərarına gəldim. textFieldDidBeginEditing metoduna zəng ilə UITextFieldDelegate textFieldDidBeginEditing metodunu tətbiq etdim. Bu, həqiqətən, kaydırma UITextField mövqeyə UITextField bir qəribə yan təsirdir. Uzun müddətdir nə olduğunu başa düşmədim. Daha sonra nümayəndə heyətinin textFieldDidBeginEditing metoduna şərh etdim və hamısı işləyir! (???). Bildiyimiz kimi, UIScrollView həqiqətən örtülü olaraq mövcud redaktə edilmiş UITextField -i görünən pəncərə UITextField . UITextFieldDelegate metodunun həyata keçirilməsi və UITextFieldDelegate üçün sonrakı zəng scrollRecToVisible idi və qəribə bir yan təsirə səbəb oldu.

border=0

Beləliklə, klaviatura görünürdə UITextField -da UIScrollView -ə düzgün şəkildə keçmək üçün addımlar verilmişdir.

 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; // register for keyboard notifications [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:self.view.window]; // register for keyboard notifications [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:self.view.window]; keyboardIsShown = NO; //make contentSize bigger than your scrollSize (you will need to figure out for your own use case) CGSize scrollContentSize = CGSizeMake(320, 345); self.scrollView.contentSize = scrollContentSize; } - (void)keyboardWillHide:(NSNotification *)n { NSDictionary* userInfo = [n userInfo]; // get the size of the keyboard CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; // resize the scrollview CGRect viewFrame = self.scrollView.frame; // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView. viewFrame.size.height += (keyboardSize.height - kTabBarHeight); [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [self.scrollView setFrame:viewFrame]; [UIView commitAnimations]; keyboardIsShown = NO; } - (void)keyboardWillShow:(NSNotification *)n { // This is an ivar I'm using to ensure that we do not do the frame size adjustment on the `UIScrollView` if the keyboard is already shown. This can happen if the user, after fixing editing a `UITextField`, scrolls the resized `UIScrollView` to another `UITextField` and attempts to edit the next `UITextField`. If we were to resize the `UIScrollView` again, it would be disastrous. NOTE: The keyboard notification will fire even when the keyboard is already shown. if (keyboardIsShown) { return; } NSDictionary* userInfo = [n userInfo]; // get the size of the keyboard CGSize keyboardSize = [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size; // resize the noteView CGRect viewFrame = self.scrollView.frame; // I'm also subtracting a constant kTabBarHeight because my UIScrollView was offset by the UITabBar so really only the portion of the keyboard that is leftover pass the UITabBar is obscuring my UIScrollView. viewFrame.size.height -= (keyboardSize.height - kTabBarHeight); [UIView beginAnimations:nil context:NULL]; [UIView setAnimationBeginsFromCurrentState:YES]; [self.scrollView setFrame:viewFrame]; [UIView commitAnimations]; keyboardIsShown = YES; } 
  • viewDidLoad üzərindəki klaviatura bildirişlərinə viewDidLoad
  • ViewDidUnload üzərindəki klaviatura görünüşlərini viewDidUnload
  • UIScrollView da viewDidLoad dən daha yaxşı və əmin olun
  • Klaviatura ilə UIScrollView
  • Klaviatura UIScrollView geri gətirin.
  • Klaviatura bildirişləri UITextField nişanı hər dəfə sıxılmış zaman UIScrollView qısaltmalarından qaçınmaq üçün klaviatura mövcud olsa belə bir UITextField göndərildiyi üçün klaviaturanın ekranda göstərildiyini müəyyən etmək üçün UITextField edin

Qeyd edək ki, UIKeyboardWillShowNotification başqa bir UITextField düyməsinə UITextField klaviatura artıq olsa da UITextField . Klaviatura artıq ekranda olduğunda UIScrollView ölçüsünü UIScrollView üçün bu UIScrollView istifadə UIScrollView . UIScrollView klaviatura artıq olduqda səhv yenidən ölçülməsi fəlakət olacaq!

Ümid edirəm ki, bu kod bəzən baş ağrınızdan xilas olacaq.

429
24 апр. Apr 24-də Şiun tərəfindən verilmiş cavab 2010-04-24 11:31 '10 at 11:31 2010-04-24 11:31

Əslində, sənədlərin təqdim etdiyi kimi, Apple tətbiqindən istifadə etmək yaxşıdır. Ancaq verdikləri kod səhvdir. keyboardWasShown: olan hissəni dəyişdirin keyboardWasShown: yalnız aşağıda keyboardWasShown: :

 NSDictionary* info = [aNotification userInfo]; CGRect keyPadFrame=[[UIApplication sharedApplication].keyWindow convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:self.view]; CGSize kbSize =keyPadFrame.size; CGRect activeRect=[self.view convertRect:activeField.frame fromView:activeField.superview]; CGRect aRect = self.view.bounds; aRect.size.height -= (kbSize.height); CGPoint origin = activeRect.origin; origin.y -= backScrollView.contentOffset.y; if (!CGRectContainsPoint(aRect, origin)) { CGPoint scrollPoint = CGPointMake(0.0,CGRectGetMaxY(activeRect)-(aRect.size.height)); [backScrollView setContentOffset:scrollPoint animated:YES]; } 

Apple kodu ilə bağlı problemlər: (1) Onlar hər zaman nöqtənin görünüş çərçivəsindəki olduğunu hesablayırlar, ancaq bir ScrollView , zaten kaydırılabilir və bu ScrollView nəzərə almaq lazımdır:

 origin.y -= scrollView.contentOffset.y 

(2) Onlar contentOffset dəyərini klaviatura hündürlüyünə köçürürlər, əksinə biz istəyirik (biz contentOffset ekranda görünən hündürlüyə deyil, nə olmadıqda dəyişmək istəyirik):

 activeField.frame.origin.y-(aRect.size.height) 
256
29 янв. cavab DK_ 29 yanvar verilir . 2011-01-29 17:56 '11 'də 17:56' də 2011-01-29 17:56

textFieldDidBeginEdittingtextFieldDidEndEditing [self animateTextField:textField up:YES] funksiyasını aşağıdakı kimi [self animateTextField:textField up:YES] :

 -(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 { const int movementDistance = -130; // tweak as needed const float movementDuration = 0.3f; // tweak as needed int movement = (up ? movementDistance : -movementDistance); [UIView beginAnimations: @"animateTextField" context: nil]; [UIView setAnimationBeginsFromCurrentState: YES]; [UIView setAnimationDuration: movementDuration]; self.view.frame = CGRectOffset(self.view.frame, 0, movement); [UIView commitAnimations]; } 

Ümid edirəm ki, bu kod sizə kömək edəcəkdir.

Swift 2-də

 func animateTextField(textField: UITextField, up: Bool) { let movementDistance:CGFloat = -130 let movementDuration: Double = 0.3 var movement:CGFloat = 0 if up { movement = movementDistance } else { movement = -movementDistance } UIView.beginAnimations("animateTextField", context: nil) UIView.setAnimationBeginsFromCurrentState(true) UIView.setAnimationDuration(movementDuration) self.view.frame = CGRectOffset(self.view.frame, 0, movement) UIView.commitAnimations() } func textFieldDidBeginEditing(textField: UITextField) { self.animateTextField(textField, up:true) } func textFieldDidEndEditing(textField: UITextField) { self.animateTextField(textField, up:false) } 

SWIFT 3

  func animateTextField(textField: UITextField, up: Bool) { let movementDistance:CGFloat = -130 let movementDuration: Double = 0.3 var movement:CGFloat = 0 if up { movement = movementDistance } else { movement = -movementDistance } UIView.beginAnimations("animateTextField", context: nil) UIView.setAnimationBeginsFromCurrentState(true) UIView.setAnimationDuration(movementDuration) self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement) UIView.commitAnimations() } func textFieldDidBeginEditing(textField: UITextField) { self.animateTextField(textField: textField, up:true) } func textFieldDidEndEditing(textField: UITextField) { self.animateTextField(textField: textField, up:false) } 
235
02 авг. cavab sumanthkodi 02 aug verilir . 2011-08-02 09:48 '11 'da 9:48' da 2011-08-02 09:48

Yalnız TextFields istifadə:

1a) Interface Builder istifadə: Bütün TextFields seçin => Edit => Embed In => ScrollView

1b) Əl ilə mətn sahələrini scrollView adlı UIScrollViewdə yerləşdirin

2) UITextFieldDelegate

3) hər textField.delegate = self; (və ya Interface Builder əlaqələr qurmaq)

4) Kopyala / Yapıştır:

 - (void)textFieldDidBeginEditing:(UITextField *)textField { CGPoint scrollPoint = CGPointMake(0, textField.frame.origin.y); [scrollView setContentOffset:scrollPoint animated:YES]; } - (void)textFieldDidEndEditing:(UITextField *)textField { [scrollView setContentOffset:CGPointZero animated:YES]; } 
133
01 дек. Cavab DAS 01 dekabr verilir. 2012-12-01 17:53 '12 at 17:53 2012-12-01 17:53

Universal Çözüm üçün . İşdə IQKeyboardManager tətbiqinə mənim yanaşma.

2019

103
17 июля '13 в 21:18 2013-07-17 21:18 İyul ayının 17-də saat 21: 18-də Mohd İftekhar Quraşinin verdiyi cavabı ilə 2013-07-17 21:18

Mən ümumi, açılan UIScrollView , UITableView və hətta UICollectionView bütün mətn sahələrini hərəkət etməyə diqqət göstərən UICollectionView alt sinfi tərtib etdik.

Klaviatura göründüyü zaman, alt sinif, görünüşün göründüğünden əmin olmaq üçün, düzenlenecek alt kassanı bulacak ve çerçeveyi ve içeriği dengelemeyi ayarlayacaktır, klavyenin tooltipine uyğun animasyon ile. Klaviatura yox olduqda, ölçüsünü bərpa edir.

Bir UITableView based interfeysi ilə və ya bir dərslik görünüşü ilə hər hansı quraşdırma ilə UITableView .

Burada: klavyədən mətn sahələrini hərəkət etmək üçün həll

98
12 апр. Cavab Michael Tyson tərəfindən 12 Aprel tarixində verildi 2011-04-12 14:33 '11 at 14:33 2011-04-12 14:33

Swift Proqramçılar üçün:

Bu sizin üçün hər şeyi edər, yalnız onları nəzarətçi sinifinə yerləşdirin və UITextFieldDelegate görünüşünüzü nəzarətçinizə tətbiq edin və textField nümayəndəsini self

 textField.delegate = self // Setting delegate of your UITextField to self 

Məsləhətçinin geri çağırış üsullarını tətbiq et:

 func textFieldDidBeginEditing(textField: UITextField) { animateViewMoving(true, moveValue: 100) } func textFieldDidEndEditing(textField: UITextField) { animateViewMoving(false, moveValue: 100) } // Lifting the view up func animateViewMoving (up:Bool, moveValue :CGFloat){ let movementDuration:NSTimeInterval = 0.3 let movement:CGFloat = ( up ? -moveValue : moveValue) UIView.beginAnimations( "animateView", context: nil) UIView.setAnimationBeginsFromCurrentState(true) UIView.setAnimationDuration(movementDuration ) self.view.frame = CGRectOffset(self.view.frame, 0, movement) UIView.commitAnimations() } 
83
30 апр. Satnam Sync 30 apreldə cavab verdi 2015-04-30 14:21 '15 'da 14:21' de, 2015-04-30 14:21

Şiun dedi: "Göründüyü kimi, UIScrollView həqiqətən örtülü olaraq hazırlanan UITextField-i görünən pəncərə örtük şəkildə çıxardır." Bu, iOS 3.1.3-ə bənzəyir, lakin 3.2, 4.0 və ya 4.1 deyil. İOS> = 3.2-də görünən UITextField etmək üçün açıq bir scrollRectToVisible əlavə etmək məcburiyyətində qaldım.

59
06 нояб. cavab cbranch 06 noyabr. 2010-11-06 08:25 '10 saat 08:25 'da 2010-11-06 08:25

Çox cavablar var, lakin hələ də yuxarıda göstərilən həllərdən heç biri səhv etmədən, "mükəmməl", lazımsız yerləşdirmə, arxa uyğunluq və titrəməsiz animasiya olmadı. (çərçivələri / sərhədləri və məzmunu birləşdirən zaman səhv, interfeysin müxtəlif istiqamətləri, iPad klaviaturası ilə klaviatura, ...)
Qərarımı bölüşüm:
( UIKeyboardWill(Show|Hide)Notification )

 // Called when UIKeyboardWillShowNotification is sent - (void)keyboardWillShow:(NSNotification*)notification { // if we have no view or are not visible in any window, we don't care if (!self.isViewLoaded || !self.view.window) { return; } NSDictionary *userInfo = [notification userInfo]; CGRect keyboardFrameInWindow; [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue: // the keyboard frame is specified in window-level coordinates. this calculates the frame as if it were a subview of our view, making it a sibling of the scroll view CGRect keyboardFrameInView = [self.view convertRect:keyboardFrameInWindow fromView:nil]; CGRect scrollViewKeyboardIntersection = CGRectIntersection(_scrollView.frame, keyboardFrameInView); UIEdgeInsets newContentInsets = UIEdgeInsetsMake(0, 0, scrollViewKeyboardIntersection.size.height, 0); // this is an old animation method, but the only one that retains compaitiblity between parameters (duration, curve) and the values contained in the userInfo-Dictionary. [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; _scrollView.contentInset = newContentInsets; _scrollView.scrollIndicatorInsets = newContentInsets;  if (_focusedControl) { CGRect controlFrameInScrollView = [_scrollView convertRect:_focusedControl.bounds fromView:_focusedControl]; // if the control is a deep in the hierarchy below the scroll view, this will calculate the frame as if it were a direct subview controlFrameInScrollView = CGRectInset(controlFrameInScrollView, 0, -10); // replace 10 with any nice visual offset between control and keyboard or control and top of the scroll view. CGFloat controlVisualOffsetToTopOfScrollview = controlFrameInScrollView.origin.y - _scrollView.contentOffset.y; CGFloat controlVisualBottom = controlVisualOffsetToTopOfScrollview + controlFrameInScrollView.size.height; // this is the visible part of the scroll view that is not hidden by the keyboard CGFloat scrollViewVisibleHeight = _scrollView.frame.size.height - scrollViewKeyboardIntersection.size.height; if (controlVisualBottom > scrollViewVisibleHeight) { // check if the keyboard will hide the control in question // scroll up until the control is in place CGPoint newContentOffset = _scrollView.contentOffset; newContentOffset.y += (controlVisualBottom - scrollViewVisibleHeight); // make sure we don't set an impossible offset caused by the "nice visual offset" // if a control is at the bottom of the scroll view, it will end up just above the keyboard to eliminate scrolling inconsistencies newContentOffset.y = MIN(newContentOffset.y, _scrollView.contentSize.height - scrollViewVisibleHeight); [_scrollView setContentOffset:newContentOffset animated:NO]; // animated:NO because we have created our own animation context around this code } else if (controlFrameInScrollView.origin.y < _scrollView.contentOffset.y) { // if the control is not fully visible, make it so (useful if the user taps on a partially visible input field CGPoint newContentOffset = _scrollView.contentOffset; newContentOffset.y = controlFrameInScrollView.origin.y; [_scrollView setContentOffset:newContentOffset animated:NO]; // animated:NO because we have created our own animation context around this code } } [UIView commitAnimations]; } // Called when the UIKeyboardWillHideNotification is sent - (void)keyboardWillHide:(NSNotification*)notification { // if we have no view or are not visible in any window, we don't care if (!self.isViewLoaded || !self.view.window) { return; } NSDictionary *userInfo = notification.userInfo; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:[[userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; [UIView setAnimationCurve:[[userInfo valueForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; // undo all that keyboardWillShow-magic // the scroll view will adjust its contentOffset apropriately _scrollView.contentInset = UIEdgeInsetsZero; _scrollView.scrollIndicatorInsets = UIEdgeInsetsZero; [UIView commitAnimations]; } 
59
01 марта '13 в 22:41 2013-03-01 22:41 Cavab Martin Ullrich tərəfindən martın 01-də saat 22: 41-də verilir. 2013-03-01 22:41

Bu sənəd bu problemin həllini təsvir edir. "Klaviatura altında məzmunun hərəkət edilməsi" bölməsində mənbə koduna baxın. Çox sadədir.

EDIT: Bu nümunədə bir qəza gözə çarpır. UIKeyboardWillHideNotification yerinə UIKeyboardDidHideNotification . Əks halda klaviatura arxasında hərəkət etmək klaviatura animasiyanı bağlayarkən kəsiləcək.

43
28 окт. 28 oktyabrda Mihay Damianın cavabı. 2010-10-28 15:37 '10 at 15:37 2010-10-28 15:37

Heç UITextField istifadə etmək istəyirsinizsə, UITextField bilərsiniz. Mən həqiqətən UITextFields xaricində UITextFields istifadə edən yaxşı hazırlanmış iPhone tətbiqlərinə rast UITableViewCells .

Это будет какая-то дополнительная работа, но я рекомендую вам реализовать все представления ввода данных в виде таблиц. Добавьте UITextView к вашему UITableViewCells .

42
ответ дан Jonathan Sterling 20 июля '09 в 11:18 2009-07-20 11:18

Самое быстрое найденное решение

 - (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 { const int movementDistance = 80; // tweak as needed const float movementDuration = 0.3f; // tweak as needed int movement = (up ? -movementDistance : movementDistance); [UIView beginAnimations: @"anim" context: nil]; [UIView setAnimationBeginsFromCurrentState: YES]; [UIView setAnimationDuration: movementDuration]; self.view.frame = CGRectOffset(self.view.frame, 0, movement); [UIView commitAnimations]; } 
30
ответ дан Nepster 25 окт. '14 в 14:10 2014-10-25 14:10

Небольшое исправление, которое работает для многих UITextFields

 #pragma mark UIKeyboard handling #define kMin 150 -(void)textFieldDidBeginEditing:(UITextField *)sender { if (currTextField) { [currTextField release]; } currTextField = [sender retain]; //move the main view, so that the keyboard does not hide it. if (self.view.frame.origin.y + currTextField.frame.origin. y >= kMin) { [self setViewMovedUp:YES]; } } //method to move the view up/down whenever the keyboard is shown/dismissed -(void)setViewMovedUp:(BOOL)movedUp { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.3]; // if you want to slide up the view CGRect rect = self.view.frame; if (movedUp) { // 1. move the view origin up so that the text field that will be hidden come above the keyboard // 2. increase the size of the view so that the area behind the keyboard is covered up. rect.origin.y = kMin - currTextField.frame.origin.y ; } else { // revert back to the normal state. rect.origin.y = 0; } self.view.frame = rect; [UIView commitAnimations]; } - (void)keyboardWillShow:(NSNotification *)notif { //keyboard will be shown now. depending for which textfield is active, move up or move down the view appropriately if ([currTextField isFirstResponder]  currTextField.frame.origin.y + self.view.frame.origin.y >= kMin) { [self setViewMovedUp:YES]; } else if (![currTextField isFirstResponder]  currTextField.frame.origin.y + self.view.frame.origin.y < kMin) { [self setViewMovedUp:NO]; } } - (void)keyboardWillHide:(NSNotification *)notif { //keyboard will be shown now. depending for which textfield is active, move up or move down the view appropriately if (self.view.frame.origin.y < 0 ) { [self setViewMovedUp:NO]; } } - (void)viewWillAppear:(BOOL)animated { // register for keyboard notifications [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:self.view.window]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:self.view.window]; } - (void)viewWillDisappear:(BOOL)animated { // unregister for keyboard notifications while not visible. [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; } 
29
ответ дан tt.Kilew 11 февр. '10 в 14:18 2010-02-11 14:18

Код RPDP успешно перемещает текстовое поле с клавиатуры. Но когда вы переходите к вершине после использования и отклонения клавиатуры, верхняя часть прокручивается вверх из представления. Это верно для симулятора и устройства. Чтобы прочитать содержимое в верхней части этого представления, нужно перезагрузить представление.

Разве его следующий код не должен возвращать представление?

 else { // revert back to the normal state. rect.origin.y += kOFFSET_FOR_KEYBOARD; rect.size.height -= kOFFSET_FOR_KEYBOARD; } 
26
ответ дан Steve 05 февр. '10 в 21:27 2010-02-05 21:27

Я не уверен, что если переместить представление вверх, это правильный подход, я сделал это другим способом, изменив размер UIScrollView. Я подробно объяснил это в небольшом статье

21
ответ дан Jose Muanis 10 янв. '10 в 17:38 2010-01-10 17:38

Чтобы вернуться в исходное состояние просмотра, добавьте:

 -(void)textFieldDidEndEditing:(UITextField *)sender { //move the main view, so that the keyboard does not hide it. if (self.view.frame.origin.y < 0) { [self setViewMovedUp:NO]; } } 
19
ответ дан Nicolas Marchand 10 февр. '10 в 19:30 2010-02-10 19:30

Там так много решений, но я потратил несколько часов до начала работы. Итак, я помещаю этот код здесь (просто вставьте его в проект, никаких изменений не нужно):

 @interface RegistrationViewController : UIViewController <UITextFieldDelegate>{ UITextField* activeField; UIScrollView *scrollView; } @end - (void)viewDidLoad { [super viewDidLoad]; scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame]; //scrool view must be under main view - swap it UIView* natView = self.view; [self setView:scrollView]; [self.view addSubview:natView]; CGSize scrollViewContentSize = self.view.frame.size; [scrollView setContentSize:scrollViewContentSize]; [self registerForKeyboardNotifications]; } - (void)viewDidUnload { activeField = nil; scrollView = nil; [self unregisterForKeyboardNotifications]; [super viewDidUnload]; } - (void)registerForKeyboardNotifications { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShown:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil]; } -(void)unregisterForKeyboardNotifications { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; // unregister for keyboard notifications while not visible. [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; } - (void)keyboardWillShown:(NSNotification*)aNotification { NSDictionary* info = [aNotification userInfo]; CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; CGRect frame = self.view.frame; frame.size.height -= kbSize.height; CGPoint fOrigin = activeField.frame.origin; fOrigin.y -= scrollView.contentOffset.y; fOrigin.y += activeField.frame.size.height; if (!CGRectContainsPoint(frame, fOrigin) ) { CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y + activeField.frame.size.height - frame.size.height); [scrollView setContentOffset:scrollPoint animated:YES]; } } - (void)keyboardWillBeHidden:(NSNotification*)aNotification { [scrollView setContentOffset:CGPointZero animated:YES]; } - (void)textFieldDidBeginEditing:(UITextField *)textField { activeField = textField; } - (void)textFieldDidEndEditing:(UITextField *)textField { activeField = nil; } -(BOOL) textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } 

PS: Я надеюсь, что код поможет кому-то сделать желаемый эффект быстро. (Xcode 4.5)

18
ответ дан HotJard 12 окт. '12 в 12:14 2012-10-12 12:14

попробуйте этот короткий трюк...

  - (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 { const int movementDistance = textField.frame.origin.y / 2; // tweak as needed const float movementDuration = 0.3f; // tweak as needed int movement = (up ? -movementDistance : movementDistance); [UIView beginAnimations: @"anim" context: nil]; [UIView setAnimationBeginsFromCurrentState: YES]; [UIView setAnimationDuration: movementDuration]; self.view.frame = CGRectOffset(self.view.frame, 0, movement); [UIView commitAnimations]; } 

Счастливое кодирование:)....

17
ответ дан Sourabh Sharma 11 мая '15 в 16:32 2015-05-11 16:32

@user271753

Чтобы вернуться к исходному, добавьте:

 -(BOOL)textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; [self setViewMovedUp:NO]; return YES; } 
17
ответ дан user436179 29 окт. '10 в 11:32 2010-10-29 11:32

Для перемещения рамки просмотра не требуется просмотр прокрутки. Вы можете изменить рамку представления viewcontroller's , чтобы весь вид перемещался настолько, чтобы помещать текстовое поле firstresponder над клавиатурой. Когда я столкнулся с этой проблемой, я создал подкласс UIViewController , который делает это. Он замечает, что на клавиатуре появится уведомление и обнаружит первый ответчик subview и (при необходимости) он оживляет основной вид вверх настолько, чтобы первый ответчик находился выше клавиатуры. Когда клавиатура скрывается, она оживляет вид назад, где он был.

Чтобы использовать этот подкласс, сделайте свой пользовательский контроллер представлений подклассом GMKeyboardVC и он наследует эту функцию (просто убедитесь, что вы реализуете viewWillAppear и viewWillDisappear они должны вызвать супер). Класс находится на github .

15
ответ дан progrmr 10 сент. '11 в 17:43 2011-09-10 17:43

В соответствии с документами , начиная с iOS 3.0, класс UITableViewController автоматически изменяет размеры и перетаскивает его представление таблицы при редактировании текстовых полей. Я думаю, этого недостаточно, чтобы помещать текстовое поле внутри UITableViewCell , как указывали некоторые.

Sənədlərdən :

Контроллер табличного представления поддерживает встроенное редактирование строк таблицы таблиц; если, например, строки имеют встроенные текстовые поля в режиме редактирования, это прокручивает строку, редактируемую над виртуальной клавиатурой, которая отображается.

12
ответ дан Dheeraj VS 04 окт. '12 в 5:44 2012-10-04 05:44

Здесь я нашел простейшее решение для обработки клавиатуры.

Вам нужно просто скопировать-вставить ниже пример кода и изменить текстовое поле или любое представление, которое вы хотите переместить вверх.

Шаг-1

Просто скопируйте пасту ниже двух методов в вашем контроллере

 - (void)registerForKeyboardNotifications { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil]; } - (void)deregisterFromKeyboardNotifications { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; } 

Шаг-2

зарегистрировать и отменить регистрацию уведомлений о клавиатуре в viewWillAppear и viewWillDisappear соответственно.

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self registerForKeyboardNotifications]; } - (void)viewWillDisappear:(BOOL)animated { [self deregisterFromKeyboardNotifications]; [super viewWillDisappear:animated]; } 

Шаг-3

Здесь приходит душа, просто замените текстовое поле и измените высоту, сколько вы хотите двигаться вверх.

 - (void)keyboardWasShown:(NSNotification *)notification { NSDictionary* info = [notification userInfo]; CGSize currentKeyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; //you need replace your textfield instance here CGPoint textFieldOrigin = self.tokenForPlaceField.frame.origin; CGFloat textFieldHeight = self.tokenForPlaceField.frame.size.height; CGRect visibleRect = self.view.frame; visibleRect.size.height -= currentKeyboardSize.height; if (!CGRectContainsPoint(visibleRect, textFieldOrigin)) { //you can add yor desired height how much you want move keypad up, by replacing "textFieldHeight" below CGPoint scrollPoint = CGPointMake(0.0, textFieldOrigin.y - visibleRect.size.height + textFieldHeight); //replace textFieldHeight to currentKeyboardSize.height, if you want to move up with more height [self.scrollView setContentOffset:scrollPoint animated:YES]; } } - (void)keyboardWillBeHidden:(NSNotification *)notification { [self.scrollView setContentOffset:CGPointZero animated:YES]; } 

Ссылка : хорошо, Пожалуйста, оцените этот парень , который поделился этим красивым отрывом кода, чистым решением.

Надеюсь, это было бы очень полезно кому-то там.

11
ответ дан swiftBoy 19 авг. '15 в 20:45 2015-08-19 20:45

Вот решение для взлома, которое я разработал для конкретного макета. Это решение похоже на решение Мэтта Галлахера, в котором прокручивается секция. Я до сих пор не знаком с разработкой iPhone и не знаю, как работают макеты. Таким образом, этот хак.

Моя реализация необходима для поддержки прокрутки при нажатии в поле, а также прокрутки, когда пользователь выбирает следующий на клавиатуре.

У меня был UIView с высотой 775. Элементы управления распределены в основном группами по 3 на большом пространстве. Я закончил со следующей версией IB.

 UIView -> UIScrollView -> [UI Components] 

Вот взлом

Я установил высоту UIScrollView на 500 единиц больше, чем фактический макет (1250). Затем я создал массив с абсолютными позициями, которые мне нужно прокрутить, и простую функцию для их получения на основе номера метки IB.

 static NSInteger stepRange[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 140, 140, 140, 140, 410 }; NSInteger getScrollPos(NSInteger i) { if (i < TXT_FIELD_INDEX_MIN || i > TXT_FIELD_INDEX_MAX) { return 0 ; return stepRange[i] ; } 

Теперь все, что вам нужно сделать, это использовать следующие две строки кода в textFieldDidBeginEditing и textFieldShouldReturn (последний, если вы создаете следующую навигацию по полю)

 CGPoint point = CGPointMake(0, getScrollPos(textField.tag)) ; [self.scrollView setContentOffset:point animated:YES] ; 

Məsələn:

 - (void) textFieldDidBeginEditing:(UITextField *)textField { CGPoint point = CGPointMake(0, getScrollPos(textField.tag)) ; [self.scrollView setContentOffset:point animated:YES] ; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { NSInteger nextTag = textField.tag + 1; UIResponder* nextResponder = [textField.superview viewWithTag:nextTag]; if (nextResponder) { [nextResponder becomeFirstResponder]; CGPoint point = CGPointMake(0, getScrollPos(nextTag)) ; [self.scrollView setContentOffset:point animated:YES] ; } else{ [textField resignFirstResponder]; } return YES ; } 

Этот метод не выполняет "прокрутку назад", как это делают другие методы. Это не было требованием. Снова это было для довольно "высокого" UIView, и у меня не было дней, чтобы изучить внутренние механизмы компоновки.

11
ответ дан Steve McFarlin 29 марта '10 в 0:24 2010-03-29 00:24

Поиск хорошего учебника для новичков по теме, нашел лучший учебник здесь .

В примере MIScrollView.h внизу учебника обязательно поставьте пробел в

 @property (nonatomic, retain) id backgroundTapDelegate; 

как вы видите.

9
ответ дан savagenoob 01 янв. '12 в 22:23 2012-01-01 22:23

Используйте эту третью сторону, вам не нужно писать даже одну строку

https://github.com/hackiftekhar/IQKeyboardManager

загрузить проект и перетащить IQKeyboardManager в ваш проект. Если вы обнаружили какую-либо проблему, прочитайте документ README.

Ребята действительно снимают головную боль, чтобы управлять клавиатурой.

Спасибо и удачи!

9
ответ дан Arvind Kumar 12 окт. '15 в 12:43 2015-10-12 12:43

Когда UITextField находится в UITableViewCell , прокрутка должна автоматически настраиваться.

Если это не так, возможно, из-за неправильного кода/настройки таблицы.

Например, когда я перезагрузил свой длинный стол одним UITextField внизу следующим образом,

 -(void) viewWillAppear:(BOOL)animated { [self.tableview reloadData]; } 

тогда мое текстовое поле внизу было закрыто клавиатурой, которая появилась, когда я щелкнул внутри текстового поля.

Чтобы исправить это, я должен был сделать это -

 -(void) viewWillAppear:(BOOL)animated { //add the following line to fix issue [super viewWillAppear:animated]; [self.tableview reloadData]; } 
9
ответ дан lakersgonna3peat 09 марта '11 в 4:06 2011-03-09 04:06

Примечание : этот ответ предполагает, что ваш textField находится в scrollView.

Я предпочитаю иметь дело с этим, используя scrollContentInset и scrollContentOffset вместо того, чтобы возиться с рамками моего представления.

Сначала давайте прослушать уведомления о клавиатуре

 //call this from viewWillAppear -(void)addKeyboardNotifications { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; } //call this from viewWillDisappear -(void)removeKeyboardNotifications{ [[NSNotificationCenter default Center] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; } 

Следующий шаг - сохранить свойство, которое представляет текущий первый ответчик (UITextfield/UITextVIew, который в настоящее время имеет клавиатуру).

Мы используем методы делегата для установки этого свойства. Если вы используете другой компонент, вам понадобится нечто подобное.

Обратите внимание, что для текстового поля мы устанавливаем его в файле doBeginEditing и для textView в shouldBeginEditing. Это связано с тем, что textViewDidBeginEditing вызывается после UIKeyboardWillShowNotification по какой-то причине.

 -(BOOL)textViewShouldBeginEditing:(UITextView * )textView{ self.currentFirstResponder = textView; return YES; } -(void)textFieldDidBeginEditing:(UITextField *)textField{ self.currentFirstResponder = textField; } 

Наконец, здесь волшебство

 - (void)keyboardWillShow:(NSNotification*)aNotification{ NSDictionary* info = [aNotification userInfo]; CGRect kbFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];  if(self.currentFirstResponder){ //keyboard origin in currentFirstResponderFrame CGPoint keyboardOrigin = [self.currentFirstResponder convertPoint:kbFrame.origin fromView:nil]; float spaceBetweenFirstResponderAndKeyboard = abs(self.currentFirstResponder.frame.size.height-keyboardOrigin.y); //only scroll the scrollview if keyboard overlays the first responder if(spaceBetweenFirstResponderAndKeyboard>0){ //if i call setContentOffset:animate:YES it behaves differently, not sure why [UIView animateWithDuration:0.25 animations:^{ [self.scrollView setContentOffset:CGPointMake(0,self.scrollView.contentOffset.y+spaceBetweenFirstResponderAndKeyboard)]; }]; } } //set bottom inset to the keyboard height so you can still scroll the whole content UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.height, 0.0); _scrollView.contentInset = contentInsets; _scrollView.scrollIndicatorInsets = contentInsets; } - (void)keyboardWillHide:(NSNotification*)aNotification{ UIEdgeInsets contentInsets = UIEdgeInsetsZero; _scrollView.contentInset = contentInsets; _scrollView.scrollIndicatorInsets = contentInsets; } 
7
ответ дан Juraj Petrik 02 июля '14 в 23:06 2014-07-02 23:06

Aşağıdakıları cəhd edin:

 -(void)textFieldDidBeginEditing:(UITextField *)sender { if ([sender isEqual:self.m_Sp_Contact]) { [self.m_Scroller setContentOffset:CGPointMake(0, 105)animated:YES]; } } 
7
ответ дан user1105624 20 июля '12 в 10:34 2012-07-20 10:34

Swift 2.0:

Добавьте UIScrollView и добавьте textFields вверху. Сделайте ссылки на раскадровку на VC.

 @IBOutlet weak var username: UITextField! @IBOutlet weak var password: UITextField! @IBOutlet weak var scrollView: UIScrollView! 

Добавьте следующие методы: UITextFieldDelegate и UIScrollViewDelegate.

 //MARK:- TEXTFIELD METHODS func textFieldShouldReturn(textField: UITextField) -> Bool { if(username.returnKeyType == UIReturnKeyType.Default) { password.becomeFirstResponder() } textField.resignFirstResponder() return true } func textFieldDidBeginEditing(textField: UITextField) { dispatch_async(dispatch_get_main_queue()) { let scrollPoint:CGPoint = CGPointMake(0,textField.frame.origin.y/4) self.scrollView!.setContentOffset(scrollPoint, animated: true); } } func textFieldShouldEndEditing(textField: UITextField) -> Bool { dispatch_async(dispatch_get_main_queue()) { UIView.animateWithDuration(0, animations: { self.scrollView!.setContentOffset(CGPointZero,animated: true) }) } return true } override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { self.view.endEditing(true) } func scrollViewWillBeginDragging(scrollView: UIScrollView) { self.scrollView.scrollEnabled = true dispatch_async(dispatch_get_main_queue()) { UIView.animateWithDuration(0, animations: { self.scrollView!.setContentOffset(CGPointZero,animated: true) }) } } 
7
ответ дан Alvin George 16 февр. '16 в 11:58 2016-02-16 11:58
  • 1
  • 2
  • 3

Другие вопросы по меткам или Задайте вопрос