ios - yunes - ipad



কীভাবে কীবোর্ডটি উপস্থিত থাকলে আমি কীভাবে একটি UITextField সরাতে পারি? (20)

সুইফ্ট প্রোগ্রামারদের জন্য:

এটি আপনার জন্য সবকিছু করবে, কেবল আপনার ভিউ কন্ট্রোলার ক্লাসে UITextFieldDelegate এবং আপনার ভিউ কন্ট্রোলারকে UITextFieldDelegate প্রয়োগ করুন এবং UITextFieldDelegate প্রতিনিধিটিকে self সেট করুন

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

প্রতিনিধি callback পদ্ধতি বাস্তবায়ন:

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

https://ffff65535.com

আইওএস এসডিকে দিয়ে:

আমি একটি UITextField আছে UITextField গুলি যে একটি কীবোর্ড আপ আনতে। আমি এটা করতে সক্ষম হবে:

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

  2. স্বয়ংক্রিয়ভাবে "লাফ" (স্ক্রোলিং দ্বারা) বা শর্টকাট

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

আমি একটি UIScrollView এবং একটি UIScrollView উভয় প্রয়োজন? এক অন্য ভিতরে যেতে না?

স্বয়ংক্রিয় টেক্সট ক্ষেত্র স্বয়ংক্রিয়ভাবে স্ক্রোল করার জন্য কি প্রয়োগ করা প্রয়োজন?

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

দ্রষ্টব্য: UIScrollView (অথবা UIScrollView ) যা আমি সাথে কাজ করছি তা একটি UITabBar ( UITabBar ) দ্বারা আনা হয়, যা স্বাভাবিক হিসাবে কাজ করতে হবে।

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

কীবোর্ডটি উপরে ও নিচে গেলে আমি UIScrollView এর ফ্রেম আকার পরিবর্তন করতে 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
}

যাইহোক, এটি স্বয়ংক্রিয়ভাবে দৃশ্যমান এলাকার নিম্নতর পাঠ্য ক্ষেত্রগুলিকে "সরানো" বা কেন্দ্র করে না, যা আমি সত্যিই পছন্দ করি।


এখানে আমি কীপ্যাড হ্যান্ডেল করার সবচেয়ে সহজ সমাধান খুঁজে পেয়েছি।

আপনাকে নমুনা কোডের নীচে কেবল কপি-পেস্ট করতে হবে এবং আপনার পাঠ্যক্ষেত্র বা যে কোন দৃশ্যটি আপনি আপলোড করতে চান তা পরিবর্তন করতে হবে।

ধাপ 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];
}

ধাপ ২

নিবন্ধন করুন এবং দেখুন কীপ্যাড বিজ্ঞপ্তি DeWisterWillAppear এবং 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];
}

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

এই আউট surly সহায়ক কেউ হবে আশা করি।


আমি একটি সার্বজনীন, ড্রপ-ইন UIScrollView , UITableView এবং এমনকি UICollectionView UITableView একসাথে UICollectionView যা UICollectionView সমস্ত প্রান্তের ক্ষেত্রগুলিকে কীবোর্ডের বাইরে থেকে UICollectionView যত্ন নেয়।

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

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

এখানে 'tis: কীবোর্ডের মতো পাঠ্য ক্ষেত্রগুলি সরানোর জন্য সমাধান


আমি একাধিক UITextFields এর একটি UIScrollView রচনা রচনা নিয়ে অনেক সমস্যা নিয়ে UITextFields , যার মধ্যে একটি বা একাধিক UITextFields করা অবস্থায় কীবোর্ডের দ্বারা গোপন থাকবে।

আপনার UIScrollView সঠিকভাবে স্ক্রোল করা হয় না যদি বিবেচনা কিছু জিনিস এখানে।

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

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

