কীবোর্ড উপস্থিত থাকলে আমি কীভাবে একটি ইউআইটিেক্সটফিল্ড সরিয়ে নিতে পারি - সম্পাদনা শুরু করার সময়?


1691

আইওএস এসডিকে সহ:

আমার UIViewসাথে একটি আছে UITextFieldযা একটি কীবোর্ড নিয়ে আসে। আমার এটি সক্ষম হবার দরকার:

  1. UIScrollViewকীবোর্ডটি একবার হাজির হওয়ার পরে অন্যান্য পাঠ্য ক্ষেত্রগুলি দেখার জন্য লিখিত সামগ্রীগুলির স্ক্রোলিংকে মঞ্জুরি দিন

  2. স্বয়ংক্রিয়ভাবে "লাফানো" (স্ক্রোলিং করে) বা সংক্ষিপ্তকরণ

আমি জানি যে, আমি একজন প্রয়োজন UIScrollView। আমি আমার বর্গ পরিবর্তন চেষ্টা করেছি UIViewএকটি করতে UIScrollViewকিন্তু আমি এখনও আপ বা ডাউন textboxes স্ক্রল করতে অক্ষম নই।

আমার কি এ UIViewএবং এ দুটোই দরকার 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
এটা দেখ. আপনার কোন ঝামেলা নেই টিপিকেবোর্ডটিভয়েডিং
অরুণা

21
এটি অ্যাপল দ্বারা নথিভুক্ত, আমি মনে করি এটি সেরা উপায়: বিকাশকারী.অ্যাপল.
com

58
এই কোডটি ব্যবহার করুন app appdelegate.m ফাইলে আপনার কেবল 1 লাইন প্রয়োজন এবং এটি কার্যকর হয়। github.com/hackiftekhar/IQKeyboardManager
প্রদীপ মিত্তাল

9
আমি এখনও অবধি সবচেয়ে ভাল উপায়টি
জায়েদী

2
আর একটি উপায় হ'ল এই জাতীয় সামগ্রীর পাঠ্য ক্ষেত্রগুলি এবং টেবিলভিউ কনট্রোলারগুলিতে সমস্ত যোগ করা এবং টেবিলভিউটিকে এটি পরিচালনা করতে দেওয়া।
ভিকি ধস

উত্তর:


1036
  1. ScrollViewআপনার এখন কেবলমাত্র যদি প্রয়োজনীয় সামগ্রীগুলি আইফোনের স্ক্রিনে ফিট না করে তবেই আপনার প্রয়োজন হবে । (যদি আপনি কীবোর্ড আসার পরে ScrollViewকেবল TextFieldস্ক্রোলটি তৈরি করার জন্য উপাদানগুলির তত্ত্বাবধান হিসাবে যোগ করছেন তবে এটির দরকার নেই))

  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
_ টেক্সটফিল্ড কী করে? আমি এটিকে আমার কোডে অনুলিপি করেছি, এটি বলছে _ টেক্সটফিল্ড অঘোষিত।
কোকো দেব

এটি এমন ক্ষেত্র যা আপনি "যখন ব্যবহারকারী এখানে সম্পাদনা করছেন তখন ভিউটি স্লাইড হওয়া উচিত" বা এমন কিছু বলতে চাইছেন ... তবে আপনি যদি আরও ক্ষেত্র থেকে থাকেন তবে আপনি এটিকে সরাতে পারবেন।
প্যাট্রিক

কল করার পক্ষে কি তাড়াহুড়ো হয় না - (বাতিল) সেটভিউমোভডআপ: (বোয়াল) কীবোর্ডওয়িলসহো এবং কীবোর্ডওয়ালহাইড ইভেন্টগুলিতে সরানো হয়েছে !!
আব্দুলিয়াম রেহমানিয়াস

4
আপনি যদি মূল দৃশ্যের আবর্তকে সমর্থন করছেন তবে বিশেষভাবে কার্যকর নয়।
ফ্র্যাক্টাল ডক্টর

2
এই কাজটি করতে, আমাকে textFieldDidBeginEditingবিভাগটি সম্পর্কে মন্তব্য করতে হয়েছিল ।
অ্যাভেন্স

445

আমার UIScrollViewএকাধিকের রচনা নিয়েও প্রচুর সমস্যা ছিল UITextFields, যার মধ্যে একটি বা একাধিক কীবোর্ড দ্বারা সম্পাদিত হওয়ার সময় তারা অস্পষ্ট হয়ে যেত।

আপনার UIScrollViewসঠিকভাবে স্ক্রোলিং করা হচ্ছে না তা বিবেচনা করার জন্য এখানে কয়েকটি জিনিস are

1) আপনার কন্টেন্টসাইজ UIScrollViewফ্রেমের আকারের চেয়ে বড় কিনা তা নিশ্চিত করুন । বুঝতে পথ UIScrollViewsযে UIScrollViewবিষয়বস্তু contentSize সংজ্ঞায়িত একটি দেখার জানালা ভালো হয়। সুতরাং যখন UIScrollviewকোথাও স্ক্রোল করার জন্য , কন্টেন্টসাইজটি অবশ্যই এর চেয়ে বেশি হওয়া উচিত UIScrollView। অন্যথায়, কন্টেন্টসাইজে সংজ্ঞায়িত সমস্ত কিছু ইতিমধ্যে দৃশ্যমান হওয়ায় কোনও স্ক্রলিংয়ের প্রয়োজন নেই। বিটিডাব্লু, ডিফল্ট কন্টেন্টসাইজ = CGSizeZero

