යතුරු පුවරුව පවතින විට - සංස්කරණය කිරීමට පටන් ගත් විට, UITextField ඉහළට ගෙන යන්නේ කෙසේද?


1699

IOS SDK සමඟ:

මට යතුරු පුවරුවක් ගෙන එන s UIViewසමඟ UITextFields ඇත. මට එය කළ හැකි වීමට අවශ්‍යයි:

  1. UIScrollViewයතුරුපුවරුව ගෙන ආ පසු අනෙක් පෙළ ක්ෂේත්‍ර බැලීමට අන්තර්ගතය අනුචලනය කිරීමට ඉඩ දෙන්න

  2. ස්වයංක්‍රීයව "පනින්න" (ඉහළට අනුචලනය කිරීමෙන්) හෝ කෙටි කිරීම

මට අවශ්‍ය බව මම දනිමි UIScrollView. මම මගේ පන්තිය UIViewa ට වෙනස් කිරීමට උත්සාහ කළ UIScrollViewනමුත් මට තවමත් පෙළ කොටු ඉහළට හෝ පහළට අනුචලනය කළ නොහැක.

මට a UIViewසහ a යන දෙකම UIScrollViewඅවශ්‍යද? එකක් අනෙකා ඇතුළට යනවාද?

සක්‍රිය පෙළ ක්ෂේත්‍රයට ස්වයංක්‍රීයව අනුචලනය වීමට ක්‍රියාත්මක කළ යුත්තේ කුමක්ද?

හැකිතාක් දුරට සංරචක සැකසීම අතුරු මුහුණත් සාදන්නා තුළ සිදු කරනු ඇත. මම කැමතියි කේත ලිවීමට අවශ්‍ය දේ සඳහා පමණි.

සටහන: මා සමඟ වැඩ කරන UIView(හෝ UIScrollView) UITabBarසාමාන්‍ය පරිදි ක්‍රියා කිරීමට අවශ්‍ය ටැබර් ( ) මඟින් ගෙන එනු ලැබේ .


සංස්කරණය කරන්න: යතුරුපුවරුව පැමිණෙන විට මම අනුචලන තීරුව එක් කරමි. එය අවශ්‍ය නොවුවද, එය වඩා හොඳ අතුරු මුහුණතක් සපයන බවක් මට හැඟේ, මන්ද එවිට පරිශීලකයාට පෙළ කොටු අනුචලනය කර වෙනස් කළ හැකිය.

UIScrollViewයතුරුපුවරුව ඉහළට සහ පහළට යන විට රාමු ප්‍රමාණය වෙනස් කරන තැන මම එය ක්‍රියාත්මක කර ඇත්තෙමි . මම සරලවම භාවිතා කරන්නේ:

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

කෙසේ වෙතත්, මෙය ස්වයංක්‍රීයව "ඉහළට" හෝ දෘශ්‍ය ප්‍රදේශයේ පහළ පෙළ ක්ෂේත්‍ර කේන්ද්‍රගත නොකරයි, එයයි මම ඇත්තටම කැමති.


6
මෙය පරීක්ෂා කරන්න. ඔබට කරදරයක් නැත.TPKeyboardAvoiding
අරුණ

21
: It's ඇපල්, මම එය හොඳම ක්රමය කියලා, විසින් ලේඛනගත කර developer.apple.com/library/ios/#documentation/StringsTextFonts/...
Maik639

58
මෙම කේතය භාවිතා කරන්න. ඔබට appdelegate.m ගොනුවේ පේළි 1 ක් අවශ්‍ය වන අතර එය ක්‍රියාත්මක වේ. github.com/hackiftekhar/IQKeyboardManager
ප්‍රදීප් මිට්ටල්

9
මෙතෙක් මා සොයාගත් හොඳම ක්‍රමය මෙම විවෘත මූලාශ්‍රය වන TPKeyboardAvoiding ය
Mongi Zaidi

2
තවත් ක්‍රමයක් නම්, එවැනි අන්තර්ගත පෙළ ක්ෂේත්‍ර සහ සියල්ලම TableViewController හි එකතු කර වගු දර්ශනයට මෙය හැසිරවීමට ඉඩ දීමයි.
විකී දාස්

Answers:


1040
  1. ඔබට අවශ්‍ය ScrollViewවන්නේ ඔබ සතුව ඇති අන්තර්ගතය අයිෆෝන් තිරයට නොගැලපේ නම් පමණි . (ඔබ එකතු කරන්නේ නම්ScrollViewTextField යතුරුපුවරුව පැමිණෙන විට අනුචලනය කිරීම සඳහා ඔබ සංරචකවල අධීක්ෂණය ලෙස නම් එය අවශ්‍ය නොවේ.)

  2. වැළැක්වීම සඳහා සම්මත ක්‍රමය TextFieldයතුරුපුවරුව ආවරණය නම් යතුරුපුවරුව පෙන්වන සෑම අවස්ථාවකම දර්ශනය ඉහළට / පහළට ගෙන යාමයි.

මෙන්න නියැදි කේත කිහිපයක්:

#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's 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];
}

3
_TxtField යනු කුමක්ද? මම එය මගේ කේතයට පිටපත් කළෙමි, එය පවසන්නේ _textField ප්‍රකාශයට පත් කර නොමැති බවයි.
කොකෝවා දේව්

"පරිශීලකයා මෙහි සංස්කරණය කරන විට දර්ශනය ඉහළට යා යුතුය" හෝ එසේ පැවසීමට ඔබ භාවිතා කරන ක්ෂේත්‍රය එයයි ... කෙසේ වෙතත් ඔබට තවත් ක්ෂේත්‍ර තිබේ නම් එය ඉවත් කළ හැකිය.
පැට්රික්

ඇමතීම එතරම් සුදුසු නොවේද - (අවලංගු) setViewMovedUp: (BOOL) keyBoardWillSHow සහ KeyBoardWillHide සිදුවීම් වල චලනය
අබ්දුලියම් රෙහ්මනියස්

4
ඔබ ප්‍රධාන දර්ශනයේ භ්‍රමණයන් සඳහා සහය දක්වන්නේ නම් විශේෂයෙන් ප්‍රයෝජනවත් නොවේ.
ෆ්‍රැක්ටල් ඩොක්ටර්

2
මෙම කාර්යය කිරීමට මට textFieldDidBeginEditingකොටසේ අදහස් දැක්වීමට සිදු විය .
avance

446

UIScrollViewබහුවිධ රචනා කිරීම සම්බන්ධයෙන් මට ද බොහෝ ගැටලු ඇති අතර UITextFields, ඒවායින් එකක් හෝ කිහිපයක් යතුරු පුවරුව සංස්කරණය කරන විට අපැහැදිලි වනු ඇත.

ඔබ UIScrollViewනිසි ලෙස අනුචලනය නොකරන්නේ නම් සලකා බැලිය යුතු කරුණු කිහිපයක් මෙන්න .