3) এখানে ধরা হল: যখন আমি প্রথমে এটি প্রয়োগ করলাম তখন আমি CGRect পেতে এবং UIScrollView's স্ক্রোলটি পুনঃব্যবহারযোগ্য পদ্ধতিতে কল করতে হবে। আমি UITextFieldDelegate - UITextFieldDelegate পদ্ধতিতে কল দিয়ে UITextFieldDelegate পদ্ধতি textFieldDidBeginEditing UITextFieldDelegate প্রয়োগ করেছি। এটি আসলে একটি অদ্ভুত পার্শ্ব প্রতিক্রিয়া দিয়ে কাজ করেছে যা স্ক্রোলিংটি অবস্থানের মধ্যে UITextField স্ন্যাপ করবে। দীর্ঘতম সময়ের জন্য আমি এটা কি তা বুঝতে পারিনি। তারপর আমি textFieldDidBeginEditing পদ্ধতিতে মন্তব্য করেছি এবং এটি সব কাজ !! (???)। হিসাবে এটি চালু, আমি বিশ্বাস করি যে UIScrollView প্রকৃতপক্ষে বর্তমানে সম্পাদিত UITextField দৃশ্যমান উইন্ডোতে নিয়ে আসে। UITextFieldDelegate পদ্ধতিটির আমার বাস্তবায়ন এবং UITextFieldDelegate পরবর্তী কলটি অকার্যকর ছিল এবং অদ্ভুত পার্শ্ব প্রতিক্রিয়াটির কারণ ছিল।

সুতরাং এখানে আপনার 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 এ কীবোর্ড nofitications জন্য viewDidUnload
  3. UIScrollView সেট করা আছে এবং আপনার UIScrollView চেয়ে বড় এটি দেখুন নিশ্চিত করুন
  4. কীবোর্ড উপস্থিত থাকলে UIScrollView সঙ্কুচিত করুন
  5. কীবোর্ড চলে গেলে UIScrollView ফিরিয়ে UIScrollView
  6. ইউআইডিএক্সফিল্ডটি ট্যাবযুক্ত হওয়ার পরে কীবোর্ডটি ইতিমধ্যেই স্ক্রিনে দেখানো হয়েছে কিনা তা সনাক্ত করার জন্য আইভর ব্যবহার করুন, এমনকি যদি এটি ইতিমধ্যে সঙ্কুচিত হয় তবে UIScrollView সঙ্কুচিত হওয়া থেকে UIScrollView ইতিমধ্যে উপস্থিত থাকলেও ট্যাবযুক্ত হয়।

উল্লেখ্য একটি বিষয় হল যে UIKeyboardWillShowNotification যখন আপনি অন্য UITextField ট্যাবে টিপুন তখনই স্ক্রিনে থাকা অবস্থায়ও UITextField । কীবোর্ডটি ইতিমধ্যে স্ক্রিনে থাকলে UIScrollView পুনরায় UIScrollView এড়াতে আইভর ব্যবহার করে আমি এটি যত্ন করেছিলাম। UIScrollView কীবোর্ডটি ইতিমধ্যেই সেখানে বিধ্বংসী হবে যখন UIScrollView আকার পরিবর্তন!

এই কোড আপনি মাথাব্যথা অনেক সংরক্ষণ করে আশা করি।


developer.apple.com/library/ios/#documentation/StringsTextFonts/… ডকুমেন্ট এই সমস্যার একটি সমাধান বিস্তারিত। 'কীবোর্ডের অধীনে থাকা মুভিং সামগ্রী' এর অধীনে উত্স কোডটি দেখুন। এটা বেশ সহজবোধ্য।

সম্পাদনা করুন: উদাহরণস্বরূপ একটি তরমুজ গ্লিট আছে লক্ষ্য করা। আপনি সম্ভবত UIKeyboardWillHideNotificationপরিবর্তে শুনতে চাই UIKeyboardDidHideNotification। অন্যথায় কীবোর্ডের পিছনে স্ক্রল ভিউ কীবোর্ড বন্ধ করা অ্যানিমেশনের সময়কালের জন্য ক্লিপ করা হবে।


docs সরবরাহ করা হিসাবে এটি অ্যাপল এর বাস্তবায়ন ব্যবহার করা ঠিকই সেরা। তবে, কোড তারা প্রদান ত্রুটিপূর্ণ। KeyboardWasShown এ পাওয়া অংশটি প্রতিস্থাপন করুন 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];
}

অ্যাপল এর ScrollView হল: (1) পয়েন্টটি যদি দৃশ্যের ফ্রেমের মধ্যে থাকে তবে এটি সর্বদা হিসাব করে তবে এটি স্ক্রল ScrollView , এটি ইতিমধ্যে স্ক্রোল করা হয়েছে এবং আপনাকে সেই ScrollView জন্য অ্যাকাউন্টের প্রয়োজন হবে:

origin.y -= scrollView.contentOffset.y

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

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

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