২) এখন আপনি যে বুঝতে পেরেছেন যে এটি UIScrollViewসত্যই আপনার "সামগ্রীতে" একটি উইন্ডো, এটি নিশ্চিত করার উপায় যে কীবোর্ডটি আপনার UIScrollView's"উইন্ডো" দেখার জন্য অস্পষ্ট করছে না সেই পদ্ধতিটি পুনরায় আকার দিতে হবে UIScrollViewযাতে কীবোর্ড উপস্থিত থাকলে আপনার UIScrollViewউইন্ডোটি থাকবে UIScrollViewআকারটি কেবল মূল ফ্রেম আকারে করুন just এটি নিশ্চিত করবে যে আপনার উইন্ডোটি কেবলমাত্র সেই ছোট দর্শনীয় অঞ্চল।

3) এখানে ধরা আছে: আমি যখন এটি প্রথম প্রয়োগ করলাম তখন আমি বুঝতে পেরেছিলাম CGRectসম্পাদিত পাঠ্যক্ষেত্রটি পেতে এবং UIScrollView'sস্ক্রোলরেটটোভিজিবল পদ্ধতিতে কল করতে হবে। আমি UITextFieldDelegateপদ্ধতিটিতে textFieldDidBeginEditingকল দিয়ে পদ্ধতিটি বাস্তবায়ন করেছি scrollRecToVisible। এটি আসলে একটি অদ্ভুত পার্শ্ব প্রতিক্রিয়া যে স্ক্রলিং হবে সঙ্গে কাজ স্ন্যাপUITextField অবস্থানে। সবচেয়ে দীর্ঘ সময় আমি বুঝতে পারি না এটি কী ছিল। তারপরে আমি textFieldDidBeginEditingডেলিগেট পদ্ধতিটি মন্তব্য করেছিলাম এবং এটি সমস্ত কাজ !! (???)। এটি পরিণত হিসাবে, আমি বিশ্বাস করি যে UIScrollViewপ্রকৃতপক্ষে প্রকৃতপক্ষে প্রদর্শিত সম্পাদিত UITextFieldউইন্ডোতে সংক্ষিপ্তভাবে সম্পাদিত বর্তমানে সম্পাদিত হয়েছে brings 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আপনি অন্যটিতে ট্যাব করার সময় কীবোর্ডটি ইতিমধ্যে স্ক্রিনে থাকা অবস্থায়ও উইলটি ফায়ার হয় UITextFieldUIScrollViewকীবোর্ডটি ইতিমধ্যে স্ক্রিনে থাকা অবস্থায় এর আকার পরিবর্তন এড়াতে আমি আইভার ব্যবহার করে এটি যত্ন করেছিলাম । অজান্তেই UIScrollViewকীবোর্ডটি ইতিমধ্যে উপস্থিত থাকলে আকার দিতে পারে বিপর্যয়কর!

আশা করি এই কোডটি আপনার কারও কারও প্রচন্ড মাথা ব্যাথা বাঁচায়।


3
দুর্দান্ত, তবে দুটি সমস্যা: 1. UIKeyboardBoundsUserInfoKeyহ্রাস করা হয়েছে। ২. কীবোর্ডসাইজটি "স্ক্রিন স্থানাঙ্কে" রয়েছে, সুতরাং ফ্রেমটি ঘোরানো বা ছোট করা গেলে আপনার ভিউ ফ্রেমের গণনা ব্যর্থ হবে।
মার্টিন উইকম্যান

21
@ মার্টিন উইকম্যান - অবহিতদের CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;পরিবর্তে ব্যবহার করুনUIKeyboardBoundsUserInfoKey
সটেনাড

1
এইচআই, আমিও এটি করেছি, তবে পাঠ্যদর্শনটি কেবল তখনই উপরে উঠে যায় যখন ব্যবহারকারী টাইপ শুরু করে? এটি কি প্রত্যাশিত আচরণ বা আমি কিছু মিস করছি?