1) ඔබේ අන්තර්ගත UIScrollViewප්‍රමාණය රාමු ප්‍රමාණයට වඩා වැඩි බව සහතික කරන්න . තේරුම් ගත හැකි ක්‍රමය UIScrollViewsනම් UIScrollViewඑය අන්තර්ගතයේ අර්ථ දක්වා ඇති අන්තර්ගතය බැලීමේ කවුළුවක් වැනිය. එබැවින් UIScrollviewඕනෑම තැනක අනුචලනය කිරීමට නම්, අන්තර්ගත ප්‍රමාණය ප්‍රමාණයට වඩා වැඩි විය යුතුය UIScrollView. වෙනත්, අන්තර්ගතයේ අර්ථ දක්වා ඇති සියල්ල දැනටමත් දැකිය හැකි බැවින් අනුචලනය අවශ්‍ය නොවේ. BTW, පෙරනිමි contentSize = CGSizeZero.

2) UIScrollViewඑය ඇත්ත වශයෙන්ම ඔබේ "අන්තර්ගතයට" කවුළුවක් බව දැන් ඔබට වැටහී ඇති අතර , යතුරුපුවරුව ඔබේ UIScrollView'sනැරඹුම් "කවුළුව" අපැහැදිලි නොවන බව සහතික කිරීමේ ක්‍රමය වනුයේ UIScrollViewයතුරුපුවරුව පවතින විට ඔබට UIScrollViewකවුළුව තිබේ. UIScrollViewයතුරු පුවරුවේ උස us ණ ලෙස මුල් රාමුවට ප්‍රමාණවත් වේ . මෙය ඔබගේ කවුළුව නැරඹිය හැකි කුඩා ප්‍රදේශයක් පමණක් බව සහතික කරයි.

3) මෙන්න අල්ලා ගැනීම: මම මෙය ප්‍රථම වරට ක්‍රියාවට නංවන විට මා CGRectසිතුවේ සංස්කරණය කරන ලද පෙළ ක්ෂේත්‍රය ලබා ගත යුතු අතර UIScrollView'sscrollRecToVisible ක්‍රමය අමතන්න . මම UITextFieldDelegateක්‍රමයට textFieldDidBeginEditingඇමතුම සමඟ ක්‍රමය ක්‍රියාත්මක කළෙමි scrollRecToVisible. මෙම ඇත්තටම අනුචලනය බව අමුතු පස ක්රියාත්මක වන පරිදි වැඩ තැත්කලද මෙම UITextFieldතත්වයට. දීර් what කාලයක් තිස්සේ එය කුමක්දැයි මට සිතාගත නොහැකි විය. ඊට පස්සේ මම textFieldDidBeginEditingනියෝජිත ක්‍රමය ගැන අදහස් දැක්වුවා , ඒ සියල්ල ක්‍රියාත්මක වේ !! (???). එය වෙනස් වූ විට, UIScrollViewඇත්ත වශයෙන්ම ව්‍යංගයෙන් දැනට සංස්කරණය UITextFieldකර ඇති දෘශ්‍යමාන කවුළුව තුළට ව්‍යංගයෙන් ගෙන එනු ඇතැයි මම විශ්වාස කරමි . මම UITextFieldDelegateක්රමය ක්රියාත්මක කිරීම සහ පසුව ඇමතුමscrollRecToVisible අතිරික්ත වූ අතර අමුතු අතුරු ආබාධයට හේතුව එය විය.

ඒ නිසා මෙහි නිසි ඔබේ අනුචලනය කිරීමට අදාල පියවර පහත දැක්වේ UITextFieldදී UIScrollViewවිට යතුරු පුවරුව දිස් තැනට.

// 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;
}
  1. යතුරුපුවරු දැනුම්දීම් සඳහා ලියාපදිංචි වන්න viewDidLoad
  2. යතුරුපුවරු නවීකරණ සඳහා ලියාපදිංචි නොවන්න viewDidUnload
  3. වන බව සහතික contentSizeඔබගේ වඩා කට්ටලයක් හා වැඩි UIScrollViewදීviewDidLoad
  4. UIScrollViewයතුරුපුවරුව ඇති විට එය හැකිලෙන්න
  5. UIScrollViewයතුරුපුවරුව නැති වූ විට ආපසු හරවන්න .
  6. යතුරු පුවරුව දැනුම්දීම් එක් එක් කාල යවා ඇති නිසා යතුරු පුවරුව දැනටමත් තිරය මත පෙන්වා ඇත නම් අනාවරණය කිරීමට ivar භාවිතා UITextFieldයතුරු පුවරුව වළක්වා ගැනීමට මේවන විටත් පවා නම් පටිතිගත ඇත ක්රමයෙන් පිරිහෙමින් ඇති UIScrollViewඑය දැනටමත් වූ විට හැකිළී

සැලකිල්ලට ගත යුතු එක් දෙයක් නම්, UIKeyboardWillShowNotificationඔබ යතුරු පුවරුව දැනටමත් තිරය මත තිබියදීත්, ඔබ තවත් එකක් පටිගත කරන විට පවා වෙඩි තැබීමයි UITextField. UIScrollViewයතුරුපුවරුව දැනටමත් තිරය මත ඇති විට ප්‍රමාණය වෙනස් කිරීම වළක්වා ගැනීම සඳහා අයිවර් භාවිතා කිරීමෙන් මම මේ ගැන සැලකිලිමත් වීමි . UIScrollViewයතුරුපුවරුව දැනටමත් ඇති විට නොදැනුවත්වම ප්‍රමාණය වෙනස් කිරීම විනාශකාරී වනු ඇත!

මෙම කේතය ඔබගෙන් සමහරෙකුට විශාල හිසරදයක් ඉතිරි කරයි යැයි සිතමි.


3
නියමයි, නමුත් ගැටළු දෙකක්: 1. UIKeyboardBoundsUserInfoKeyඅතහැර දමා ඇත. 2. යතුරුපුවරුවේ ප්‍රමාණය "තිර ඛණ්ඩාංක" තුළ ඇත, එබැවින් රාමුව භ්‍රමණය වී හෝ පරිමාණය කර ඇත්නම් ඔබේ දර්ශන රාමු ගණනය කිරීම් අසාර්ථක වනු ඇත.
මාටින් වික්මන්

21
Ar මාටින් වික්මන් - CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;අතහැර UIKeyboardBoundsUserInfoKey
දැමූ

1
එච්අයි, මමත් එසේ කළා, නමුත් පා view දර්ශනය ඉහළට යන්නේ පරිශීලකයා ටයිප් කිරීම ආරම්භ කළ විට පමණක්ද? එය අපේක්ෂිත හැසිරීම හෝ මට යමක් මග හැරී තිබේද?

3
[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].sizeවිය යුතුය [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size. නමුත් විශිෂ්ට විසඳුමක්!
j7nn7k

1
මම ඔබේ විසඳුමට කැමතියි නමුත් එය වඩාත් සරල කළ හැකි යැයි මම සිතමි: දැනුම්දීම් නිරීක්ෂක දේවල් සමඟ කරදර නොවන්න; ඒ වෙනුවට සුදුසු නියෝජිත ක්‍රමවේදයන් තුළ නිවැරදි සජීවිකරණ ක්‍රියාකාරකම් අමතන්න - UITextView සඳහා ඒවා textViewDidBeginEditing සහ textViewDidEndEditing.
ඇලෙක්ස්චැෆි

271

ලේඛනයේ දක්වා ඇති පරිදි ඇපල් ක්‍රියාත්මක කිරීම භාවිතා කිරීම වඩාත් සුදුසුය . කෙසේ වෙතත්, ඔවුන් සපයන කේතය දෝෂ සහිතය. 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];
}