UITextField 1: - আমি একটি UIKeyboard ক্লাসে UITextField , UITextView , এবং UIKeyboard এর বিশ্বব্যাপী বিজ্ঞপ্তি যোগ করেছি। আমি এটা IQKeyboardManager কল।

UIKeyboardWillShowNotification : - যদি UIKeyboardWillShowNotification পাওয়া যায়, UITextFieldTextDidBeginEditingNotification বা UITextViewTextDidBeginEditingNotification বিজ্ঞপ্তিগুলি, আমি UIWindow.rootViewController অনুক্রম থেকে topMostViewController উদাহরণ পেতে চেষ্টা করি। UITextField / UITextView এটিকে সঠিকভাবে উন্মোচন করতে, topMostViewController.view এর ফ্রেমটি সামঞ্জস্য করা দরকার।

ধাপ 3: - আমি প্রথম প্রতিক্রিয়াশীল UITextField / UITextView প্রতি সম্মান সহ topMostViewController.view প্রত্যাশিত পদক্ষেপের দূরত্ব গণনা UITextView

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

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

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

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

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

কোড এর কোন লাইন সত্যিই আপনার জন্য সব IQKeyboardManager কি !! শুধুমাত্র প্রকল্পের জন্য সম্পর্কিত উৎস ফাইল ড্র্যাগ এবং ড্রপ করতে হবে। IQKeyboardManager এছাড়াও ডিভাইস ওরিয়েন্টেশন , স্বয়ংক্রিয় UIToolbar পরিচালনা , কীবিবোর্ড ডিস্টেন্স FromTextField এবং আপনি মনে করার চেয়ে অনেক বেশি সমর্থন করে।


দ্রষ্টব্য : এই উত্তরটি আপনার TextField একটি স্ক্রল ভিউতে অনুমান করে।

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

প্রথম এর কীবোর্ড বিজ্ঞপ্তি জন্য শুনতে দিন

//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 যা বর্তমানে কীবোর্ড আছে) উপস্থাপন করে।

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

উল্লেখ্য যে টেক্সটফিল্ডের জন্য আমরা এটি বিজিন এডিটিংয়ে এবং TextView এর জন্য BegginEditing এ সেট করেছি। এই কারণেই কিছু কারণে UIVeyboardWillShowNotification পরে TextViewDidBeginEditing কল করা হয়।

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

সবচেয়ে সহজ সমাধান খুঁজে পাওয়া যায় নি

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

সুইফ্ট 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
    }

}

অনেক 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]; 
}

আসল ভিউ অবস্থা ফিরে আনা, যোগ করুন:

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

এই সংক্ষিপ্ত কৌশল চেষ্টা করুন ...

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

শুভ কোডিং:) ....


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

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
    }

}

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

ডক্স থেকে :

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


অনেক সমাধান আছে, কিন্তু আমি কাজ শুরু করার কয়েক ঘন্টা আগে ব্যয় করেছি। তাই, আমি এখানে এই কোডটি রেখেছি (শুধু প্রকল্পটিতে পেস্ট করুন, কোনও পরিবর্তন দরকার নেই):

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


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

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

আমার একটি UIView ছিল 775 এর উচ্চতার সাথে। নিয়ন্ত্রণগুলি মূলত 3 টি বড় বড় স্থানে ছড়িয়ে পড়ে। আমি নিম্নলিখিত আইবি বিন্যাস সঙ্গে শেষ পর্যন্ত।

UIView -> UIScrollView -> [UI Components]

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

আমি বাস্তব সজ্জা (1250) তারপর 500 ইউনিট বড় UIScrollView উচ্চতা সেট। আমি তখন স্ক্রোল করার জন্য পরম অবস্থানগুলির সাথে একটি অ্যারে তৈরি করেছি এবং আইবি ট্যাগ নম্বরের ভিত্তিতে তাদের পেতে একটি সাধারণ ফাংশন তৈরি করেছি।

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

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


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

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


বিষয়টিতে নতুনদের জন্য একটি ভাল টিউটোরিয়াল অনুসন্ধান করা হয়েছে, here সেরা টিউটোরিয়াল পাওয়া গেছে ।

ইন MIScrollView.hটিউটোরিয়ালের নীচে উদাহরণ একটি স্থান করা নিশ্চিত করা

@property (nonatomic, retain) id backgroundTapDelegate;

যেমন তুমি দেখো.


যখন 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];
}




uikeyboard