3
[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].sizeহওয়া উচিত [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size। দুর্দান্ত সমাধান যদিও!
j7nn7k

1
আমি আপনার সমাধানটি পছন্দ করি তবে আমার মনে হয় আমি এটিকে আরও সহজ করে তুলতে পারি: বিজ্ঞপ্তি পর্যবেক্ষকের স্টাফ নিয়ে বিরক্ত করবেন না; পরিবর্তে উপযুক্ত ডেলিগেট পদ্ধতিগুলির মধ্যে ডান অ্যানিমেশন রুটিনগুলিকে কল করুন - ইউআইটিেক্সটভিউয়ের জন্য তারা পাঠ্য ভিউডিডডিজিনইডিটিং এবং টেক্সটভিউডিডএন্ড সম্পাদনা করছেন।
অ্যালেক্সচফি

270

দস্তাবেজে যেমন সরবরাহ করা হয়েছে কেবল অ্যাপলের বাস্তবায়নটি ব্যবহার করা এটি সর্বোত্তম । যাইহোক, তাদের সরবরাহ করা কোডটি ত্রুটিযুক্ত। 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

(২) কীবোর্ডের উচ্চতা অনুসারে তারা সামগ্রীটি স্থানান্তরিত করে, তবে আমরা এর বিপরীতটি চাই (আমরা contentOffsetস্ক্রিনে দৃশ্যমান উচ্চতা দ্বারা শিফটটি দেখতে চাই , যা নেই তা নয়):

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

1
এমন পরিস্থিতিতে যেখানে স্ক্রোল ভিউ স্ক্রিনটি পূরণ করছে না, এরেক্টটি স্ক্রোল
ভিউর

2
আপনি কি সিজিপিয়েন্ট উত্স = সক্রিয়ফিল্ড.ফ্রেম.রিগিন + অ্যাক্টিভফিল্ড.ফ্রেম.সাইজ.হাইটটি চান না? কারণ আপনি চান যে পুরো পাঠ্যক্ষেত্রটি প্রদর্শিত হবে এবং যদি এটি কিছু পিক্সেল দৃশ্যমান হয় তবে কোডটি প্রবেশ করবে না শর্ত।
htafoya

1
এই সমাধানটি ল্যান্ডস্কেপ অভিযোজনে কাজ করে না - পাঠ্য ক্ষেত্রটি ভিউ বন্দরের শীর্ষে চলে যায়। আইওএস 7.1 সহ আইপ্যাড।
অ্যান্ড্রু

4
উন্নত আইওএস 8 সাপোর্টের জন্য, আমি কীবোর্ডের আকার পাওয়ার সময় UIKeyboardFrameEndUserInfoKeyপরিবর্তে ব্যবহার করার পরামর্শ দিচ্ছি UIKeyboardFrameBeginUserInfoKey, কারণ এটি কাস্টম কীবোর্ড পরিবর্তন এবং টগল করে ভবিষ্যদ্বাণীপূর্ণ পাঠ্যটিকে অফ / অফ করে।
এন্ডারেথ

1
@ ইগোর: আপনার ফিক্সটি এটিকে আরও ভালভাবে কাজ করে - তবে শেষ লাইনটি অবশ্যই বিপরীত হতে হবে:self.scrollView.contentOffset = self.currentSVoffset;
মর্টেন হল্মগার্ড

244

ফাংশনটি ইন 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
এটি ভাল কাজ করে, যদিও কনট ইনটি মুভমেন্টডেস্টেন্স = -130; // প্রয়োজন মতো
হাতুড়ি

7
ছোট বাস্তবায়নে অবিশ্বাস্যভাবে সহজ। স্ক্রোলভিউ এবং দ্ব্যর্থহীন স্বতঃ-লেআউট সমস্যা নিয়ে কোনও শোক নেই।
জেমস পেরিহ

4
আরম ... আপনি মোটেও টেক্সটফিল্ড প্যারামিটার ব্যবহার করবেন না। তবে এটি কেন একটি ফাংশন প্যারামিটার হিসাবে আছে? অতিরিক্ত হিসাবে, আপনি সুইফটে টের্নারি অপারেটরটিও ব্যবহার করতে পারেন। কোডটি কম কথোপকথন করে।
stk

1
যদি ভিউ এর ব্যাকগ্রাউন্ড কালারটি কালো বাদে অন্য কিছু হয় তবে নিশ্চিত হয়ে নিন যে আপনি উইন্ডোটির রঙটি আপনার ভিউয়ের সাথে মেলানোর জন্য সেট করেছেন যাতে ব্যবহারকারীর পিছনে এটি দেখতে না পায়। যেমন স্ব.উন্ডো.ব্যাকগ্রাউন্ড কালার = [ইউআইকলার হোয়াইট কালার];
বিভিমোবাইল অ্যাপস

134

কেবল টেক্সটফিল্ডগুলি ব্যবহার করে:

1 ক) ব্যবহার করে Interface Builder: সমস্ত পাঠ্যফিল্ড নির্বাচন করুন => সম্পাদনা => এম্বেড ইন => স্ক্রোলভিউ

1 খ) ইউআইএসক্রোলভিউতে টেক্সটফিল্ডগুলি ম্যানুয়ালি এম্বেড করে স্ক্রোলভিউ বলা হয়

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ইতিমধ্যে দৃশ্যমান হলে এটি দৃশ্যকে উপরে নিয়ে যায় ।
দি টাইগার

1
পরিবর্তন CGPointMake(0, textField.frame.origin.y);করতে হবেCGPointMake(0, textField.frame.origin.y + scrollView.contentInset.top);
ফিউরি

@ এগর আপনার মন্তব্যের পরেও এটি কার্যকর হয় না। "দ্য টাইগার" এর মতো উল্লেখ করা হয়েছে যে পাঠ্যক্ষেত্রটি দৃশ্যমান হওয়ার পরেও এটি দৃশ্যকে সরিয়ে দেয়।
রাক অ্যাপদেব

এক্সকোড 10 এর জন্য পরিবর্তন করুন: "সমস্ত পাঠ্যফিল্ড নির্বাচন করুন => সম্পাদক => এম্বেড ইন => স্ক্রোল দেখুন"
টিবাল্ট

116

জন্য ইউনিভার্সাল সমাধান , এখানে বাস্তবায়নের জন্য আমার পদ্ধতির ছিল IQKeyboardManager

এখানে চিত্র বর্ণনা লিখুন

1 ম ধাপ: - আমি যোগ করা হয়েছে বিশ্বব্যাপী বিজ্ঞপ্তিগুলি UITextField, UITextViewএবং UIKeyboardএকটি Singleton বর্গ। আমি এটিকে আইকিউ কীবোর্ড ম্যানেজার বলি

পদক্ষেপ 2: - যদি পাওয়া যায় বা বিজ্ঞপ্তিগুলি পাওয়া যায় UIKeyboardWillShowNotification, তবে আমি স্তরক্রমের থেকে উদাহরণ পেতে চেষ্টা করি । সঠিকভাবে উন্মোচিত করার জন্য / এটিতে, এর ফ্রেম স্থায়ী করা প্রয়োজন।UITextFieldTextDidBeginEditingNotificationUITextViewTextDidBeginEditingNotificationtopMostViewControllerUIWindow.rootViewControllerUITextFieldUITextViewtopMostViewController.view