ඇපල් කේතයේ ඇති ගැටළු මේවා ය: (1) ලක්ෂ්‍යය දර්ශනයේ රාමුව තුළ තිබේ දැයි ඔවුන් සැමවිටම ගණනය කරයි, නමුත් එය ScrollViewඑසේ ය, එබැවින් එය දැනටමත් අනුචලනය වී ඇති අතර එම ඕෆ්සෙට් සඳහා ඔබ ගණන් ගත යුතුය:

origin.y -= scrollView.contentOffset.y

(2) ඔවුන් යතුරු පුවරුවේ උස අනුව අන්තර්ගතය මාරු කරයි, නමුත් අපට අවශ්‍ය වන්නේ ප්‍රතිවිරුද්ධ දෙයයි (අපට අවශ්‍ය contentOffsetවන්නේ තිරයේ දිස්වන උස අනුව මිස වෙනස් කිරීමට නොවේ):

activeField.frame.origin.y-(aRect.size.height)

1
අනුචලන දර්ශනය තිරය පුරවා නොමැති අවස්ථාවන්හිදී, අනුචලන දර්ශනයේ රාමුවට aRect සැකසිය යුතුය
mblackwell8

2
ඔබට CGPoint සම්භවය = activeField.frame.origin + activeField.frame.size.height අවශ්‍ය නොවේද? තත්වය.
htafoya

1
මෙම විසඳුම භූ දර්ශන දිශානතියේ ක්‍රියාත්මක නොවේ - පෙළ ක්ෂේත්‍රය දර්ශන වරායේ ඉහළින් පියාසර කරයි. iOS 7.1 සමඟ iPad.
ඇන්ඩ rew

4
වඩා හොඳ iOS 8 සහය සඳහා, යතුරුපුවරුවේ ප්‍රමාණය ලබා ගැනීමේදී භාවිතා කිරීම UIKeyboardFrameEndUserInfoKeyවෙනුවට භාවිතා කිරීමට මම යෝජනා කරමි UIKeyboardFrameBeginUserInfoKey, මෙය අභිරුචි යතුරුපුවරු වෙනස් කිරීම සහ පුරෝකථන පෙළ ටොගල් කිරීම / අක්‍රිය කිරීම වැනි දේ තෝරා ගනු ඇත.
එන්ඩරෙත්

1
G ඊගෝර්: ඔබේ නිවැරදි කිරීම මඟින් එය වඩාත් හොඳින් ක්‍රියා කරයි - නමුත් අවසාන පේළිය ප්‍රතිලෝම විය යුතුය:self.scrollView.contentOffset = self.currentSVoffset;
මෝර්ටන් හොල්ම්ගාඩ්

245

දී textFieldDidBeginEdittingසහ textFieldDidEndEditingමෙම උත්සවය ඇමතුමක් [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];
}

මෙම කේතය ඔබට උපකාරී වනු ඇතැයි මම බලාපොරොත්තු වෙමි.

ස්විෆ්ට් 2 හි

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)
}

ස්විෆ්ට් 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)
    }

1
ඇයි භාවිතා නොකරන්නේ [UIView animateWithDuration: animations:^{ }];?
ඇන්ඩ්‍රේ සයිට්‍රින්

2
const int movementDistance = -130; // අවශ්‍ය පරිදි කරකැවීම වඩාත් නම්‍යශීලී ලෙස වෙනස් කළ යුතුය
මිටිය

7
කුඩා ක්‍රියාත්මක කිරීම් පිළිබඳ ඇදහිය නොහැකි තරම් සරල ය. ScrollViews සහ නොපැහැදිලි ස්වයංක්‍රීය පිරිසැලසුම් ගැටළු සමඟ ගැටගැසීමක් නැත.
ජේම්ස් පෙරිහ්

4
Erm ... ඔබ කිසිසේත් පෙළ ක්ෂේත්‍ර පරාමිතිය භාවිතා නොකරයි. එසේ නම් එය ක්‍රියාකාරී පරාමිතියක් ලෙස ඇත්තේ ඇයි? මීට අමතරව, ඔබට ස්විෆ්ට් හි ද ත්‍රිමාණ ක්‍රියාකරු භාවිතා කළ හැකිය. කේතය අඩු කතාබහට ලක් කරයි.
stk

1
දර්ශනයේ පසුබිම් වර්ණය කළු හැර වෙනත් දෙයක් නම්, ඔබේ දර්ශනයට ගැලපෙන පරිදි කවුළුවේ වර්ණය සැකසීමට වග බලා ගන්න එවිට පරිශීලකයාට පිටුපස නොපෙනේ. එනම් self.window.backgroundColor = [UIColor whiteColor];
bvmobileapps

134

පෙළ ක්ෂේත්‍ර භාවිතා කිරීම පමණක්:

1a) භාවිතා කිරීම Interface Builder: සියලුම පෙළ ක්ෂේත්‍ර තෝරන්න => සංස්කරණය => කාවැද්දූ => අනුචලන දර්ශනය

1b) UIScrollView හි ScrollView නමින් පෙළ ක්ෂේත්‍රය අතින් කාවැද්දීම

2) සකසන්න UITextFieldDelegate

3) එක් එක් සකසන්න textField.delegate = self;(හෝ සම්බන්ධතා ඇති කරන්නInterface Builder )

4) පිටපත් කරන්න / අලවන්න:

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

8
නමුත් එය textFieldදැනටමත් පෙනෙන විට දර්ශනය ඉහළට ගෙන යයි .
TheTiger

1
වෙනස් CGPointMake(0, textField.frame.origin.y);කිරීමට අවශ්‍යයිCGPointMake(0, textField.frame.origin.y + scrollView.contentInset.top);
ෆියුරි

G ඊගෝර් ඔබේ අදහස් දැක්වීමෙන් පසුව පවා එය ක්‍රියාත්මක නොවේ. "TheTiger" සඳහන් කළ පරිදි එය පෙළ ක්ෂේත්‍රය දෘශ්‍යමාන වීමෙන් පසුව පවා දර්ශනය ඉහළට ගෙන යයි.
rak appdev

XCode 10 සඳහා වෙනස් කරන්න: "සියලුම පෙළ ක්ෂේත්‍ර තෝරන්න => සංස්කාරකය => කාවැද්දූ => අනුචලන දර්ශනය"
ටිබෝල්ට්

116

සඳහා විශ්ව විසඳුම , මෙන්න ක්රියාත්මක කිරීම සඳහා මගේ ප්රවේශය විය IQKeyboardManager .

රූප විස්තරය මෙහි ඇතුළත් කරන්න

1: ගූවන් - මම එකතු ගෝලීය දැනුම් දීම් UITextField, UITextViewසහ UIKeyboardA ය කටය පන්තියේ. මම එය හඳුන්වන්නේ IQKeyboardManager ලෙසයි .