স্টিপি 3: - আমি topMostViewController.viewপ্রথমে সাড়া দেওয়া UITextField/ এর সাথে সম্মতভাবে প্রত্যাশিত সরানো দূরত্ব গণনা করেছি UITextView

পদক্ষেপ 4: - আমি topMostViewController.view.frameপ্রত্যাশিত সরানো দূরত্ব অনুযায়ী উপরে / নিচে চলে এসেছি ।

ধাপ 5: - এটি পাওয়া গেলে UIKeyboardWillHideNotification, UITextFieldTextDidEndEditingNotificationবা UITextViewTextDidEndEditingNotificationবিজ্ঞপ্তি, আমি আবার পেতে চেষ্টা topMostViewControllerথেকে উদাহরণস্বরূপ UIWindow.rootViewControllerঅনুক্রমের।

পদক্ষেপ:: - আমি বিরক্তিকর দূরত্ব গণনা করেছি topMostViewController.viewযার মূল অবস্থানটিতে এটি পুনরুদ্ধার করা দরকার।

পদক্ষেপ:: - আমি topMostViewController.view.frameবিরক্তিকর দূরত্ব অনুযায়ী পুনরুদ্ধার করেছি ।

পদক্ষেপ 8: - আমি অ্যাপ্লিকেশন লোডে সিঙ্গেলটন আইকিউকিবোর্ড ম্যানেজার শ্রেণীর উদাহরণ ইনস্ট্যান্ট করেছি , সুতরাং অ্যাপটিতে প্রতিটি UITextField/ UITextViewপ্রত্যাশিত চলার দূরত্ব অনুযায়ী স্বয়ংক্রিয়ভাবে সামঞ্জস্য হবে।

যে সব IQKeyboardManager আপনার জন্য কি করতে কোডের কোন লাইন সত্যিই !! প্রকল্পে কেবল সম্পর্কিত উত্স ফাইলটি টেনে আনতে হবে drop আইকিউ কীবোর্ডম্যানেজার ডিভাইস ওরিয়েন্টেশন , অটোমেটিক ইউআইটিউলবার ম্যানেজমেন্ট , কীবোর্ডবোর্ড দূরত্বফ্র্যামটেক্সটফিল্ড এবং আপনি যা ভাবেন তার চেয়ে অনেক বেশি সমর্থন করে ।


আইকিউকিবোর্ডম্যানেজারসুইফ্ট ডিরেক্টরিটি আমার প্রকল্পে যুক্ত করুন এবং কাজ করবেন না।
অ্যাপ্লিকেশনটিতে এটি

2
এটি ফিশিংয়ের মতো মনে হয় প্রকৃত সমাধানটি প্রদর্শিত হয় নি তবে পরিবর্তে আমরা এই ছেলেরা গিটহাব অ্যাকাউন্টে একটি বাণিজ্যিক দেখতে পাই।
ব্রায়ান

101

আমি একসঙ্গে একটি সার্বজনীন, ড্রপ-রেখেছি UIScrollView, UITableViewএবং এমনকি UICollectionViewউপশ্রেণী এটি মধ্যে সব পাঠ্য ক্ষেত্রের কীবোর্ডের পথ থেকে চলন্ত যত্ন নেয়।

যখন কীবোর্ডটি উপস্থিত হতে চলেছে, সাবক্লাসটি সম্পাদিত হতে পারে এমন সাবউভিউটি সন্ধান করবে এবং কীবোর্ড পপ-আপের সাথে মিলিত করার জন্য একটি অ্যানিমেশন সহ এই দৃশ্যটি দৃশ্যমান কিনা তা নিশ্চিত করার জন্য তার ফ্রেম এবং সামগ্রীটি সামঞ্জস্য করবে। কীবোর্ড অদৃশ্য হয়ে গেলে এটি তার পূর্বের আকারটি পুনরুদ্ধার করে।

এটি মূলত কোনও সেটআপ, একটি UITableViewভিত্তিক ইন্টারফেস, বা ম্যানুয়ালি রাখা হয়েছে এমন একটি ধারণার সাথে কাজ করা উচিত ।

এখানে টিস: কীবোর্ডের বাইরে পাঠ্য ক্ষেত্রগুলি সরিয়ে নেওয়ার সমাধান


এই হল! এটি সেরা, সবচেয়ে দক্ষ এবং নিখুঁত সমাধান! স্ক্রোল দর্শনগুলির জন্য এটি সঠিকভাবে আবর্তনগুলি পরিচালনা করে। ঘোরানো হলে উলম্বভাবে অটোরেসাইজ করা নিশ্চিত হয়ে নিন তবে নীচে অ্যাঙ্কর করবেন না। আমি আমার ক্ষেত্রে স্ক্রোল ভিউতে একটি ইউআইটিএক্সেক্সটভিউ যুক্ত করেছি। ধন্যবাদ গুচ্ছ!
ক্রিস্টোফার

খুব সুন্দর কাজ! অবশ্যই, আমি DIY একের পরিবর্তে আপনার সমাধানটি ব্যবহার করে অলস হচ্ছি, তবে আমার বস আরও সুখী, তাই হ্যাঁ! এমনকি যদি কেউ নিজেরাই করতে চায় না তবে প্রতিটি কন্ট্রোলারে কোড যুক্ত করার পরিবর্তে আমি আপনার সাবক্লাস পদ্ধতির পছন্দ করি। আমি হতবাক হয়েছি আইওএস অ্যান্ড্রয়েডের মতো ডিফল্টরূপে এটি করেনি - তবে আবার, আমি আইওএস এবং
ম্যাকোজে

আমার স্ক্রোলভিউয়ের মতো অদ্ভুত জিনিসগুলি কী স্ক্রিনে সব ফিট করে তাই এটিকে স্ক্রোল করা যায় না। কীবোর্ডটি খোলার এবং বন্ধ করার পরে, সামগ্রীটি এখন বৃহত্তর (দেখতে দেখতে অদৃশ্য কিছু যুক্ত হয়েছিল এবং পৃষ্ঠার নীচে সরানো হয়নি), এবং স্ক্রোল করা যায়।
অলমো

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)

এই বাস্তবায়ন সম্পর্কে সর্বশেষ নোট: কীবোর্ড দেখানোর সময় আপনি যদি স্ট্যাকের উপরে অন্য ভিউ কন্ট্রোলারটিকে চাপ দেন তবে এটি এমন একটি ত্রুটি তৈরি করবে যেখানে ভিউটিটি তার কেন্দ্রের ফ্রেমে ফিরে ফিরে আসে তবে কীবোর্ড অফসেটটি পুনরায় সেট করা হয় না। উদাহরণস্বরূপ, আপনার কীবোর্ডটি নাম ফিল্ডের জন্য প্রথম প্রতিক্রিয়াকারী, তবে তারপরে আপনি একটি বোতামটি চাপান যা আপনার স্ট্যাকের উপরে সহায়তা ভিউ কন্ট্রোলারকে ঠেলে দেয়। অফসেট ত্রুটিটি ঠিক করতে, ভিউ কন্ট্রোলার ছাড়ার আগে নামফিল্ড.আরসিগন ফার্স্ট রিসপন্ডার () নাম্বারে কল করে তা নিশ্চিত করে পাঠ্যফিল্ডডিডএন্ডএডিটিং ডেলিগেট পদ্ধতিটিও বলা হয়। আমি ভিউলিডিস্পিয়ার পদ্ধতিতে এটি করি।


3
সুইফটলিন্ট পছন্দ করেননি self.view.frame = CGRectOffset(self.view.frame, 0, movement)তাই আমি সেই লাইনটি পরিবর্তন করেছিলামself.view.frame.offsetInPlace(dx: 0, dy: movement)
লেবিবোস্টিয়ান

2
সুইফট 4 পরিবর্তন সেল্ফ.ভিউ.ফ্রেমে = সিজিআরেক্টঅফসেট (সেলফিউজ.ফ্রেম, 0, মুভমেন্ট) এ সেল্ফ.ভিউ.ফ্রেম.অফসেটবি (ডিএক্স: 0, ডাই: মুভমেন্ট)
অ্যাসিনাক্স

এফওয়াইআই, এটি কাজ করার জন্য, আপনাকে রাখতে হবে। self.view.frame = self.view.frame.offsetBy (dx: 0, dy: আন্দোলন)
জোশ ওল্ফ

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

@ শিউন উত্তরের দুর্দান্ত উন্নতি। তবে কীবোর্ড চলে যাওয়ার পরে দৃশ্যটি প্রথম অবস্থানে ফিরে আসে না। এটি এখনও একটি দুর্দান্ত কাজ :)
লুসিউন

2
ধন্যবাদ, এটি আমার জন্য 2017 সালের সেরা সমাধান Note মনে রাখবেন যে আপনাকে নিজেরাই কেন্দ্রীভূত করতে হবে নিয়ন্ত্রণটি ট্র্যাক করার দরকার নেই, আপনি এটি নির্ধারণ করতে পারেন UIApplication.shared.sendAction(...)sendActionবাস্তবায়িত সহ আপনার উত্তরটির সুইফট 3 সংস্করণটি (বিয়োগের উইলহাইড অংশ) এখানে রয়েছে : gist.github.com/xaphod/7aab1302004f6e933593a11ad8f5a72d
xaphod

@ এক্সফড আমার ক্ষেত্রে আমার আরও নিয়ন্ত্রণগুলি ফোকাস করা দরকার - যেমন একটি ইনপুট ক্ষেত্রের নীচে একটি বোতাম। তবে হ্যাঁ কোডটি এখন 4 বছরের পুরানো এবং উন্নতি হতে পারে।
মার্টিন আলরিচ

এটি সম্ভবত সঠিক সমাধান। কীবোর্ড বিজ্ঞপ্তি অ্যানিমেশন ডেটা বহন করে, পাঠ্য ক্ষেত্রের প্রতিনিধিরা অ্যানিমেশন সময়কাল সম্পর্কে জানেন না, এটি কেবল অনুমানের কাজ হবে।
এক্সওয়াই

62

শিউন বলেছিলেন "এটি যেমন পরিণত হয়েছে, আমি বিশ্বাস করি যে ইউআইএসক্রলভিউ প্রকৃতপক্ষে প্রকৃতপক্ষে সম্পাদিত ইউআইটিেক্সটফিল্ডকে দৃশ্যমান উইন্ডোতে সুস্পষ্টভাবে এনেছে" এটি আইওএস ৩.১.৩-এর ক্ষেত্রে সত্য বলে মনে হয় তবে ৩.২, ৪.৪ বা ৪.১ নয়। ইউআইটিেক্সটফিল্ডটি আইওএস> = 3.2 এ দৃশ্যমান করার জন্য আমাকে একটি স্পষ্ট স্ক্রোলরেক্টটওভিজিবল যুক্ত করতে হয়েছিল।