Step2: - නම් සොයා UIKeyboardWillShowNotification, UITextFieldTextDidBeginEditingNotificationහෝ UITextViewTextDidBeginEditingNotificationදැනුම්දීම්, මම ලබා ගැනීමට උත්සාහ topMostViewControllerසිට උදාහරණයක් UIWindow.rootViewControllerධුරාවලියේ. එය නිසියාකාරව අනාවරණය කර ගැනීමට UITextField/ සැකසීමට UITextViewනම්, topMostViewController.viewරාමුව සකස් කළ යුතුය.

පියවර 3: -topMostViewController.view පළමුවෙන් ප්‍රතිචාර දැක්වූ UITextField/ සම්බන්ධයෙන් මම අපේක්ෂිත චලනය දුර ගණනය කළෙමි UITextView.

පියවර 4: -topMostViewController.view.frame අපේක්ෂිත චලනය වන දුර අනුව මම ඉහළට / පහළට ගමන් කළෙමි .

Step5: - නම් සොයා UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotificationහෝ UITextViewTextDidEndEditingNotificationනිවේදනය, මම නැවත ලබා ගැනීමට උත්සාහ topMostViewControllerසිට උදාහරණයක් UIWindow.rootViewControllerධුරාවලියේ.

පියවර 6: - මම ගණනය කළ කැළඹිලි දුර topMostViewController.viewඑහි මුල් ස්ථානයට යථා තත්වයට පත් කළ යුතුය.

පියවර 7: -topMostViewController.view.frame බාධා කළ දුර අනුව මම යථා තත්වයට පත් කළෙමි .

පියවර 8: - යෙදුම් පැටවීම මත මම සිංගල්ටන් IQKeyboardManager පන්තියේ උදාහරණය ක්ෂණිකව ලබා දුන්නෙමි , එබැවින් යෙදුමේ සෑම එකක්ම UITextField/ UITextViewඅපේක්ෂිත චලනය වන දුර අනුව ස්වයංක්‍රීයව සකසනු ඇත.

එච්චරයි IQKeyboardManager ඔබ වෙනුවෙන් කරන්න සංග්රහයේ නැත LINE ඇත්තටම !! අවශ්‍ය වන්නේ ව්‍යාපෘති සඳහා අදාළ මූලාශ්‍ර ගොනුව ඇදගෙන යාම පමණි. IQKeyboardManager උපාංග දිශානතිය , ස්වයංක්‍රීය UIToolbar කළමනාකරණය , KeybkeyboardDistanceFromTextField සහ ඔබ සිතනවාට වඩා බොහෝ දේ සඳහා සහය දක්වයි .


මගේ ව්‍යාපෘතියට IQKeyBoardManagerSwift නාමාවලිය එක් කරන්න, වැඩ නොකරන්න. AppDelegate හි හඳුනා නොගත් cuz සක්‍රීය කළ නොහැක ...
user3722523

2
මෙය තතුබෑම් කිරීම සැබෑ විසඳුම නොපෙන්වන බවක් හැඟෙන නමුත් ඒ වෙනුවට අපි මේ අයට GitHub ගිණුමට වෙළඳ දැන්වීමක් දකිමු.
බ්‍රයන්

101

මම විශ්වීය, හැලෙන UIScrollView, UITableViewසහ පවා එකතු කර ඇත්තෙමිUICollectionView යතුරු පුවරුව මාර්ගය පිටතට එය තුල සෑම ලිපියක ම පෙළ ක්ෂේත්ර ගමන් බලා ගත වන බව උපපංතිය.

යතුරුපුවරුව දර්ශණය වීමට ආසන්නව ඇති විට, උප පංතිය විසින් සංස්කරණය කිරීමට නියමිත උප දර්ශනය සොයා ගනු ඇති අතර, යතුරුපුවරුවේ උත්පතන සමඟ ගැලපෙන සජීවිකරණයක් සහිතව, දර්ශනය දෘශ්‍යමාන වන බවට වග බලා ගැනීම සඳහා එහි රාමුව සහ අන්තර්ගත ඕෆ්සෙට් සකස් කරන්න. යතුරුපුවරුව අතුරුදහන් වූ විට, එය එහි පෙර ප්‍රමාණය යථා තත්වයට පත් කරයි.

එය මූලික වශයෙන් ඕනෑම සැකසුමක් සමඟ ක්‍රියා කළ යුතුය, එක්කෝ UITableView පදනම් වූ අතුරු මුහුණතක් හෝ අතින් ස්ථානගත කර ඇති අදහස් වලින් එකක්.

මෙන්න 'tis: යතුරු පුවරුවේ මාර්ගයෙන් පිටත පෙළ ක්ෂේත්‍ර ගෙනයාම සඳහා විසඳුම


මේ එයයි! මෙය හොඳම, වඩාත්ම කාර්යක්ෂම හා පරිපූර්ණ විසඳුමයි! අනුචලන දර්ශන සඳහා එය භ්‍රමණයන් නිසි ලෙස හසුරුවයි. භ්‍රමණය වන්නේ නම් සිරස් අතට ස්වයංක්‍රීයකරණය කිරීමට වග බලා ගන්න නමුත් පතුලේ නැංගුරම් නොදමන්න. මගේ නඩුවේ අනුචලන දර්ශනයට මම UITextView එකක් එක් කළෙමි. ස්තූතියි පොකුරු!
ක්‍රිස්ටෝපර්

හරිම ලස්සන වැඩක්! ෂුවර්, මම DIY එක වෙනුවට ඔබේ විසඳුම භාවිතා කරමින් කම්මැලි වෙමි, නමුත් මගේ ලොක්කා සතුටින් සිටී, එබැවින් ඔව්! යමෙකුට තමන් විසින්ම කිරීමට අවශ්‍ය වුවද, එක් එක් පාලකයට කේත එකතු කරනවා වෙනුවට ඔබේ උප පංති ප්‍රවේශයට මම කැමතියි. ඇන්ඩ්‍රොයිඩ් කළාක් මෙන් iOS මෙය පෙරනිමියෙන් සිදු නොකිරීම ගැන මම කම්පාවට පත්
වූවෙමි

මගේ අනුචලන දර්ශනය වැනි අමුතු දේවල් සියල්ලම තිරයට ගැලපේ, එබැවින් එය අනුචලනය කළ නොහැක. යතුරුපුවරුව විවෘත කර වසා දැමීමෙන් පසුව, අන්තර්ගතය දැන් විශාලය (අදෘශ්‍යමාන යමක් එකතු කර ඇති අතර පිටුවේ පතුලේ ඉවත් නොකෙරේ), එය අනුචලනය කළ හැකිය.
ඇල්මෝ

90

සඳහා ස්විෆ්ට් වැඩසටහන්:

මෙය ඔබ වෙනුවෙන් සෑම දෙයක්ම කරනු ඇත, මේවා ඔබගේ දර්ශන පාලක පන්තියට ඇතුළත් UITextFieldDelegateකර ඔබගේ දර්ශන පාලකයට ක්‍රියාත්මක කර පෙළ ක්ෂේත්‍රයේ නියෝජිතයා වෙත සකසන්නself

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

නියෝජිත ඇමතුම් ලබා ගැනීමේ ක්‍රම ක්‍රියාත්මක කරන්න:

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()
}

ස්විෆ්ට් 4, 4.2, 5 සඳහා: වෙනස් කරන්න