এটি ইউআইএসক্রোলভিউ নয় যা সুস্পষ্টভাবে সম্পাদিত ইউআইটিেক্সটফিল্ডটিকে দৃশ্যে স্ক্রোল করে, এটির ইউআইটিেক্সটফিল্ড যা একটি ব্যক্তিগত [UITextField scrollTextFieldToVisibleIfNecessary]পদ্ধতিতে কল করে যা ডাকা হয় [UIScrollView scrollRectToVisible]যখন ডাকে calls Github.com/leopatras/ios_textfields_on_scrolview[UITextField becomeFirstResponder] দেখুন । যদি সীমাবদ্ধতা এবং দেখার নিয়ন্ত্রকগুলি সঠিকভাবে সেটআপ হয় তবে প্রকৃতপক্ষে স্পষ্টভাবে কল করার দরকার নেই (কমপক্ষে আইওএস 11 এর পরে)। scrollRectToVisible
লিও

48

একটি বিষয় বিবেচনা করতে হবে তা হল আপনি UITextFieldনিজেরাই কখনও এটি ব্যবহার করতে চান কিনা । আমি আসলে এমন কোনও আইফোন অ্যাপ্লিকেশন ব্যবহার করতে পারি নি যা প্রকৃতপক্ষে UITextFieldsবাইরে ব্যবহার করে UITableViewCells

এটি কিছু অতিরিক্ত কাজ হবে তবে আমি আপনাকে সমস্ত ডেটা এন্ট্রি এক সারণী দর্শন দেখানোর বাস্তবায়ন করার পরামর্শ দিচ্ছি। আপনার একটিতে যুক্ত UITextViewকরুন UITableViewCells


1
আমার অ্যাপ্লিকেশনগুলির একটিতে ব্যবহারকারীদের ফ্রিফর্ম নোটগুলি যুক্ত করার অনুমতি দেওয়া দরকার - তাই হ্যাঁ এটি কখনও কখনও ইউআইটিেক্সটফিল্ড ব্যবহার করা কার্যকর।
পিটার জনসন

1
আমি এই পদ্ধতির সাথে একমত জিরো এইভাবে কাজ বা কোড। এমনকি যদি আপনার ফ্রি ফর্ম নোটের প্রয়োজন হয় তবে আপনি এখনও কোনও টেবিল সেল দিয়ে করতে পারেন
আরজেএইচ

UITableViewদুঃখের বিষয় হল একমাত্র উপায়। কীবোর্ড বিজ্ঞপ্তিগুলি ভঙ্গুর এবং অতিরিক্ত সময়ের পরিবর্তিত হয়েছে। স্ট্যাক ওভারফ্লো উপর নমুনা কোড: stackoverflow.com/a/32390936/218152
SwiftArchitect

এই উত্তরটি পাঁচ বছরের পুরানো। একমাত্র আধুনিক সমাধান হ'ল এরকম ... স্ট্যাকওভারফ্লো
a/

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

স্ক্রিনটি নীচে না থাকলেও উপরে চলে যায়। যেমন, পাঠ্য ক্ষেত্রটি শীর্ষে থাকলে এটি স্ক্রিনের বাইরে চলে যায়। কিভাবে এই মামলা নিয়ন্ত্রণ করতে?
মেলউইন

@ মেলউইন কেবল এই লাইনের পরে যুক্ত করুন: int movement = (up ? -movementDistance : movementDistance); if (textField.frame.origin.y < self.view.frame.size.height - keyboard.height) { movementDistance = 0 }দয়া করে keyboardভেরিয়েবলটি যে কীবোর্ডের সিজিআরেক্ট যা আপনি এটির মাধ্যমে পপ করে যাবেন তা নয়:let keyboard = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey]!.CGRectValue())!
ক্যাপচারড্রি

31

লিটল ফিক্স যা অনেকগুলি ইউআইটিেক্সটফিল্ডগুলির জন্য কাজ করে

#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

আমি নিশ্চিত না যে ভিউটি উপরে স্থানান্তর করা যদি সঠিক পদ্ধতির হয় তবে আমি এটি ইউআইএসক্রোলভিউয়ের আকার পরিবর্তন করে পৃথক উপায়ে করেছি। আমি একটি সামান্য নিবন্ধে বিশদ এটি ব্যাখ্যা


নিবন্ধটির লিঙ্কটি মারা গেছে।
টিও

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: আমি আশা করি কোডটি কাউকে দ্রুত কাঙ্ক্ষিত কার্যকর করতে সহায়তা করে। (এক্সকোড 4.5)


হাই হটজার্ড, আমি [স্ব.উইউভিউ অ্যাডসউউভিউ: ন্যাটভিউ] এ EXE_BAD_ACCESS পাচ্ছি;
বালা

18

@ user271753

আপনার দর্শনটি মূল অ্যাডে ফিরে পেতে:

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

16

দেখার ফ্রেমটি সরাতে সক্ষম হতে এটির জন্য কোনও স্ক্রোল ভিউ প্রয়োজন হয় না। আপনি একটি viewcontroller'sদৃশ্যের ফ্রেম পরিবর্তন করতে পারেন যাতে পুরো ভিউ কীবোর্ডের উপরে প্রথম বর্ণনাকারীর পাঠ্য ক্ষেত্রটি রাখার জন্য যথেষ্ট পর্যায়ে চলে যায়। যখন আমি এই সমস্যায় পড়েছি তখন আমি UIViewControllerএটির একটি সাবক্লাস তৈরি করেছি । এটি পর্যবেক্ষণ করে কীবোর্ডটি বিজ্ঞপ্তি প্রদর্শিত হবে এবং এটি প্রথম প্রতিক্রিয়াশীল সাবউভিউটি সন্ধান করবে এবং (যদি প্রয়োজন হয়) এটি মূল দৃষ্টিভঙ্গিটিকে যথেষ্ট পর্যায়ে এনিমেট করে যাতে প্রথম প্রতিক্রিয়াকারী কীবোর্ডের উপরে থাকে। কীবোর্ডটি যখন আড়াল হয় তখন এটি যেখানে ছিল সেখানে দৃশ্যটি প্রাণবন্ত করে তোলে।

এই সাবক্লাসটি ব্যবহার করতে আপনার কাস্টম ভিউ কন্ট্রোলারকে GMKeyboardVC এর একটি সাবক্লাস তৈরি করুন এবং এটি এই বৈশিষ্ট্যটি উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে (আপনি বাস্তবায়ন করেন কিনা তা নিশ্চিত হন viewWillAppearএবং viewWillDisappearতাদের অবশ্যই সুপার বলা উচিত)। ক্লাসটি গিথুবে রয়েছে


কি লাইসেন্স? আপনার কয়েকটি ফাইলের ওপেন সোর্স লাইসেন্স রয়েছে এবং কিছুতে নেই।
jaime

সতর্কতা: এই কোডটি আরসি প্রকল্পগুলির সাথে বন্ধুত্বপূর্ণ নয়।
অলমো

আপনি কেবল বিল্ড বিকল্পটি যুক্ত করে নির্দিষ্ট করুন যে সেগুলি নন-এআরসি ফাইল বা এটিআরসি তে রূপান্তর করতে এবং একটি অনুরোধ জমা দেওয়ার জন্য স্বাগত।
অগ্রগামী

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

এখানে একটি নির্দিষ্ট বিন্যাসের জন্য হ্যাক সমাধানটি নিয়ে এসেছি। এই দ্রষ্টব্যটি ম্যাট গ্যালাগার দ্রবণের অনুরূপ যা দেখতে কোনও বিভাগকে স্ক্রোল করে। আমি এখনও আইফোনের বিকাশে নতুন এবং লেআউটগুলি কীভাবে কাজ করে তা সম্পর্কে আমি পরিচিত নই। এইভাবে, এই হ্যাক।

ক্ষেত্রটিতে ক্লিক করার সময় স্ক্রোলিং সমর্থন করার জন্য এবং ব্যবহারকারী কীবোর্ডের পাশে ব্যবহারকারী নির্বাচন করলে স্ক্রোলিংয়ের জন্য আমার বাস্তবায়ন প্রয়োজন needed

আমার একটি ইউআইভিউ ছিল যার উচ্চতা 775 The কন্ট্রোলগুলি মূলত 3 টি গ্রুপে বড় জায়গার উপরে ছড়িয়ে পড়ে। আমি নিম্নলিখিত আইবি লেআউটটি দিয়ে শেষ করেছি।

UIView -> UIScrollView -> [UI Components]

এখানে হ্যাক আসে

আমি ইউআইএসক্রোলভিউ উচ্চতাটিকে 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] ;
}

এখন আপনাকে যা করতে হবে তা হল টেক্সটফিল্ডডিজাইনইডিটিং এবং টেক্সটফিল্ডশোল্ডার্টর্টে নিম্নলিখিত দুটি লাইন কোড ব্যবহার করা (যদি আপনি পরবর্তী ক্ষেত্রের নেভিগেশন তৈরি করছেন তবে এটির পরে)

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

এই পদ্ধতিটি অন্যান্য পদ্ধতির মতো 'পিছনে স্ক্রোল' করে না। এটি কোনও প্রয়োজন ছিল না। আবার এটি মোটামুটি 'লম্বা' ইউআইভিউয়ের জন্য ছিল এবং অভ্যন্তরীণ বিন্যাস ইঞ্জিনগুলি শিখতে আমার আর দিন নেই।


12

অনুযায়ী ডক্স , প্রয়োজন iOS 3.0 হিসাবে, UITableViewControllerবর্গ স্বয়ংক্রিয়ভাবে পরিবর্তন করা এবং তার টেবিল ভিউ repositions যখন ইন-লাইন পাঠ্য ক্ষেত্রের সম্পাদনা। আমি মনে করি UITableViewCellকিছু পাঠ্যক্ষেত্রের ভিতরে রাখার পক্ষে এটি যথেষ্ট নয় some

ডক্স থেকে :

একটি সারণী দর্শন নিয়ামক সারণী দর্শন সারিগুলির ইনলাইন সম্পাদনা সমর্থন করে; যদি উদাহরণস্বরূপ, সারিগুলি সম্পাদনা মোডে পাঠ্য ক্ষেত্রগুলি এম্বেড করে থাকে তবে এটি প্রদর্শিত ভার্চুয়াল কীবোর্ডের উপরে সারিটি সম্পাদনা করে স্ক্রোল করে।


আমি একই মন্তব্য পেয়েছি। হ্যাঁ এটা সত্য. আশ্চর্যের বিষয়টি হ'ল এটি একটি ইউআইটিবেলভিউ কনট্রোলার এবং অন্যটিতে নয় is তবে আমার বাস্তবায়নে আমি কোনও পার্থক্য খুঁজে পাইনি।
মরফিউস 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];
}