self.view.frame = CGRectOffset(self.view.frame, 0,  movement)

වෙත

self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)

මෙම ක්‍රියාවට නැංවීම පිළිබඳ අවසන් සටහන: යතුරුපුවරුව පෙන්වන අතරතුර ඔබ වෙනත් දර්ශන පාලකයක් තොගයට තල්ලු කරන්නේ නම්, මෙය දෝෂයක් නිර්මාණය කර දර්ශනය එහි මධ්‍ය රාමුවට නැවත ලබා දෙන නමුත් යතුරුපුවරු ඕෆ්සෙට් නැවත සකසනු නොලැබේ. උදාහරණයක් ලෙස, ඔබගේ යතුරුපුවරුව නම්ෆීල්ඩ් සඳහා පළමු ප්‍රතිචාරකයා වේ, නමුත් පසුව ඔබ ඔබගේ උදව් දර්ශන පාලකය ඔබේ තොගයට තල්ලු කරන බොත්තමක් එබිය යුතුය. ඕෆ්සෙට් දෝෂය නිරාකරණය කිරීම සඳහා, දර්ශන පාලකයෙන් ඉවත්ව යාමට පෙර nameField.resignFirstResponder () අමතන්න, පෙළ ෆීල්ඩ් ඩීඩ්එන්ඩ්එඩිටින් නියෝජිත නියෝජිත ක්‍රමය ද හැඳින්වෙන බවට සහතික වන්න. මම මෙය කරන්නේ ViewWillDisappear ක්‍රමයෙන්.


3
ස්විෆ්ට්ලින්ට් අකමැති self.view.frame = CGRectOffset(self.view.frame, 0, movement)නිසා මම එම රේඛාව වෙනස් කළෙමිself.view.frame.offsetInPlace(dx: 0, dy: movement)
ලෙවිබොස්ටියන්

2
ඉක්මන් 4 වෙනස් self.view.frame = self.view.frame.offsetBy කිරීමට CGRectOffset (self.view.frame, 0, ව්යාපාරය) (dx: 0, නියෝජ්ය: ව්යාපාරය)
Asinox

FYI, මෙය ක්‍රියාත්මක වීමට නම් ඔබ තැබිය යුතුය. self.view.frame = self.view.frame.offsetBy (dx: 0, dy: movement)
ජොෂ් වුල්ෆ්

64

දැනටමත් බොහෝ පිළිතුරු ඇත, නමුත් තවමත් ඉහත විසඳුම් කිසිවක් "පරිපූර්ණ" දෝෂ රහිත, පසුපසට අනුකූල සහ ෆ්ලිකර්-නිදහස් සජීවිකරණය සඳහා අවශ්‍ය සියලු විසිතුරු ස්ථානගත කිරීමේ දේවල් නොතිබුණි. (රාමු / සීමාවන් සහ අන්තර්ගතය සජීවිකරණය කිරීමේදී දෝෂය, විවිධ අතුරු මුහුණත් දිශානතිය, අයිපෑඩ් බෙදීම් යතුරුපුවරුව, ...)
මගේ විසඳුම බෙදා ගැනීමට මට ඉඩ දෙන්න:
(ඔබ පිහිටුවා ඇතැයි උපකල්පනය කර 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:&keyboardFrameInWindow];

    // 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;

    /*
     * Depending on visual layout, _focusedControl should either be the input field (UITextField,..) or another element
     * that should be visible, e.g. a purchase button below an amount text field
     * it makes sense to set _focusedControl in delegates like -textFieldShouldBeginEditing: if you have multiple input fields
     */
    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];
}

H ෂියුන් පිළිතුරේ විශාල දියුණුව. නමුත් යතුරුපුවරුව අතුරුදහන් වූ පසු, දර්ශනය පළමු ස්ථානයට නොපැමිණේ. එය තවමත් විශිෂ්ට කාර්යයකි :)
Lucien

2
ස්තූතියි, මෙය 2017 දී මට ඇති හොඳම විසඳුමයි. ඔබ විසින්ම අවධානය යොමු කළ පාලනය සොයා ගැනීමට අවශ්‍ය නොවන බව සලකන්න, ඔබට එය තීරණය කළ හැකිය UIApplication.shared.sendAction(...). ක්‍රියාත්මක කර ඇති ඔබගේ පිළිතුරේ ස්විෆ්ට් 3 අනුවාදය (us ණ විල්හයිඩ් කොටස) sendAction: gist.github.com/xaphod/7aab1302004f6e933593a11ad8f5a72d
xaphod

casexaphod මගේ නඩුවේදී මට වැඩි පාලනයක් යොමු කිරීමට අවශ්‍ය විය - උදා: ආදාන ක්ෂේත්‍රයට පහළින් බොත්තමක්. නමුත් ඔව්, එම කේතය දැන් අවුරුදු 4 ක් පැරණි වන අතර එය වැඩිදියුණු කිරීම් වලින් ප්‍රයෝජන ගත හැකිය.
මාටින් උල්රිච්

මෙය බොහෝ විට නිසි විසඳුම විය හැකිය. යතුරුපුවරු දැනුම්දීම සජීවිකරණ දත්ත රැගෙන යයි, පෙළ ක්ෂේත්‍ර නියෝජිතයින් සජීවිකරණ කාලසීමාව ගැන නොදනිති, එය අනුමාන කාර්යයක් වනු ඇත.
XY

62

ෂියූන් පැවසුවේ “යූඑස්ක්‍රොල්වීව් ඇත්ත වශයෙන්ම දැනට සංස්කරණය කර ඇති යූඅයිටෙක්ස්ට්ෆීල්ඩ් දෘශ්‍යමාන කවුළුව තුළට ව්‍යංගයෙන් ගෙන එනු ඇතැයි මම විශ්වාස කරමි” මෙය iOS 3.1.3 සඳහා සත්‍ය බව පෙනේ, නමුත් 3.2, 4.0 හෝ 4.1 නොවේ. IOS> = 3.2 හි UITextField දෘශ්‍යමාන කිරීම සඳහා මට පැහැදිලි අනුචලන රෙක්ටෝ ටෝවිසිබල් එක් කිරීමට සිදු විය.


සංස්කරණය කරන ලද UITextField දර්ශනය සඳහා අනුචලනය කරන්නේ UIScrollView නොවේ, එහි UITextField පුද්ගලික [UITextField scrollTextFieldToVisibleIfNecessary]ක්‍රමයක් ලෙස හඳුන්වන අතර එය කැඳවූ [UIScrollView scrollRectToVisible]විට ඇමතුම් ලබා ගනී [UITextField becomeFirstResponder]. Github.com/leopatras/ios_textfields_on_scrollview බලන්න . අවහිරතා සහ දර්ශන පාලකයන් නිසියාකාරව සකසා ඇත්නම් ඇත්ත වශයෙන්ම scrollRectToVisibleපැහැදිලිව ඇමතිය යුතු නැත (අවම වශයෙන් IOS 11 සිට).
ලියෝ

48

සලකා බැලිය යුතු එක් දෙයක් නම්, ඔබට UITextFieldඑය තනිවම භාවිතා කිරීමට අවශ්‍යද යන්නයි . UITextFieldsපිටතින් භාවිතා කරන හොඳින් සැලසුම් කරන ලද iPhone යෙදුම් මට හමු වී නැත UITableViewCells.