ধাপ ২

যথাক্রমে ভিউপল্লিয়ার এবং ভিউইলডিস্পায়ার পদ্ধতিতে কীপ্যাড বিজ্ঞপ্তিগুলি নিবন্ধন করুন এবং নিবন্ধন করুন ।

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

উল্লেখ : ভাল, দয়া করে এই লোকটির প্রশংসা করুন , যিনি এই সুন্দর কোড স্নিপ, পরিষ্কার সমাধান ভাগ করেছেন।

আশা করি এটি কোনওরকমভাবে সহায়ক হবে।


আমি মনে করি না এটি সেরা। ইথিংক @ ধীরাজ ভিএস সঠিক: এটি পাঠ্যক্ষেত্রটি কোনও টেবিলের ঘরে থাকে (এমনকি যখন টেবিলের স্ক্রোলযোগ্য = কোনও নয়) এটি সহজে এবং স্বয়ংক্রিয়ভাবে করা যায়দ্রষ্টব্য : টেবিলের অবস্থান এবং আকার অবশ্যই যুক্তিসঙ্গত হতে হবে। উদাহরণস্বরূপ: - যদি টেবিলের y অবস্থানটি ভিউয়ের নীচ থেকে 100 টি গণনা করা হয়, তবে 300 উচ্চতার কীবোর্ড পুরো টেবিলটিকে ওভারল্যাপ করবে। - যদি টেবিলের উচ্চতা = 10 এবং এটিতে পাঠ্যক্ষেত্রটি অবশ্যই 100 টি স্ক্রোল করা উচিত যখন কীবোর্ড দৃশ্যমান হওয়ার জন্য প্রদর্শিত হয়, তবে সেই পাঠ্যক্ষেত্রটি সারণির গণ্ডির বাইরে থাকবে।
samthui7

@ সাম্থুই D ধীরাজ উত্তর কেবলমাত্র যদি আপনি টেবিলভিউ কনট্রোলার ব্যবহার করেন তবে কেবলমাত্র একটি টেলভিউ নয়। এটি এটিকে একটি বাধা করে তোলে যা কখনও কখনও উপযুক্ত না isn't
বেন জি

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অস্পষ্ট সারি দৃশ্যমান হয় না।
অ্যাডাম জনস

9

এই তৃতীয় পক্ষটি ব্যবহার করুন আপনার এমনকি একটি লাইনও লেখার দরকার নেই

https://github.com/hackiftekhar/IQKeyboardManager

প্রকল্প ডাউনলোড করুন এবং টেনে আনুন এবং ছেড়ে দিন IQKeyboardManager এবং আপনার প্রকল্পে । যদি কোনও সমস্যা খুঁজে পান তবে READMEডকুমেন্টটি পড়ুন।

ছেলেরা কীবোর্ড পরিচালনা করতে মাথা ব্যাথা দূর করে really


8

বিঃদ্রঃ : এই উত্তরটি ধরে নেয় আপনার পাঠ্য ফিল্ডটি একটি স্ক্রোলভিউতে রয়েছে।

আমি আমার ভিউ এর ফ্রেমগুলির সাথে ঝামেলা না করে স্ক্রোলকন্টেন্টসেট এবং স্ক্রোলকন্টেন্ট অফসেট ব্যবহার করে এটি মোকাবেলা করতে পছন্দ করি।

প্রথমে কীবোর্ড বিজ্ঞপ্তিগুলি শুনি

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

পরবর্তী পদক্ষেপটি এমন একটি সম্পত্তি রাখে যা বর্তমান প্রথম প্রতিক্রিয়াকারীকে প্রতিনিধিত্ব করে (বর্তমানে কীবোর্ড রয়েছে এমন ইউআইটিেক্সটফিল্ড / ইউআইটিেক্সটভিউ)।

আমরা এই সম্পত্তি সেট করতে প্রতিনিধি পদ্ধতি ব্যবহার করি। আপনি যদি অন্য কোনও উপাদান ব্যবহার করছেন তবে আপনার অনুরূপ কিছু প্রয়োজন হবে।

নোট করুন যে পাঠ্যক্ষেত্রের জন্য আমরা এটিকে doBeginEditing এ সেট করেছি এবং পাঠ্যদর্শনটির জন্য shouldBeginEditing এ সেট করেছি। এটি কারণ যে কোনও কারণে UIKeyboardWillShowNotifications এর পরে পাঠ্য ভিউডিডবিগইনএডিটিং কল হয়।

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

এটি স্যুইফ্ট ব্যবহার করে সমাধান using

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
    }

}

সঠিক উত্তর, তবে টেক্সটফিল্ড এবং টেক্সটভিউ উভয় ব্যবহার করার সময় আমার শূন্য সমস্যা হচ্ছে। কোন সাহায্য?
থিহা অং

@ থিহা অং, আপনার সোর্স কোডে কি আইবিআউটলেট ভেরিয়েবলগুলি আইবির সাথে সংযুক্ত রয়েছে?
হোমম

হ্যাঁ তারাও সংযুক্ত রয়েছে that সেই লাইনে ইউআইটিেক্সটভিউ ব্যবহার করার সময় কেবল ত্রুটি রয়েছে: যদি (! সিজিআরেক্টটেকটেনসপয়েন্ট (act, self.activeTextField.frame.origin)) {
থিহা অং

মানে স্ব.অ্যাক্টিভেক্সটফিল্ড শূন্য
থিহা অং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.