එය අමතර වැඩක් වනු ඇත, නමුත් මේස දර්ශන සියල්ල දත්ත ඇතුළත් කිරීමේ දර්ශන ක්‍රියාත්මක කිරීමට මම ඔබට නිර්දේශ කරමි. ඔබට එකතු UITextViewකරන්න UITableViewCells.


1
මගේ එක් යෙදුමකට පරිශීලකයින්ට නිදහස් ආකෘති සටහන් එකතු කිරීමට ඉඩ දිය යුතුය- එබැවින් ඔව් සමහර විට UITextField භාවිතා කිරීම ප්‍රයෝජනවත් වේ.
පීටර් ජොන්සන්

1
මම මෙම ක්‍රමයට එකඟ වෙමි. මේ ආකාරයෙන් ශුන්‍ය වැඩ හෝ කේත කරන්න. ඔබට නොමිලේ පෝරම සටහනක් අවශ්‍ය වුවද ඔබට තවමත් මේස කොටුවක් සමඟ කළ හැකිය
RJH

UITableViewකනගාටුවට කරුණ නම් යා යුතු එකම මාර්ගයයි. යතුරුපුවරු දැනුම්දීම් අස්ථාවර වන අතර අතිකාල වෙනස් කර ඇත. Stack Overflow හි නියැදි කේතය: stackoverflow.com/a/32390936/218152
SwiftArchitect

මෙම පිළිතුර වසර පහක් පමණ යල්පැන ඇත. එකම නවීන විසඳුම මේ වගේ දෙයක් ... stackoverflow.com/a/41808338/294884
ෆැටි

47

මෙම ලේඛනය මෙම ගැටලුවට විසඳුමක් විස්තර කරයි. 'යතුරුපුවරුව යටතේ පිහිටා ඇති අන්තර්ගතය ගෙනයාම' යටතේ ඇති ප්‍රභව කේතය දෙස බලන්න. එය ඉතා සරල ය.

සංස්කරණය කරන්න: උදාහරණයේ අඩුපාඩුවක් ඇති බව සැලකිල්ලට ගත්තා. UIKeyboardWillHideNotificationඒ වෙනුවට ඔබට සවන් දීමට අවශ්‍ය වනු ඇත UIKeyboardDidHideNotification. එසේ නොමැතිනම් යතුරුපුවරුවේ පිටුපස ඇති අනුචලන දර්ශනය යතුරුපුවරුව වසා දැමීමේ සජීවිකරණයේ කාලසීමාව සඳහා සටහන් වේ.


32

පහසුම විසඳුම හමු විය

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

තිරය ​​පතුලේ නොතිබුණද ඉහළට ගමන් කරයි. එනම්, පෙළ ක්ෂේත්‍රය ඉහළින් තිබේ නම් එය තිරයෙන් පිටතට ගමන් කරයි. එම නඩුව පාලනය කරන්නේ කෙසේද?
මෙල්වින්

L මෙල්වින් මෙම පේළියට පසුව එක් කරන්න: int movement = (up ? -movementDistance : movementDistance); if (textField.frame.origin.y < self.view.frame.size.height - keyboard.height) { movementDistance = 0 }කරුණාකර keyboardවිචල්‍යය යතුරුපුවරුවේ CGRect බව ඔබට නොපෙනේ:let keyboard = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey]!.CGRectValue())!
අල්ලා

31

බොහෝ 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's 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]; 
}

rect.origin.y=+currTextField.frame.origin.yවැඩ කිරීම ස්තූතියි
u.gen

30

ආර්පීඩීපී කේතය යතුරුපුවරුවේ මාර්ගයෙන් පිටත පෙළ ක්ෂේත්‍රය සාර්ථකව ගෙන යයි. නමුත් යතුරුපුවරුව භාවිතා කර ඉවත දැමීමෙන් පසු ඔබ ඉහළට අනුචලනය කරන විට, ඉහළට නොපෙනී යයි. සිමියුලේටරය සහ උපාංගය සඳහා මෙය සත්‍ය වේ. එම දර්ශනයේ ඉහළින් ඇති අන්තර්ගතය කියවීමට යමෙකුට දර්ශනය නැවත පූරණය කළ යුතුය.

ඔහුගේ පහත කේතය මඟින් දර්ශනය නැවත පහළට ගෙන යා යුතු නොවේද?

else
{
    // revert back to the normal state.
    rect.origin.y += kOFFSET_FOR_KEYBOARD;
    rect.size.height -= kOFFSET_FOR_KEYBOARD;
}

23

දර්ශනය ඉහළට ගෙනයාම නිවැරදි ප්‍රවේශය දැයි මට විශ්වාස නැත, මම එය වෙනස් ආකාරයකින් කළෙමි, UIScrollView ප්‍රමාණය වෙනස් කළෙමි. මම එය කුඩා ලිපියකින් විස්තරාත්මකව පැහැදිලි කළෙමි


ලිපියට සබැඳිය මිය ගොස් ඇත.
ටෙඩ්

22

මුල් දර්ශන තත්වයට නැවත ගෙන ඒමට, එකතු කරන්න:

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

20

මෙම කෙටි උපක්‍රමය උත්සාහ කරන්න.

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

19

විසඳුම් බොහොමයක් ඇත, නමුත් එය ක්‍රියාත්මක වීමට පෙර මම පැය කිහිපයක් ගත කළෙමි. ඉතින්, මම මෙම කේතය මෙහි තැබුවෙමි (ව්‍යාපෘතියට අලවන්න, කිසියම් වෙනස් කිරීමක් අවශ්‍ය නොවේ):

@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)


හායි හොට්ජාර්ඩ්, මම [self.view addSubview: natView] හි EXE_BAD_ACCESS ලබා ගනිමි;
බාලා

18

27 user271753

ඔබගේ දැක්ම මුල් එකතු කිරීමට නැවත ලබා ගැනීම සඳහා:

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
   [textField resignFirstResponder];
   [self setViewMovedUp:NO];
   return YES;
}

16

දර්ශන රාමුව ගෙනයාමට අනුචලන දර්ශනයක් අවශ්‍ය නොවේ. viewcontroller'sයතුරු පුවරුවට ඉහළින් පළමු ප්‍රතිචාර දක්වන පෙළ ක්ෂේත්‍රය තැබීමට ඔබට සම්පූර්ණ දර්ශනයම ප්‍රමාණවත් වන පරිදි දර්ශනයක රාමුව වෙනස් කළ හැකිය . මම මෙම ගැටලුවට මුහුණ දෙන විට මම උප පංතියක් නිර්මාණය කළෙමිUIViewController . යතුරුපුවරුව දැනුම්දීමක් ලෙස දිස්වන අතර පළමු ප්‍රතිචාර දැක්වීමේ උප දර්ශනය සොයා ගන්නා අතර (අවශ්‍ය නම්) එය ප්‍රධාන දර්ශනය යන්තම් ඉහළට සජීවීකරණය කරයි, එවිට පළමු ප්‍රතිචාරකයා යතුරුපුවරුවට ඉහළින් ඇත. යතුරුපුවරුව සැඟවී ඇති විට, එය තිබූ ස්ථානය නැවත දර්ශනය සජීවීකරණය කරයි.

මෙම පංති භාවිතා කිරීම සඳහා වූ උප පංති පාලකය ඔබගේ අභිමත දැක්ම බවට පත් GMKeyboardVC එය (ඔබ ක්රියාත්මක නම් පමණක් වග බලා ගන්න මෙම අංගය උරුම viewWillAppearහා viewWillDisappearඔවුන් සුපිරි කතා කළ යුතුයි). පංතිය ගිතුබ් මත ය .


කුමන බලපත්‍රයද? ඔබගේ සමහර ලිපිගොනු විවෘත මූලාශ්‍ර බලපත්‍රයක් ඇති අතර සමහර ඒවා නැත.
ජයිම්

අවවාදයයි: මෙම කේතය ARC ව්‍යාපෘති සමඟ මිත්‍රශීලී නොවේ.
ඇල්මෝ

ඒවා ARC නොවන ලිපිගොනු බව සඳහන් කිරීමට ඔබ ගොඩනංවන විකල්පය එක් කරන්න හෝ එය ARC බවට පරිවර්තනය කර පිළිගැනීමේ ඉල්ලීමක් ඉදිරිපත් කරන්න.
progrmr

14

ස්විෆ්ට් 4 .

ඔබ පහසුවෙන් පාලනය කරන්න ඉහළ සහ පහළ ගෙන යන්න පුළුවන්ද UITextFieldනැත්නම් UIViewසමඟ UIKeyBoardසමඟAnimation රූප විස්තරය මෙහි ඇතුළත් කරන්න

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textField: UITextField!
    @IBOutlet var chatView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        textField.resignFirstResponder()
    }

    @objc func keyboardWillChange(notification: NSNotification) {

        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
        let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
        let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
        let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let deltaY = targetFrame.origin.y - curFrame.origin.y
        print("deltaY",deltaY)

        UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
            self.chatView.frame.origin.y+=deltaY // Here You Can Change UIView To UITextField
        },completion: nil)
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

}

2
පාහේ පරිපූර්ණයි. අයිෆෝන් එක්ස් හි ඔබට යතුරුපුවරුව සහ පෙළ ක්ෂේත්‍රය අතර අමුතු පරතරයක් ලැබුණද.
හූමන්

12

මෙන්න මම නිශ්චිත පිරිසැලසුමක් සඳහා ඉදිරිපත් කළ හැක් විසඳුම. මෙම විසඳුම මැට් ගැලගර් ද්‍රාවණයට සමාන වන අතර එමඟින් කොටසක් බැලීමට අනුචලනය වේ. මම තවමත් අයිෆෝන් සංවර්ධනයට අලුත් වන අතර පිරිසැලසුම් ක්‍රියා කරන ආකාරය ගැන මම නොදනිමි. මේ අනුව, මෙම කඩුල්ල.

ක්ෂේත්‍රයක් මත ක්ලික් කිරීමේදී අනුචලනය කිරීමට සහ පරිශීලකයා යතුරුපුවරුවේ ඊළඟට තේරූ විට අනුචලනය කිරීමට මගේ ක්‍රියාත්මක කිරීම අවශ්‍ය විය.

මා සතුව 775 ක උසකින් යුත් UIView එකක් තිබුණි. පාලනයන් මූලික වශයෙන් 3 ක කණ්ඩායම් වශයෙන් විශාල ඉඩක් පුරා විහිදේ. මම පහත දැක්වෙන IB පිරිසැලසුම සමඟ අවසන් කළෙමි.

UIView -> UIScrollView -> [UI Components]

මෙන්න කඩුල්ල එනවා

මම UIScrollView උස ඒකක 500 ක් දක්වා විශාල කර පසුව නියම පිරිසැලසුම (1250). පසුව මම අනුචලනය කිරීමට අවශ්‍ය නිරපේක්ෂ ස්ථාන සහ අයිබී ටැග් අංකය මත පදනම්ව ඒවා ලබා ගැනීම සඳහා සරල ශ්‍රිතයක් සහිත අරාවක් නිර්මාණය කළෙමි.

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

උදාහරණයක්.

- (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 එකක් සඳහා වූ අතර අභ්‍යන්තර පිරිසැලසුම් එන්ජින් ඉගෙන ගැනීමට මට දින ගණනක් නොතිබුණි.


12

අනුව මෙම ලේඛන , iOS 3.0 වන විට, එම UITableViewControllerපන්තියේ ස්වයංක්රීයව resizes සහ පෙළ ක්ෂේත්ර තුළ රේඛාව සංස්කරණය නොමැති විට එහි මේසය දැක්ම repositions. පෙළ ක්ෂේත්‍රය a තුළ තැබීම ප්‍රමාණවත් නොවන බව මම සිතමිUITableViewCellසමහරු පෙන්වා දී පරිදි .

සිට මෙම ලේඛන :

වගු දර්ශන පේළියේ පේළි පේළි පේළි පේළි පේළි පේළි සංස්කරණය කිරීමට සහාය වේ; නිදසුනක් ලෙස, පේළි සංස්කරණ මාදිලියේ පෙළ ක්ෂේත්‍ර කාවැදී ඇත්නම්, එය පෙන්වන අථත්‍ය යතුරුපුවරුවට ඉහළින් පේළිය අනුචලනය කරයි.


මට එම අදහසම හමු විය. ඔව් එය ඇත්ත. අමුතුම දෙය නම්, එය එක් UITabelViewController එකක වැඩ කරන අතර දෙවනුව එසේ නොවේ. නමුත් මගේ ක්‍රියාත්මක කිරීමේ කිසිදු වෙනසක් සොයා ගැනීමට මට නොහැකි විය.
මෝර්ෆියස් 78

11

යතුරුපෑඩය හැසිරවිය හැකි සරලම විසඳුම මෙන්න .

ඔබට අවශ්‍ය වන්නේ නියැදි කේතයට පහළින් පිටපත් කර ඔබේ පෙළ ක්ෂේත්‍රය හෝ ඔබට ඉහළට යාමට අවශ්‍ය ඕනෑම දර්ශනයක් වෙනස් කිරීමයි.

පියවර 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];
}

යොමුව : හොඳයි, කරුණාකර මෙම පුද්ගලයා අගය කරන්න මෙම සුන්දර කේත ස්නිප්, පිරිසිදු විසඳුම බෙදාගත් මෙම .

එතන ඉන්න කෙනෙකුට මේක ගොඩක් ප්‍රයෝජනවත් වේවි කියලා හිතනවා.


මම හිතන්නේ නැහැ මේක හොඳම දේ කියලා. Ithink heDheeraj VS හරි: එම පෙළ ක්ෂේත්‍රය වගු කොටුවක තිබේ නම් එය පහසුවෙන් සහ ස්වයංක්‍රීයව කළ හැකිය (table.scrollable = NO). සටහන මේසය තත්වය සහ ප්රමාණය සාධාරණ විය යුතුය: බව. උදා: - වගුවේ y පිහිටීම දර්ශනයේ පතුලේ සිට 100 ක් ගණනය කළහොත් උස 300 යතුරු පුවරුව මුළු වගුවම අතිච්ඡාදනය වේ. - වගුවේ උස = 10, සහ එහි ඇති පෙළ ක්ෂේත්‍රය දෘශ්‍යමාන වන පරිදි යතුරුපුවරුව දිස්වන විට 100 දක්වා ඉහළට අනුචලනය කළ යුතු නම්, එම පෙළ ක්ෂේත්‍රය මේසයේ සීමාවෙන් පිටත වනු ඇත.
samthui7

am samthui7 ධීරාජ් පිළිතුර ක්‍රියාත්මක වන්නේ ඔබ මේස දර්ශනයක් පමණක් නොව TableViewController භාවිතා කරන්නේ නම් පමණි. එය සමහර විට සුදුසු නොවන බාධකයක් බවට පත් කරයි.
බෙන් ජී

10

මෙම විෂය පිළිබඳ ආරම්භකයින් සඳහා හොඳ නිබන්ධනයක් සොයමින් සිටියදී මෙහි හොඳම නිබන්ධනය සොයා ගන්නා ලදී .

MIScrollView.hනිබන්ධනයේ පතුලේ ඇති උදාහරණයේ දී ඉඩක් තැබීමට වග බලා ගන්න

@property (nonatomic, retain) id backgroundTapDelegate;

ඔබ දකින අයුරින්.


ආයුබෝවන්, සපයා ඇති සබැඳියට ස්තූතියි. (අනාගත) ප්‍රශ්නවලට පිළිතුරු සැපයීමේදී කරුණාකර ඔබට හැකි තරම් තොරතුරු ලබා දෙන්න - සරල සබැඳි ටිකක් අස්ථාවරයි. එයින් කියැවෙන්නේ, පිළිතුර නොසලකා හැරිය හැකි හොඳ නිබන්ධනයකට සබැඳියක් නම්.
මාර්ටන් බොඩෙව්ස්

10

විට 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];
}

මෙම කේතය කුමක් සඳහාදැයි මට ව්‍යාකූලද? යතුරුපුවරුව පෙන්වන විට, viewWillAppearඑය නොකියයි. හා reloadDataමතභේදයක් පේළි දෘශ්යමාන බවට පත් කරන්නේ නැහැ.
ඇඩම් ජෝන්ස්

10

ඔබට එක් පේළියක්වත් ලිවීමට අවශ්‍ය නොවන මෙම තෙවන පාර්ශවය භාවිතා කරන්න

https://github.com/hackiftekhar/IQKeyboardManager

ව්‍යාපෘතිය බාගත IQKeyboardManagerකර ඔබේ ව්‍යාපෘතිය ඇදගෙන යන්න . ඔබට කිසියම් ගැටළුවක් හමු වුවහොත් කරුණාකර READMEලේඛනය කියවන්න .

යාලුවනේ යතුරුපුවරුව කළමනාකරණය කිරීම සඳහා එහි හිසරදය ඉවත් කරයි.


8

සටහන : මෙම පිළිතුර ඔබගේ පෙළ ක්ෂේත්‍රය අනුචලන දර්ශනයක ඇතැයි උපකල්පනය කරයි.

මගේ දෘෂ්ටියේ රාමු සමඟ පටලවා ගැනීම වෙනුවට 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).

මෙම දේපල සැකසීම සඳහා අපි නියෝජිත ක්‍රම භාවිතා කරමු. ඔබ වෙනත් අංගයක් භාවිතා කරන්නේ නම්, ඔබට සමාන දෙයක් අවශ්‍ය වේ.

පෙළ ක්ෂේත්‍රය සඳහා අපි එය කළේ ඩීබීජින් එඩිටින් සහ පෙළ දර්ශනය සඳහා බීබීජින් එඩිටින් යනුවෙනි. මෙයට හේතුව 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 currentFirstResponder is overlayed by the keyboard, move it so it bottom ends where the keyboard begins*/
    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;
}

8

ස්විෆ්ට් භාවිතයෙන් විසඳුම මෙයයි.

import UIKit

class ExampleViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var scrollView: UIScrollView!

    @IBOutlet var textField1: UITextField!
    @IBOutlet var textField2: UITextField!
    @IBOutlet var textField3: UITextField!
    @IBOutlet var textField4: UITextField!
    @IBOutlet var textField5: UITextField!

    var activeTextField: UITextField!

    // MARK: - View
    override func viewDidLoad() {
        super.viewDidLoad()
        self.textField1.delegate = self
        self.textField2.delegate = self
        self.textField3.delegate = self
        self.textField4.delegate = self
        self.textField5.delegate = self
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.registerForKeyboardNotifications()
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        self.unregisterFromKeyboardNotifications()
    }

    // MARK: - Keyboard

    // Call this method somewhere in your view controller setup code.
    func registerForKeyboardNotifications() {
        let center:  NSNotificationCenter = NSNotificationCenter.defaultCenter()
        center.addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil)
        center.addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
    }

    func unregisterFromKeyboardNotifications () {
        let center:  NSNotificationCenter = NSNotificationCenter.defaultCenter()
        center.removeObserver(self, name: UIKeyboardDidShowNotification, object: nil)
        center.removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
    }

    // Called when the UIKeyboardDidShowNotification is sent.
    func keyboardWasShown (notification: NSNotification) {
        let info : NSDictionary = notification.userInfo!
        let kbSize = (info.objectForKey(UIKeyboardFrameBeginUserInfoKey)?.CGRectValue() as CGRect!).size

        let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
        scrollView.contentInset = contentInsets;
        scrollView.scrollIndicatorInsets = contentInsets;

        // If active text field is hidden by keyboard, scroll it so it's visible
        // Your app might not need or want this behavior.
        var aRect = self.view.frame
        aRect.size.height -= kbSize.height;
        if (!CGRectContainsPoint(aRect, self.activeTextField.frame.origin) ) {
            self.scrollView.scrollRectToVisible(self.activeTextField.frame, animated: true)
        }
    }

    // Called when the UIKeyboardWillHideNotification is sent
    func keyboardWillBeHidden (notification: NSNotification) {
        let contentInsets = UIEdgeInsetsZero;
        scrollView.contentInset = contentInsets;
        scrollView.scrollIndicatorInsets = contentInsets;
    }

    // MARK: -  Text Field

    func textFieldDidBeginEditing(textField: UITextField) {
        self.activeTextField = textField
    }

    func textFieldDidEndEditing(textField: UITextField) {
        self.activeTextField = nil
    }

}

නිවැරදි පිළිතුර, නමුත් TextField සහ TextView යන දෙකම භාවිතා කිරීමේදී මට ගැටලුවක් නොමැත. උදව්වක් තිබේද?
තිහා අවුන්

Hi තිහා අවුන්, ඔබේ ප්‍රභව කේතයේ ඇති IBOutlet විචල්‍යයන් IB සමඟ සම්බන්ධ වී තිබේද?
හෝම්

ඔව් ඔවුන් එම රේඛාව දී UITextView භාවිතා කරන විට well.Just බව දෝෂයක් සහිත සම්බන්ධ කරනු ලැබේ: (CGRectContainsPoint (aRect, self.activeTextField.frame.origin)!) {නම්
Thiha අවුන්

Self.activeTextField යන්නෙහි තේරුම නැත
Thiha Aung
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.