পাঠ্য ক্ষেত্রটি নির্বাচন করা হলে একটি ইউআইটিএবলভিউ স্ক্রোল তৈরি করা


251

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

আমার একটি রয়েছে UITableViewযা কাস্টম সেল দ্বারা গঠিত। ঘরগুলি একে অপরের পাশে 5 পাঠ্য ক্ষেত্রগুলি দিয়ে তৈরি করা হয় (গ্রিডের মতো সাজানো)।

আমি যখন নীচের অংশে ঘরগুলি স্ক্রোল করে সম্পাদনা করার চেষ্টা করি, তখন আমি কক্ষীবদ্ধের UITableViewউপরে আমার ঘরগুলি যথাযথভাবে পজিশনে রাখতে পারি না।

আমি ভিউয়ের আকারগুলি পরিবর্তন করার বিষয়ে অনেক উত্তর দেখেছি, ইত্যাদি ... তবে এর মধ্যে এখনও পর্যন্ত কেউই সুন্দরভাবে কাজ করেনি।

কেউ কি কংক্রিটের কোড উদাহরণ দিয়ে এটি করার জন্য "সঠিক" উপায়টি স্পষ্ট করতে পারেন?


11
এই অ্যাপল ডকুমেন্টেশন এই প্রশ্নের সমাধান কার্যকর করার পদক্ষেপের রূপরেখা দেয়। http://developer.apple.com/library/ios/#docamentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
ChrisP

@ ক্রিসিপ লিঙ্কটি জানিয়েছে যে এটি আইওএস ৩.০ এর জন্য আপডেট করা হয়নি
বায়ে

এই কোডটি সহায়ক হতে পারে: gist.github.com/TimMedcalf/9505416
landonandrey

Url এর নীচে অনুসরণ করুন, এটি কাজ করবে: stackoverflow.com/questions/48922266/…
ভেঙ্কটেশ জি

উত্তর:


126

আপনি যদি ইউআইভিউউকন্ট্রোলারের পরিবর্তে ইউআইটিএবল ভিউ কনট্রোলার ব্যবহার করেন তবে এটি স্বয়ংক্রিয়ভাবে তা করবে।


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

3
হ্যাঁ, তবে বিশেষত আইপ্যাডে আমাদের এটি করার একটি উপায় প্রয়োজন যা এতে ইউআইটিএবলভিউ নিয়ন্ত্রণকারীকে জড়িত না।
বব স্প্রিন

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

32
আপনি যদি [সুপার ভিউউইল অ্যাপয়ার: হ্যাঁ] ওভাররাইড করেন তবে এটি কাজ করবে না। তা বাদে এটি কাজ করা উচিত।
রামবাতিনো

18
যদি আপনি ভিউউইল অ্যাপয়ারকে ওভাররাইড করেন: (BOOL) অ্যানিমেটেড, [সুপার ভিউইল অ্যাপয়ার: অ্যানিমেটেড] কল করতে ভুলবেন না; :)
মাদারিক পেটিট

93

স্ক্রোলিং করে এমন ফাংশনটি আরও সহজ হতে পারে:

- (void) textFieldDidBeginEditing:(UITextField *)textField {
    UITableViewCell *cell;

    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
    // Load resources for iOS 6.1 or earlier
        cell = (UITableViewCell *) textField.superview.superview;

    } else {
        // Load resources for iOS 7 or later
        cell = (UITableViewCell *) textField.superview.superview.superview; 
       // TextField -> UITableVieCellContentView -> (in iOS 7!)ScrollView -> Cell!
    }
    [tView scrollToRowAtIndexPath:[tView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

এটাই. মোটেই হিসেব নেই।


2
এবং কেন না?! কেবলমাত্র ইউআইটিএবলভিস্ক্রোলপজিশনমিডেলের সাথে ইউআইটিএবলভিস্ক্রোলপজিশন টপ প্রতিস্থাপন করুন। অবশ্যই দৃশ্যমান অঞ্চলটি সামঞ্জস্য করতে আপনাকে কেবল ইউআইটিএবলভিউ পুনরুদ্ধার করতে হবে।
মিহাই দামিয়ান

3
কোনও ইউআইটিবেবলভিউ কনট্রোলার কীবোর্ড দেখানোর সময় টেবিল ভিউ পুনরায় আকার দেওয়ার জন্য যত্ন নিয়ে কাজ করেছে বলে মনে হচ্ছে না: কন্ট্রোলার একটি দিয়ে দৃশ্যমান আকার হ্রাস করে contentInset, যা জিজ্ঞাসা করার সময় দৃশ্যত বিবেচনায় নেওয়া হয় না visibleRowsবা indexPathsForVisibleRows
জুলিয়ান ডি

16
টেবিল দৃশ্যের শেষ কয়েক সারিতে কাজ করে না। কীবোর্ডটি এমন সমস্ত সারি अस्पष्ट করবে যা কীবোর্ডের উপরে স্ক্রল করা যায় না।
অ্যালেক্স জাভাটোন

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

10
সুপারভিউতে কলগুলির একটি শৃঙ্খলের মাধ্যমে কক্ষে পৌঁছানো বিশ্বাসযোগ্য নয়, যদি না আপনি নিশ্চিত হন যে আপনি আসলে ঘরে আসছেন। দেখুন stackoverflow.com/a/17757851/1371070 এবং stackoverflow.com/a/17758021/1371070
cezar

70

আমি খুব সাধারণ কিছু করছি যা জেনেরিক, আপনার কোডের জন্য নির্দিষ্ট কিছু গণনা করার দরকার নেই। কেবল কোডে মন্তব্যগুলি পরীক্ষা করুন:

মাইইউআইভিউকন্ট্রোল.আর

@interface MyUIViewController: UIViewController <UITableViewDelegate, UITableViewDataSource>
{
     UITableView *myTableView;
     UITextField *actifText;
}

@property (nonatomic, retain) IBOutlet UITableView *myTableView;
@property (nonatomic, retain) IBOutlet UITextField *actifText;

- (IBAction)textFieldDidBeginEditing:(UITextField *)textField;
- (IBAction)textFieldDidEndEditing:(UITextField *)textField;

-(void) keyboardWillHide:(NSNotification *)note;
-(void) keyboardWillShow:(NSNotification *)note;

@end

মাইইউআইভিউকন্ট্রোলআর

@implementation MyUIViewController

@synthesize myTableView;
@synthesize actifText;

- (void)viewDidLoad 
{
    // Register notification when the keyboard will be show
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(keyboardWillShow:)
                                          name:UIKeyboardWillShowNotification
                                          object:nil];

    // Register notification when the keyboard will be hide
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(keyboardWillHide:)
                                          name:UIKeyboardWillHideNotification
                                          object:nil];
}

// To be link with your TextField event "Editing Did Begin"
//  memoryze the current TextField
- (IBAction)textFieldDidBeginEditing:(UITextField *)textField
{
    self.actifText = textField;
}

// To be link with your TextField event "Editing Did End"
//  release current TextField
- (IBAction)textFieldDidEndEditing:(UITextField *)textField
{
    self.actifText = nil;
}

-(void) keyboardWillShow:(NSNotification *)note
{
    // Get the keyboard size
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds];

    // Detect orientation
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect frame = self.myTableView.frame;

    // Start animation
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];

    // Reduce size of the Table view 
    if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
        frame.size.height -= keyboardBounds.size.height;
    else 
        frame.size.height -= keyboardBounds.size.width;

    // Apply new size of table view
    self.myTableView.frame = frame;

    // Scroll the table view to see the TextField just above the keyboard
    if (self.actifText)
      {
        CGRect textFieldRect = [self.myTableView convertRect:self.actifText.bounds fromView:self.actifText];
        [self.myTableView scrollRectToVisible:textFieldRect animated:NO];
      }

    [UIView commitAnimations];
}

-(void) keyboardWillHide:(NSNotification *)note
{
    // Get the keyboard size
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds];

    // Detect orientation
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect frame = self.myTableView.frame;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];

    // Increase size of the Table view 
    if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
        frame.size.height += keyboardBounds.size.height;
    else 
        frame.size.height += keyboardBounds.size.width;

    // Apply new size of table view
    self.myTableView.frame = frame;

    [UIView commitAnimations];
}

@end

সুইফট 1.2+ সংস্করণ:

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var activeText: UITextField!
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: Selector("keyboardWillShow:"),
            name: UIKeyboardWillShowNotification,
            object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: Selector("keyboardWillHide:"),
            name: UIKeyboardWillHideNotification,
            object: nil)
    }

    func textFieldDidBeginEditing(textField: UITextField) {
        activeText = textField
    }

    func textFieldDidEndEditing(textField: UITextField) {
        activeText = nil
    }

    func keyboardWillShow(note: NSNotification) {
        if let keyboardSize = (note.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            var frame = tableView.frame
            UIView.beginAnimations(nil, context: nil)
            UIView.setAnimationBeginsFromCurrentState(true)
            UIView.setAnimationDuration(0.3)
            frame.size.height -= keyboardSize.height
            tableView.frame = frame
            if activeText != nil {
                let rect = tableView.convertRect(activeText.bounds, fromView: activeText)
                tableView.scrollRectToVisible(rect, animated: false)
            }
            UIView.commitAnimations()
        }
    }

    func keyboardWillHide(note: NSNotification) {
        if let keyboardSize = (note.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            var frame = tableView.frame
            UIView.beginAnimations(nil, context: nil)
            UIView.setAnimationBeginsFromCurrentState(true)
            UIView.setAnimationDuration(0.3)
            frame.size.height += keyboardSize.height
            tableView.frame = frame
            UIView.commitAnimations()
        }
    }
}

বিজ্ঞপ্তিগুলি ব্যবহার করে এবং কীবোর্ডের উচ্চতা পাওয়ার সময় ডিভাইস অভিযোজন অন্তর্ভুক্ত করার সময় দুর্দান্ত ছিল, এর জন্য ধন্যবাদ! স্ক্রোলিং অংশটি কোনও কারণে আমার পক্ষে কাজ করে নি, তাই আমাকে এটি ব্যবহার করতে হয়েছিল:[tableView scrollToRowAtIndexPath: indexPath atScrollPosition: UITableViewScrollPositionMiddle animated: YES];
তাগুরু

7
আমার মনে হয় এটি এখানে সেরা উত্তর। খুব পরিষ্কার. কেবল দুটি জিনিস: 1) আপনার ভিউডিডল্ড কল করছে না [সুপার ভিউডিডলড] এবং ২) ফ্রেম.সাইজ.হাইট লাইনগুলিতে আমার কিছু ট্যাববার গণিতে ছিল। অন্যথায় নিখুঁত! ধন্যবাদ।
toxaq

3
এখানে টোকস্যাকের পরিবর্তনটি বর্ণিত হয়েছে: MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate]; CGFloat tabBarHeight = appDelegate.tabBarController.tabBar.frame.size.height; তারপরে আপনি কীবোর্ডের উচ্চতাটি যেখানেই ব্যবহার করুন কীবোর্ডের উচ্চতা থেকে ট্যাববার হাইট বিয়োগ করুন।
স্টিভ এন

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

1
@ ভবাইনরামণি সম্মত হয়েছেন। আমি কীবোর্ডটি ইতিমধ্যে প্রদর্শিত হচ্ছে কিনা তা মনে রাখার জন্য একটি সাধারণ বুলিয়ান সম্পত্তি যুক্ত করেছি এবং অপ্রয়োজনীয় হলে কোড পুনরায় কার্যকর করা এড়িয়ে চলে।
ডার্টি হেনরি

46

বার্টোমিয়েজ সেমাসেকিক সমাধানের উপর ভিত্তি করে সুইফট 3- এর সহজ সমাধান :

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(CreateEditRitualViewController.keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(CreateEditRitualViewController.keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

// MARK: Keyboard Notifications

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
        tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    UIView.animate(withDuration: 0.2, animations: {
        // For some reason adding inset in keyboardWillShow is animated by itself but removing is not, that's why we have to use animateWithDuration here
        self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
    })
}

একটি ছোট্ট বিশদ ... এর Notificationপরিবর্তে ব্যবহার NSNotificationকরা আরও "সুইফট 3-ওয়াই" হবে :-)
নিকোলাস মিয়ারি

এটি যদি নববার থাকে তবে এটি প্রতিস্থাপনে সহায়তা করবে - যদি ইউআইভিউ.অনিম্যাটকে ঘিরে থাকে তবে এর সাথে চার্জ দিন - যদি ফ্রেম = সেল্ফ-ন্যাভিগেশন কন্ট্রোলার?
শন দেব

যখন ঘূর্ণন ঘটে তখন লোডিংয়ে ত্রুটি থাকে এবং টেবিলভিউটি ম্যানুয়ালি স্ক্রোল করা হয় এমন কিছু সেল অদৃশ্য হয়ে যায়
জোথিকেনপাছি

ভাল সমাধান ধন্যবাদ! দ্রষ্টব্য - আর অপসারণকারক করার দরকার নেই।
নিক ম্যাককনেল

44

আমার একই সমস্যা ছিল কিন্তু লক্ষ্য করেছি যে এটি কেবলমাত্র একটি দৃষ্টিতে প্রদর্শিত হবে। সুতরাং আমি নিয়ন্ত্রণকারীদের মধ্যে পার্থক্য সন্ধান করতে শুরু করেছিলাম।

আমি খুঁজে পেয়েছি যে স্ক্রোলিং আচরণটি - (void)viewWillAppear:(BOOL)animatedসুপার ইনস্ট্যান্সের মধ্যে সেট করা আছে ।

সুতরাং এটির মতো বাস্তবায়ন করতে ভুলবেন না:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // your code
}

আর এটা কোন ব্যাপার না যদি আপনি ব্যবহার UIViewControllerবা UITableViewController; এটিকে UITableViewস্ব-দর্শনার্থের একটি সংক্ষিপ্তসার হিসাবে রেখে পরীক্ষা করে দেখুন UIViewController। এটা একই আচরণ ছিল। কলটি [super viewWillAppear:animated];অনুপস্থিত থাকলে দৃশ্যটি স্ক্রোল করার অনুমতি দেয় না।


1
এটি দুর্দান্তভাবে কাজ করেছে। আমি ভাবছিলাম যে লোকেরা কেন ইউআইটিবেলভিউ আমার জন্য এটি করবে এবং এটি এটি সমাধান করেছে। ধন্যবাদ!
অলিভারসএফ

5
আমারও সমস্যা ছিল, এই উত্তরটি এটি শীর্ষে করা উচিত!
এমিল মার্টিন

আমি নিজে থেকে এটি বের করার চেষ্টা করে অনেক সময় হারিয়েছি ... ধন্যবাদ;)
বুড়িডিনো

+1 একটু কাঁদতে শুরু করছিল, আমার সেই লাইনটি ছিল তবে আমারও দরকার [টেবিলভিউ কনট্রোলার ভিউ উইল অ্যাপয়ার: অ্যানিমেটেড]; কারণ আমি একটি ইউআইভিউকন্ট্রোলারে একটি ইউআইটিএবলভিউ কনট্রোলার যুক্ত করছি। আর অশ্রু নেই :)
কলিন লামারে

41

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

কেবল কীবোর্ডের উচ্চতা অনুসারে টেবিলভিউয়ের সামগ্রীটি সামঞ্জস্য করুন এবং তারপরে নীচে সেলটি স্ক্রোল করুন:

- (void)keyboardWasShown:(NSNotification *)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    self.myTableView.contentInset = contentInsets;
    self.myTableView.scrollIndicatorInsets = contentInsets;

    [self.myTableView scrollToRowAtIndexPath:self.currentField.indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

এবং অবশ্যই

- (void)keyboardWasHidden:(NSNotification *)aNotification
{
    [UIView animateWithDuration:.3 animations:^(void) 
    {
        self.myTableView.contentInset = UIEdgeInsetsZero;
        self.myTableView.scrollIndicatorInsets = UIEdgeInsetsZero;
    }];
}

এটা কি খুব সহজ? আমি কিছু অনুপস্থিত করছি? এখনও পর্যন্ত এটি আমার পক্ষে ভাল কাজ করছে, তবে যেমনটি আমি বলেছিলাম, আমি এটি রিংারের মাধ্যমে রাখিনি ...


আইএমও, এটি সেরা সমাধান। কেবলমাত্র আমি যা পরিবর্তন করব তা হ'ল আপনার হার্ডকোডড সময়কাল[aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]
অ্যান্ডি

এটা খুব সহজ। তবে একটি বিষয় যা আমি পেয়েছি তা হ'ল এটি পরিবর্তনকে অ্যানিমেটেড করবে না contentInsetএবং স্ক্রোলের সীমানাকে তীব্রভাবে পরিবর্তন করবে।
গীক

এটি আমার জন্য সবচেয়ে ভাল কাজ করেছে, তবে কয়েকটি সমস্যা। 1) আমি জানি না আপনি কোথায় "কারেন্টফিল্ড.ইনডেক্সপথ" পেতে পারেন, তাই আমাকে ক্ষেত্রের ট্যাগ হিসাবে সূচকপথ সংরক্ষণ করতে হবে এবং পরে সূচিপথ তৈরি করতে হবে। 2) টেবিলের শীর্ষে সারিগুলির জন্য কাজ করে না, এটি স্ক্রিনের বাইরে স্ক্রোল করে। কারেন্টফিল্ডের সূচকপথটি স্ক্রিনে ফিট করতে পারে তার চেয়ে বেশি হলে কেবলমাত্র স্ক্রোল করতে কিছু কোড যুক্ত করতে হয়েছিল। 3) আইপ্যাডে ল্যান্ডস্কেপ হলে কেবি সাইজ.উইথ (উচ্চতার পরিবর্তে) ব্যবহার করতে হয়েছিল
ট্র্যাভিস এম

দুঃখিত, আমরা আমাদের নিজস্ব কোডে এতটাই অভ্যস্ত হয়ে পড়েছি যে আমরা কখনও কখনও ভুলে যাই, তাই না? কারেন্টফিল্ড হ'ল বর্তমান পাঠ্য ক্ষেত্র যা আমি নিয়ে কাজ করছি এবং সূচকপথ এমন একটি এক্সটেনশান যা আমি ক্লাসে যুক্ত করেছি যা কেবল একটি এনএসআইন্ডেক্সপথ যুক্ত করে তাই আমি জানি যে এটি কোন ঘরে রয়েছে
মিকম

এটি যাওয়ার উপায়, কেবলমাত্র টেবিলের বৈশিষ্ট্যগুলি সংশোধন করার জন্য ফ্রেমগুলি ঘুরিয়ে দেওয়া নয়।
Nextorlg

35

আমি মনে করি আমি অ্যাপলের অ্যাপসের ব্যবহারের সাথে মেলে এমন সমাধান নিয়ে এসেছি।

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

[[NSNotificationCenter defaultCenter]
    addObserver:self
       selector:@selector(keyboardWillShow:)
           name:UIKeyboardWillShowNotification
         object:nil];
[[NSNotificationCenter defaultCenter]
    addObserver:self
       selector:@selector(keyboardWillHide:)
           name:UIKeyboardWillHideNotification
         object:nil];

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

-(void) keyboardWillShow:(NSNotification *)note
{
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &keyboardBounds];
    keyboardHeight = keyboardBounds.size.height;
    if (keyboardIsShowing == NO)
    {
        keyboardIsShowing = YES;
        CGRect frame = self.view.frame;
        frame.size.height -= keyboardHeight;

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:0.3f];
        self.view.frame = frame;
        [UIView commitAnimations];
    }
}

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

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame = textField.frame;
    CGFloat rowHeight = self.tableView.rowHeight;
    if (textField == textFields[CELL_FIELD_ONE])
    {
        frame.origin.y += rowHeight * CELL_FIELD_ONE;
    }
    else if (textField == textFields[CELL_FIELD_TWO])
    {
        frame.origin.y += rowHeight * CELL_FIELD_TWO;
    }
    else if (textField == textFields[CELL_FIELD_THREE])
    {
        frame.origin.y += rowHeight * CELL_FIELD_THREE;
    }
    else if (textField == textFields[CELL_FIELD_FOUR])
    {
        frame.origin.y += rowHeight * CELL_FIELD_FOUR;
    }
    CGFloat viewHeight = self.tableView.frame.size.height;
    CGFloat halfHeight = viewHeight / 2;
    CGFloat midpoint = frame.origin.y + (textField.frame.size.height / 2);
    if (midpoint < halfHeight)
    {
        frame.origin.y = 0;
        frame.size.height = midpoint;
    }
    else
    {
        frame.origin.y = midpoint;
        frame.size.height = midpoint;
    }
    [self.tableView scrollRectToVisible:frame animated:YES];
}

এটি বেশ সুন্দরভাবে কাজ করে বলে মনে হচ্ছে।


সুন্দর সমাধান। এটি পোস্ট করার জন্য ধন্যবাদ।
অ্যালেক্স রেনল্ডস

2
UIKeyboardBoundsUserInfoKeyআইওএস ৩.২ হিসাবে অবহিত করা হয়েছে। নীচে আমার সমাধানটি দেখুন যা সমস্ত বর্তমান আইওএস রিলিজ ≥ 3.0 এর জন্য কাজ করে। / @ আইফোনদেভ
অর্টউইন জেন্টজ

এটি হওয়া দরকারের চেয়ে জটিল ছিল। @ user91083 এর উত্তরটি সহজ ছিল এবং কাজ করে।
রিচার্ড ব্রাইটওয়েল

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

35

আপনি যদি ব্যবহার করতে পারেন তবে আপনি UITableViewControllerবিনামূল্যে কার্যকারিতা পাবেন। কখনও কখনও, তবে এটি কোনও বিকল্প নয়, বিশেষত যদি আপনার কেবলমাত্র না একাধিক মতামত প্রয়োজনUITableView

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

- (void)_keyboardWillShow:(NSNotification*)notification {
    if (self.navigationController.topViewController == self) {
        NSDictionary* userInfo = [notification userInfo];

        // we don't use SDK constants here to be universally compatible with all SDKs ≥ 3.0
        NSValue* keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardBoundsUserInfoKey"];
        if (!keyboardFrameValue) {
            keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardFrameEndUserInfoKey"];
        }

        // Reduce the tableView height by the part of the keyboard that actually covers the tableView
        CGRect windowRect = [[UIApplication sharedApplication] keyWindow].bounds;
        if (UIInterfaceOrientationLandscapeLeft == self.interfaceOrientation ||UIInterfaceOrientationLandscapeRight == self.interfaceOrientation ) {
            windowRect = IASKCGRectSwap(windowRect);
        }
        CGRect viewRectAbsolute = [_tableView convertRect:_tableView.bounds toView:[[UIApplication sharedApplication] keyWindow]];
        if (UIInterfaceOrientationLandscapeLeft == self.interfaceOrientation ||UIInterfaceOrientationLandscapeRight == self.interfaceOrientation ) {
            viewRectAbsolute = IASKCGRectSwap(viewRectAbsolute);
        }
        CGRect frame = _tableView.frame;
        frame.size.height -= [keyboardFrameValue CGRectValue].size.height - CGRectGetMaxY(windowRect) + CGRectGetMaxY(viewRectAbsolute);

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
        [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
        _tableView.frame = frame;
        [UIView commitAnimations];

        UITableViewCell *textFieldCell = (id)((UITextField *)self.currentFirstResponder).superview.superview;
        NSIndexPath *textFieldIndexPath = [_tableView indexPathForCell:textFieldCell];

        // iOS 3 sends hide and show notifications right after each other
        // when switching between textFields, so cancel -scrollToOldPosition requests
        [NSObject cancelPreviousPerformRequestsWithTarget:self];

        [_tableView scrollToRowAtIndexPath:textFieldIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }
}

- (void) scrollToOldPosition {
  [_tableView scrollToRowAtIndexPath:_topmostRowBeforeKeyboardWasShown atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)_keyboardWillHide:(NSNotification*)notification {
    if (self.navigationController.topViewController == self) {
        NSDictionary* userInfo = [notification userInfo];

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
        [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
        _tableView.frame = self.view.bounds;
        [UIView commitAnimations];

        [self performSelector:@selector(scrollToOldPosition) withObject:nil afterDelay:0.1];
    }
}   

এখানে ইন অ্যাপসেটেটিংস কিটে ক্লাসের সম্পূর্ণ কোড রয়েছে । এটি পরীক্ষা করতে, "সম্পূর্ণ তালিকা" শিশু ফলকটি ব্যবহার করুন যেখানে আপনি উপরে বর্ণিত পরিস্থিতিতে পরীক্ষা করতে পারেন।


আমি জানি না ধ্রুবকগুলির পরিবর্তে স্ট্রিংগুলি ব্যবহার করা দরকারী কিনা, কারণ অ্যাপল যদি কিছু কারণে অভ্যন্তরীণভাবে স্ট্রিং পরিবর্তন করার ধারণা আসে তবে আপনার সমাধানটি আর কাজ করছে না। অনুরূপভাবে

@ আই পোর্টেবল: আমি জানি এটি আদর্শ নয়। আপনি কি আরও ভাল সমাধানের প্রস্তাব দিতে পারেন যা সমস্ত সংস্করণ -৩.০ এ চলে?
অর্টউইন জেন্টজ

1
কবজির মতো কাজ করে তবে UIInterfaceOrientationPortraitUpsideDown এর জন্য নয়। তারপরে উচ্চতা হ্রাসের গণনাটিও পাশাপাশি উলটে করা উচিত: সিজিফ্লোট হ্রাস হাইট = কীবোর্ডআরেক্ট.সাইজ.হাইট - (সিজিআরেক্টগেটমিনিওয়াইউ (ভিউরেটঅ্যাক্সুট)) - সিজিআরেক্টগেটমিনি (উইন্ডোআরেক্ট));
ক্লাস

এটিতে আমার আইপ্যাড এবং সিমুলেটারে খুব লক্ষণীয় ভিজ্যুয়াল গ্লিচ রয়েছে (৪.৩)। ব্যবহার করার জন্য খুব লক্ষণীয়। :(
বব স্প্রিন

আমি পছন্দ করি যে এই সমাধানটি স্ক্রিনের নীচে একটি সরঞ্জামদণ্ডের জন্য অ্যাকাউন্ট করবে।
pdemarest

24

সুইফটের সহজ সমাধান :

override func viewDidLoad() {
    super.viewDidLoad()

    searchBar?.becomeFirstResponder()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyViewController.keyboardWillShow(_:)), name: UIKeyboardDidShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyViewController.keyboardWillHide(_:)), name: UIKeyboardDidHideNotification, object: nil)
}

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        if let keyboardHeight = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue.size.height {
            tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
        }
    }
}

func keyboardWillHide(notification: NSNotification) {
    UIView.animateWithDuration(0.2, animations: { self.table_create_issue.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) })
    // For some reason adding inset in keyboardWillShow is animated by itself but removing is not, that's why we have to use animateWithDuration here
    }

নিখুঁতভাবে কাজ করে, ন্যূনতম গণনা প্রয়োজন। এই উত্তরটি শেষ করতে আমি এমন কিছু কোড যুক্ত করেছি যা টেবিল ইনসেটগুলি পুনরুদ্ধার করে।
ভিটালি

সেরা সমাধান ধন্যবাদ। : আমি পোস্ট সুইফট 3 সংস্করণ এখানে করেছি stackoverflow.com/a/41040630/1064438
squall2022

কখনও কখনও দুর্দান্ত নিখুঁত সমাধান দেখা যায়, আমি অন্যদের চেষ্টা করেছি কিন্তু কিছু সমস্যা আছে। আপনি আইওএস 10.2 এ নিখুঁতভাবে কাজ করেন।
ওয়াংডু লিন

8

আমি আশা করি আপনি ইতিমধ্যে সমস্ত সমাধান পড়ে সমাধান পেয়েছেন। তবে আমি আমার সমাধানটি নীচে পেয়েছি। আমি আশা করছি যে আপনার ইতিমধ্যে একটি ঘর আছে UITextField। তাই প্রস্তুতি নেওয়ার জন্য কেবল পাঠ্য ক্ষেত্রের ট্যাগটিতে সারি সূচক রাখুন।

cell.textField.tag = IndexPath.row;

নীচের মতো বিশ্বব্যাপী সুযোগ সহ একটি activeTextFieldউদাহরণ তৈরি করুন UITextField:

@interface EditViewController (){

    UITextField *activeTextField;

}

সুতরাং, এখন আপনি কেবল আমার কোডটি পেস্ট শেষে অনুলিপি করুন। এবং যোগ করতে ভুলবেন নাUITextFieldDelegate

#pragma mark - TextField Delegation

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{

    activeTextField = textField;

    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField{

    activeTextField = nil;

}

কীবোর্ড নিবন্ধন করুন notifications

#pragma mark - Keyboard Activity

- (void)registerForKeyboardNotifications

{

    [[NSNotificationCenter defaultCenter] addObserver:self

                                         selector:@selector(keyboardWasShown:)

                                             name:UIKeyboardDidShowNotification object:nil];



    [[NSNotificationCenter defaultCenter] addObserver:self

                                         selector:@selector(keyboardWillBeHidden:)

                                             name:UIKeyboardWillHideNotification object:nil];



}

হ্যান্ডলগুলি কীবোর্ড Notifications:

UIKeyboardDidShowNotificationপাঠানো হলে কল করা হয়।

- (void)keyboardWasShown:(NSNotification*)aNotification

{

    NSDictionary* info = [aNotification userInfo];

    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);

    [self.tableView setContentInset:contentInsets];

    [self.tableView setScrollIndicatorInsets:contentInsets];

    NSIndexPath *currentRowIndex = [NSIndexPath indexPathForRow:activeTextField.tag inSection:0];

    [self.tableView scrollToRowAtIndexPath:currentRowIndex atScrollPosition:UITableViewScrollPositionTop animated:YES];

}

UIKeyboardWillHideNotificationপাঠানো হলে কল করা হয়

- (void)keyboardWillBeHidden:(NSNotification*)aNotification

{

    UIEdgeInsets contentInsets = UIEdgeInsetsZero;

    [self.tableView setContentInset:contentInsets];

    [self.tableView setScrollIndicatorInsets:contentInsets];

}

এখন একটি জিনিস বাকি আছে, registerForKeyboardNotificationsপদ্ধতিতে পদ্ধতিতে নীচে কল করুন ViewDidLoad:

- (void)viewDidLoad {

    [super viewDidLoad];

    // Registering keyboard notification

    [self registerForKeyboardNotifications];

    // Your codes here...

}

আপনি হয়ে গেছেন, আশা করি আপনার textFieldsকীবোর্ডের সাহায্যে আর লুকানো থাকবে না।


6

বিভিন্ন উত্তর (বিশেষত অর্টউইন জেন্টজ, ব্যবহারকারী 98013) এবং অন্য পোস্টের শূন্যস্থান একত্রিত করা এবং পূরণ করা, এটি প্রতিকৃতি বা ল্যান্ডস্কেপ মোডে একটি আইপ্যাডে এসডিকে ৪.৩ এর বাক্সের বাইরে কাজ করবে:

@implementation UIView (FindFirstResponder)
- (UIResponder *)findFirstResponder
{
  if (self.isFirstResponder) {        
    return self;     
  }

  for (UIView *subView in self.subviews) {
    UIResponder *firstResponder = [subView findFirstResponder];
    if (firstResponder != nil) {
      return firstResponder;
    }
  }

  return nil;
}
@end

@implementation MyViewController

- (UIResponder *)currentFirstResponder {
  return [self.view findFirstResponder];
}

- (IBAction)editingEnded:sender {
  [sender resignFirstResponder];
}

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

- (void)textFieldDidBeginEditing:(UITextField *)textField {
  UITableViewCell *cell = (UITableViewCell*) [[textField superview] superview];
  [_tableView scrollToRowAtIndexPath:[_tableView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)keyboardWillShow:(NSNotification*)notification {
  if ([self currentFirstResponder] != nil) {
    NSDictionary* userInfo = [notification userInfo];

    // we don't use SDK constants here to be universally compatible with all SDKs ≥ 3.0
    NSValue* keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardBoundsUserInfoKey"];
    if (!keyboardFrameValue) {
      keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardFrameEndUserInfoKey"];
    }

    // Reduce the tableView height by the part of the keyboard that actually covers the tableView
    CGRect windowRect = [[UIApplication sharedApplication] keyWindow].bounds;
    CGRect viewRectAbsolute = [_tableView convertRect:_tableView.bounds toView:[[UIApplication sharedApplication] keyWindow]];
    CGRect frame = _tableView.frame;
    if (UIInterfaceOrientationLandscapeLeft == self.interfaceOrientation ||UIInterfaceOrientationLandscapeRight == self.interfaceOrientation ) {
      windowRect = CGRectMake(windowRect.origin.y, windowRect.origin.x, windowRect.size.height, windowRect.size.width);
      viewRectAbsolute = CGRectMake(viewRectAbsolute.origin.y, viewRectAbsolute.origin.x, viewRectAbsolute.size.height, viewRectAbsolute.size.width);
    }
    frame.size.height -= [keyboardFrameValue CGRectValue].size.height - CGRectGetMaxY(windowRect) + CGRectGetMaxY(viewRectAbsolute);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    _tableView.frame = frame;
    [UIView commitAnimations];

    UITableViewCell *textFieldCell = (id)((UITextField *)self.currentFirstResponder).superview.superview;
    NSIndexPath *textFieldIndexPath = [_tableView indexPathForCell:textFieldCell];

    // iOS 3 sends hide and show notifications right after each other
    // when switching between textFields, so cancel -scrollToOldPosition requests
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    _topmostRowBeforeKeyboardWasShown = [[_tableView indexPathsForVisibleRows] objectAtIndex:0];
    [_tableView scrollToRowAtIndexPath:textFieldIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
  }
}

- (void) scrollToOldPosition {
  [_tableView scrollToRowAtIndexPath:_topmostRowBeforeKeyboardWasShown atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)keyboardWillHide:(NSNotification*)notification {
  if ([self currentFirstResponder] != nil) {

    NSDictionary* userInfo = [notification userInfo];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    _tableView.frame = self.view.bounds;
    [UIView commitAnimations];

    [self performSelector:@selector(scrollToOldPosition) withObject:nil afterDelay:0.1];
  }
}   

@end

আমি এই আইওএসটি আইওএস ৪.x এ ঠিকঠাক ব্যবহার করেছি, তবে আইওএস 5 এ এটি স্ক্রোলটোল্ডপজিশনে ক্র্যাশ হয়ে গেছে কারণ _টোস্টোমরোউফেরফেরকিবোর্ডওয়াসশাউন ইতিমধ্যে ইতিমধ্যে মুক্তি পেয়েছে। সমাধান কী তা এখনও নিশ্চিত নয়। সম্ভবত অবজেক্টটির পরিবর্তে সূচকটি মনে রাখবেন।
টমাস টেম্পেলম্যান

5

আপনি যদি আপনার পাঠ্য ক্ষেত্রগুলি রাখার জন্য কোনও ব্যবহারযোগ্য ভিউ ব্যবহার করেন ( জেফ ল্যামারচে থেকে) ), আপনি কেবল ডেলিগেট পদ্ধতিটি ব্যবহার করে টেবিলভিউটি স্ক্রোল করতে পারেন।

(দ্রষ্টব্য: আমার পাঠ্য ক্ষেত্রগুলি টেবিলভিউতে সারি হিসাবে একই সূচি সহ একটি অ্যারেতে সঞ্চয় করা হয়)

- (void) textFieldDidBeginEditing:(UITextField *)textField
    {

        int index;
        for(UITextField *aField in textFields){

            if (textField == aField){
                index = [textFields indexOfObject:aField]-1;
            }
        }

         if(index >= 0) 
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

        [super textFieldDidBeginEditing:textField];
    }

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

5

কীবোর্ড বিজ্ঞপ্তিগুলি কাজ করে তবে এর জন্য অ্যাপলের নমুনা কোডটি ধরে নিয়েছে যে স্ক্রোল ভিউটি উইন্ডোর মূল দৃশ্য view সাধারণত এটি হয় না। সঠিক অফসেট পেতে আপনাকে ট্যাব বার ইত্যাদির জন্য ক্ষতিপূরণ দিতে হবে।

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

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification {
    if (keyboardShown)
        return;

    NSDictionary* info = [aNotification userInfo];

    // Get the frame of the keyboard.
    NSValue *centerValue = [info objectForKey:UIKeyboardCenterEndUserInfoKey];
    NSValue *boundsValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
    CGPoint keyboardCenter = [centerValue CGPointValue];
    CGRect keyboardBounds = [boundsValue CGRectValue];
    CGPoint keyboardOrigin = CGPointMake(keyboardCenter.x - keyboardBounds.size.width / 2.0,
                                         keyboardCenter.y - keyboardBounds.size.height / 2.0);
    CGRect keyboardScreenFrame = { keyboardOrigin, keyboardBounds.size };


    // Resize the scroll view.
    UIScrollView *scrollView = (UIScrollView *) self.tableView;
    CGRect viewFrame = scrollView.frame;
    CGRect keyboardFrame = [scrollView.superview convertRect:keyboardScreenFrame fromView:nil];
    hiddenRect = CGRectIntersection(viewFrame, keyboardFrame);

    CGRect remainder, slice;
    CGRectDivide(viewFrame, &slice, &remainder, CGRectGetHeight(hiddenRect), CGRectMaxYEdge);
    scrollView.frame = remainder;

    // Scroll the active text field into view.
    CGRect textFieldRect = [/* selected cell */ frame];
    [scrollView scrollRectToVisible:textFieldRect animated:YES];

    keyboardShown = YES;
}


// Called when the UIKeyboardDidHideNotification is sent
- (void)keyboardWasHidden:(NSNotification*)aNotification
{
    // Reset the height of the scroll view to its original value
    UIScrollView *scrollView = (UIScrollView *) self.tableView;
    CGRect viewFrame = [scrollView frame];
    scrollView.frame = CGRectUnion(viewFrame, hiddenRect);

    keyboardShown = NO;
}

UIKeyboardCenterEndUserInfoKeyএবং UIKeyboardBoundsUserInfoKeyআইওএস ৩.২ অনুসারে অবনতি হয়েছে। নীচে আমার সমাধানটি দেখুন যা সমস্ত বর্তমান আইওএস রিলিজ ≥ 3.0 এর জন্য কাজ করে।
অর্টউইন জেন্টজ 16

5

আপনি যদি ব্যবহার করেন Three20তবে autoresizesForKeyboardসম্পত্তিটি ব্যবহার করুন । আপনার ভিউ কন্ট্রোলারের -initWithNibName:bundleপদ্ধতিতে কেবল সেট করুন

self.autoresizesForKeyboard = YES

এটি যত্ন নেয়:

  1. কীবোর্ড বিজ্ঞপ্তিগুলির জন্য শুনছেন এবং টেবিল ভিউটির ফ্রেমটি সামঞ্জস্য করছেন
  2. প্রথম উত্তরদাতাকে স্ক্রোলিং

কাজ ও সম্পন্ন.


থ্রি -20 এখানে কী? আপনি যে নির্দিষ্ট করতে পারেন?
মুবিন মল

5

আমার পদ্ধতি:

আমি প্রথমে ইউআইটিেক্সটফিল্ড সাবক্লাস করি এবং একটি ইনডেক্সপথ সম্পত্তি যুক্ত করি। সেলফোর্ডে ... পদ্ধতিটি আমি সূচিপথের সম্পত্তি হস্তান্তর করি।

তারপরে আমি নিম্নলিখিত কোড যুক্ত করব:

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:textField.indexPath];

CGPoint cellPoint = [cell convertPoint:textField.center toView:self.tableView];
[UIView animateWithDuration:0.3 animations:^(void){self.tableView.contentOffset = CGPointMake(0, cellPoint.y-50);}];

পাঠ্য ফিল্ডশোল্ড / উইলব্যাগিন ... ইত্যাদি to

কীবোর্ড অদৃশ্য হয়ে গেলে আপনি এটিকে বিপরীত করতে হবে:

[UIView animateWithDuration:0.3 animations:^(void){self.tableView.contentOffset = CGPointMake(0, 0);}];

4

আরও একটি স্ট্রিম-রেঞ্জযুক্ত সমাধান। এটি ইউআইটিেক্সটফিল্ড প্রতিনিধি পদ্ধতিগুলিতে পিছলে যায়, সুতরাং এর জন্য ডাব্লু / ইউআইকিবোর্ডের বিজ্ঞপ্তিগুলির প্রয়োজন নেই।

বাস্তবায়ন নোট:

কেসেটেটিং রো হাইট - একটি ইউআইটিএবলভিউসেলের উচ্চতা।

অফসেটকারেট এবং অফসেটশ্রেটগুলি কেসেটিংস রো হাইটের বাইরে বন্ধ রয়েছে। আপনি যদি পৃথক সারি উচ্চতা ব্যবহার করেন তবে সেই মানগুলিকে পয়েন্টের y বৈশিষ্ট্যে সেট করুন। [Alt: একটি আলাদা উপায়ে অফসেট সারি গণনা করুন।]

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
CGFloat offsetTarget    = 113.0f; // 3rd row
CGFloat offsetThreshold = 248.0f; // 6th row (i.e. 2nd-to-last row)

CGPoint point = [self.tableView convertPoint:CGPointZero fromView:textField];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

CGRect frame = self.tableView.frame;
if (point.y > offsetThreshold) {
    self.tableView.frame = CGRectMake(0.0f,
                      offsetTarget - point.y + kSettingsRowHeight,
                      frame.size.width,
                      frame.size.height);
} else if (point.y > offsetTarget) {
    self.tableView.frame = CGRectMake(0.0f,
                      offsetTarget - point.y,
                      frame.size.width,
                      frame.size.height);
} else {
    self.tableView.frame = CGRectMake(0.0f,
                      0.0f,
                      frame.size.width,
                      frame.size.height);
}

[UIView commitAnimations];

return YES;

}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

CGRect frame = self.tableView.frame;
self.tableView.frame = CGRectMake(0.0f,
                  0.0f,
                  frame.size.width,
                  frame.size.height);

[UIView commitAnimations];

return YES;

}


4

UITextField's delegateপদ্ধতি ব্যবহার করুন :

দ্রুতগতি

func textFieldShouldBeginEditing(textField: UITextField) -> bool {
  let txtFieldPosition = textField.convertPoint(textField.bounds.origin, toView: yourTableViewHere)
  let indexPath = yourTablViewHere.indexPathForRowAtPoint(txtFieldPosition)
  if indexPath != nil {
     yourTablViewHere.scrollToRowAtIndexPath(indexPath!, atScrollPosition: .Top, animated: true)
  }
  return true
}

উদ্দেশ্য গ

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
  CGPoint txtFieldPosition = [textField convertPoint:CGPointZero toView: yourTablViewHere];
  NSLog(@"Begin txtFieldPosition : %@",NSStringFromCGPoint(txtFieldPosition));
  NSIndexPath *indexPath = [yourTablViewHere indexPathForRowAtPoint:txtFieldPosition];

  if (indexPath != nil) {
     [yourTablViewHere scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
  }
  return YES;
}

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

4

সুইফট 4.2 সম্পূর্ণ সমাধান

আমি প্রোটোকলের সেট দিয়ে জিআইএসটি তৈরি করেছি যা কীবোর্ড প্রদর্শিত, লুকানো বা পরিবর্তিত হলে অতিরিক্ত স্থান যুক্ত করে কাজকে সহজ করে ।

বৈশিষ্ট্য :

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

ব্যবহার

ভিউ কন্ট্রোলারে বেসিক ব্যবহারের উদাহরণ যেমন কিছু স্ক্রোল ভিউ থাকে (টেবিল ভিউ অবশ্যই সমর্থিত হয়)।

class SomeViewController: UIViewController {
  @IBOutlet weak var scrollView: UIScrollView!

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    addKeyboardFrameChangesObserver()
  }

  override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    removeKeyboardFrameChangesObserver()
  }
}

extension SomeViewController: ModifableInsetsOnKeyboardFrameChanges {
  var scrollViewToModify: UIScrollView { return scrollView }
}

কোর: ফ্রেম পর্যবেক্ষক পরিবর্তন করে

প্রোটোকল KeyboardChangeFrameObserverপ্রতিটি সময় কীবোর্ডের ফ্রেম পরিবর্তিত হওয়ার পরে ইভেন্ট প্রদর্শন করবে (দেখানো, লুকানো, ফ্রেম পরিবর্তন সহ)।

  1. কল করুন addKeyboardFrameChangesObserver()viewWillAppear()বা অনুরূপ পদ্ধতি।
  2. কল করুন removeKeyboardFrameChangesObserver()viewWillDisappear()বা অনুরূপ পদ্ধতি।

বাস্তবায়ন: স্ক্রোলিং ভিউ

ModifableInsetsOnKeyboardFrameChangesপ্রোটোকল UIScrollViewমূল প্রোটোকলে সমর্থন যোগ করে। কীবোর্ডের ফ্রেম পরিবর্তন করা হলে এটি স্ক্রোল ভিউয়ের ইনসেটগুলিকে পরিবর্তন করে।

আপনার ক্লাসে স্ক্রোল ভিউ সেট করা দরকার, কীবোর্ড ফ্রেমের পরিবর্তনে কারও কীটপতঙ্গ বৃদ্ধি / হ্রাস পাবে।

var scrollViewToModify: UIScrollView { get }

3

যেহেতু আপনার কোনও টেবিলে পাঠ্যক্ষেত্র রয়েছে, তাই সর্বোত্তম উপায় হ'ল টেবিলটিকে পুনরায় আকার দিন - আপনাকে কীবোর্ডের আকারের (165 পিক্সেলের আশেপাশে) আমার মনে হয় টেবিলভিউ.ফ্রেমটিকে ছোট আকারে সেট করতে হবে এবং তারপরে আবার প্রসারিত করুন when কীবোর্ড বরখাস্ত করা হয়।

আপনি যদি ব্যবহারকারীর স্ক্রোলিং না চান তবে আপনি সেই সময়ে টেবিলভিউয়ের জন্য ব্যবহারকারীর ইন্টারঅ্যাকশনটিও অক্ষম করতে পারেন।


আমি এটিকে দ্বিতীয় করে দিয়েছি এবং ডাব্লিকভাবে কীবোর্ডের আকারটি সন্ধান করতে ইউআইকিবোর্ডওয়িল শো নোটিফিকেশনের জন্য নিবন্ধন করি।
বেনজাদো

বিজ্ঞপ্তি অবজেক্টের দ্বারা ফিরে আসা সংখ্যাটি যদিও কাজ করে না। বা কমপক্ষে এটি ২.২-এ আসে নি, ফিরে আসা সংখ্যাটি ভুল ছিল এবং উচ্চতাটি সঠিকভাবে সামঞ্জস্য করতে আমাকে 165 মানটি হার্ড-কোড করতে হয়েছিল (এটি পাঁচ থেকে দশ পিক্সেল দ্বারা বন্ধ ছিল)
কেন্ডাল হেলস্টেটার জেলনার

2

এটি পুরোপুরি কার্যকর হয় এবং আইপ্যাডেও।

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{

    if(textField == textfield1){
            [accountName1TextField becomeFirstResponder];
        }else if(textField == textfield2){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield3 becomeFirstResponder];

        }else if(textField == textfield3){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield4 becomeFirstResponder];

        }else if(textField == textfield4){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield5 becomeFirstResponder];

        }else if(textField == textfield5){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:3 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield6 becomeFirstResponder];

        }else if(textField == textfield6){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:4 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield7 becomeFirstResponder];

        }else if(textField == textfield7){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:5 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield8 becomeFirstResponder];

        }else if(textField == textfield8){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:6 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield9 becomeFirstResponder];

        }else if(textField == textfield9){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:7 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textField resignFirstResponder];
        }

আপনি কেন প্রতিটি পাঠ্যক্ষেত্রের জন্য বিশেষ মামলাগুলি ইফফিং করছেন এবং ব্যবহার করছেন? ঘরের এনএসআইডেক্সপথ থেকে প্রতিটি পাঠ্য ক্ষেত্রটি আইডি করুন এবং বিবৃতিটিকে কোডের 2 লাইনে রূপান্তর করুন। আপনি সত্যিকার অর্থে সেলফোরআউআইটিএন্ডেক্সপথ কল চান এবং তারপরে ঘরটি থেকে টেক্সটফিল্ড পান।
অ্যালেক্স জাভাটোন

আসলে আইওএস-এ এই পরিস্থিতিটি কতটা অবিশ্বাস্যরূপে ঝাপটায় considering
ফ্যাটি

এই উত্তরটি বিবেচনা করে 6 বছর আগে দেওয়া হয়েছিল।
রাইটসিসিএস

2

আমি প্রায় একই পদ্ধতির চেষ্টা করেছি এবং তার জন্য একটি সহজ এবং ছোট কোড নিয়ে এসেছি। আমি একটি আইবিআউটলেট আইটেক্সটভিউ তৈরি করেছি এবং আইবিতে ইউআইটিেক্সটভিউয়ের সাথে যুক্ত।

 -(void)keyboardWillShow:(NSNotification *)notification
    {
        NSLog(@"Keyboard");
        CGRect keyFrame = [[[notification userInfo]objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];

        [UIView beginAnimations:@"resize view" context:nil];
        [UIView setAnimationCurve:1];
        [UIView setAnimationDuration:1.0];
        CGRect frame = iTableView.frame;
        frame.size.height = frame.size.height -  keyFrame.size.height;
        iTableView.frame = frame;
        [iTableView scrollRectToVisible:frame animated:YES];
        [UIView commitAnimations];

    }

2

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

সুতরাং যে কোনও কারণে উপরের কোডটি কেবল আমার জন্য কাজ করছে না। আমার সেটআপটি অন্যদের সাথে মোটামুটি একই রকম মনে হয়েছিল, তবে সম্ভবত আমি আইপ্যাডে ছিলাম বা 4.3 ... কোনও ধারণা নেই। এটি কিছুটা অদ্ভুত গণিত করছে এবং আমার টেবিলভিউটি স্ক্রিনের বাইরে শুটিং করছে।

আমার সমাধানের শেষ ফলাফলটি দেখুন: http://screencast.com/t/hjBCuRrPC (দয়া করে ছবিটিকে উপেক্ষা করুন : :- পি)

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

এছাড়াও কিছু পুনরায় আঁকানো সমস্যাগুলি সমাধান করা হয়েছিল যা ১) অ্যানিমেশনটি হওয়া পর্যন্ত সেলটিতে স্ক্রোলের জন্য অপেক্ষা করা এবং 2) কীবোর্ডটি আড়াল করার সময় ইউআইভিউঅিনিমেশনঅপশনবেগিনক্রোমেনস্টেট বিকল্পটি ব্যবহার করে।

কয়েকটি বিষয় লক্ষণীয়।

  • _টোমস্টোমরোফিউরফিয়ারকিবোর্ডওয়াসশাউন এবং _রিজিনাল ফ্রেম হ্যাডারে ঘোষণাপত্রের ভেরিয়েবল।
  • সেল্ফ.গেষ্টেন্ট্রিটিবেল ভিউটি আমার টেবিলভিউ (আমি একটি বাহ্যিক ফাইলে আছি)
  • IASKCGRectSwap কোনও ফ্রেমের স্থানাঙ্কগুলি ফ্লিপ করার জন্য অর্টউইনের পদ্ধতি
  • আমি কেবলমাত্র টেবিলভিউয়ের উচ্চতা আপডেট করি যদি এর কমপক্ষে 50px প্রদর্শিত হয়
  • যেহেতু আমি কোনও ইউআইভিউ কনট্রোলারটিতে নেই সেহেতু আমার স্ব-ভিউ নেই, তাই আমি কেবল টেবিলভিউটিকে তার মূল ফ্রেমে ফিরিয়ে দিচ্ছি

আবার, আমি যদি অর্টউইন এর ক্রুক্স সরবরাহ না করি তবে আমি এই উত্তরটির কাছে পৌঁছাতে পারতাম না। কোডটি এখানে:

- (IBAction)textFieldDidBeginEditing:(UITextField *)textField
{
    self.activeTextField = textField;

    if ([self.guestEntryTableView indexPathsForVisibleRows].count) {
        _topmostRowBeforeKeyboardWasShown = (NSIndexPath*)[[self.guestEntryTableView indexPathsForVisibleRows] objectAtIndex:0];
    } else {
        // this should never happen
        _topmostRowBeforeKeyboardWasShown = [NSIndexPath indexPathForRow:0 inSection:0];
        [textField resignFirstResponder];
    }
}

- (IBAction)textFieldDidEndEditing:(UITextField *)textField
{
    self.activeTextField = nil;
}

- (void)keyboardWillShow:(NSNotification*)notification {
    NSDictionary* userInfo = [notification userInfo];

    NSValue* keyboardFrameValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

    // Reduce the tableView height by the part of the keyboard that actually covers the tableView
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect windowRect = [[UIApplication sharedApplication] keyWindow].bounds;
    CGRect viewRectAbsolute = [self.guestEntryTableView convertRect:self.guestEntryTableView.bounds toView:[[UIApplication sharedApplication] keyWindow]];
    CGRect keyboardFrame = [keyboardFrameValue CGRectValue];
    if (UIInterfaceOrientationLandscapeLeft == orientation ||UIInterfaceOrientationLandscapeRight == orientation ) {
        windowRect = IASKCGRectSwap(windowRect);
        viewRectAbsolute = IASKCGRectSwap(viewRectAbsolute);
        keyboardFrame = IASKCGRectSwap(keyboardFrame);
    }

    // fix the coordinates of our rect to have a top left origin 0,0
    viewRectAbsolute = FixOriginRotation(viewRectAbsolute, orientation, windowRect.size.width, windowRect.size.height);

    CGRect frame = self.guestEntryTableView.frame;
    _originalFrame = self.guestEntryTableView.frame;

    int remainder = (viewRectAbsolute.origin.y + viewRectAbsolute.size.height + keyboardFrame.size.height) - windowRect.size.height;

    if (remainder > 0 && !(remainder > frame.size.height + 50)) {
        frame.size.height = frame.size.height - remainder;
        float duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        [UIView animateWithDuration: duration
                        animations:^{
                            self.guestEntryTableView.frame = frame;
                        }
                        completion:^(BOOL finished){
                            UITableViewCell *textFieldCell = (UITableViewCell*) [[self.activeTextField superview] superview];
                            NSIndexPath *textFieldIndexPath = [self.guestEntryTableView indexPathForCell:textFieldCell];
                            [self.guestEntryTableView scrollToRowAtIndexPath:textFieldIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
                        }];
    }

}

- (void)keyboardWillHide:(NSNotification*)notification {
    NSDictionary* userInfo = [notification userInfo];
    float duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    [UIView animateWithDuration: duration
                          delay: 0.0
                        options: (UIViewAnimationOptionBeginFromCurrentState)
                     animations:^{
                         self.guestEntryTableView.frame = _originalFrame;
                     }
                     completion:^(BOOL finished){
                         [self.guestEntryTableView scrollToRowAtIndexPath:_topmostRowBeforeKeyboardWasShown atScrollPosition:UITableViewScrollPositionTop animated:YES];
                     }];

}   

#pragma mark CGRect Utility function
CGRect IASKCGRectSwap(CGRect rect) {
    CGRect newRect;
    newRect.origin.x = rect.origin.y;
    newRect.origin.y = rect.origin.x;
    newRect.size.width = rect.size.height;
    newRect.size.height = rect.size.width;
    return newRect;
}

CGRect FixOriginRotation(CGRect rect, UIInterfaceOrientation orientation, int parentWidth, int parentHeight) {
    CGRect newRect;
    switch(orientation)
    {
        case UIInterfaceOrientationLandscapeLeft:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), rect.origin.y, rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationLandscapeRight:
            newRect = CGRectMake(rect.origin.x, parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationPortrait:
            newRect = rect;
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
    }
    return newRect;
}

আমার ফিক্সরিগিনরোটেশন ফাংশনটি যুক্ত করা হয়েছে যা আপনার ফ্রেমটি আপডেট করার আগে ভিউয়ের সমন্বয় ব্যবস্থাটি ঠিক করে দেয় ইত্যাদি etc. আমি মনে করি এটি প্রথমে আমার কেন কষ্ট হচ্ছিল তারই একটি অংশ। আইওএস উইন্ডো সমন্বয় সিস্টেমটি ডিভাইসের সাথে ঘোরানো সম্পর্কে অবগত ছিল না!
বব স্প্রিন

2

এই soluton আমার জন্য কাজ করে, দয়া করে লাইন নোট করুন

[tableView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height+160) animated:YES];

এটি আপনার সাথে কাজ করার জন্য 160 মানটি পরিবর্তন করতে পারে

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = activeField.superview.frame;
                        bkgndRect.size.height += kbSize.height;
     [activeField.superview setFrame:bkgndRect];
     [tableView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height+160) animated:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
   activeField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
 {
     activeField = nil;
 }
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    tableView.contentInset = contentInsets;
    tableView.scrollIndicatorInsets = contentInsets;
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = activeField.superview.frame;
    //bkgndRect.size.height += kbSize.height;
    [activeField.superview setFrame:bkgndRect];
    [tableView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height) animated:YES];
}

2

খুব আকর্ষণীয় আলোচনার থ্রেড, আমি একই সমস্যার মুখোমুখি হয়েছি কারণ এটি আরও খারাপ হতে পারে

  1. আমি একটি কাস্টম সেল ব্যবহার করছিলাম এবং পাঠ্যক্ষেত্রটি এর ভিতরে ছিল।
  2. আমার প্রয়োজনীয়তা মেটাতে আমাকে ইউআইভিউকন্ট্রোলার ব্যবহার করতে হয়েছিল যাতে ইউআইটিএবলভিউ কনট্রোলারের সুবিধা নিতে পারে না।
  3. আমার টেবিলে সেলটিতে ফিল্টার / বাছাই করা মাপদণ্ড ছিল, অর্থাৎ আপনার ঘরগুলি সূচীপথের পরিবর্তন এবং ট্র্যাক করে রাখে এবং সমস্ত সাহায্য করবে না।

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

// শুধুমাত্র ল্যান্ডস্কেপ মোড হ্যান্ডল করার জন্য প্রয়োগ P

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbValue = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect aRect = myTable.frame;

    CGSize kbSize = CGSizeMake(kbValue.height, kbValue.width);

    aRect.size.height -= kbSize.height+50;
// This will the exact rect in which your textfield is present
        CGRect rect =  [myTable convertRect:activeField.bounds fromView:activeField];
// Scroll up only if required
    if (!CGRectContainsPoint(aRect, rect.origin) ) {


            [myTable setContentOffset:CGPointMake(0.0, rect.origin.y) animated:YES];

    }


}

// যখন UIKeyboardWillHideNotifications প্রেরণ করা হয়

- (void)keyboardWillHide:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    myTable.contentInset = contentInsets;
    myTable.scrollIndicatorInsets = contentInsets;
    NSDictionary* info = [aNotification userInfo];
    CGSize kbValue = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGSize kbSize = CGSizeMake(kbValue.height, kbValue.width);
    CGRect bkgndRect = activeField.superview.frame;
    bkgndRect.size.height += kbSize.height;
    [activeField.superview setFrame:bkgndRect];
    [myTable setContentOffset:CGPointMake(0.0, 10.0) animated:YES];
}

-anoop4real


2

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

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

// If active text field is hidden by keyboard, scroll it so it's visible
// Your application might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;

if (aRect.size.height < activeField.frame.origin.y+activeField.frame.size.height) {

    CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y+activeField.frame.size.height-aRect.size.height);

    [scrollView setContentOffset:scrollPoint animated:YES];

এই শর্তের মধ্যে এই টুকরা এবং অ্যাপলের মিথ্যাচারের মধ্যে প্রধান পার্থক্য। আমি বিশ্বাস করি অ্যাপল এর স্ক্রোলের দূরত্ব এবং কীবোর্ড দ্বারা আচ্ছাদিত পাঠ্য ক্ষেত্রটি সঠিক নয় কিনা শর্তের হিসাব, ​​সুতরাং আমি উপরে হিসাবে আমার সংশোধন করেছি।

যদি এটি কাজ করে তবে আমাকে জানান


2

সুইফটের সাথে ইউআইটিএবলভিউসেলতে ইউআইটিেক্সটফিল্ডের ইনডেক্সপথ থেকে পাঠ্য ক্ষেত্রের সঠিক পয়েন্টটি ব্যবহার করে সুইফ্টের একটি উদাহরণ :

func textFieldDidBeginEditing(textField: UITextField) {
    let pointInTable = textField.convertPoint(textField.bounds.origin, toView: self.accountsTableView)
    let textFieldIndexPath = self.accountsTableView.indexPathForRowAtPoint(pointInTable)
    accountsTableView.scrollToRowAtIndexPath(textFieldIndexPath!, atScrollPosition: .Top, animated: true)
}

1

অন্য একটি সহজ পদ্ধতি (শুধুমাত্র একটি বিভাগের সাথে কাজ করে)

//cellForRowAtIndexPath
UItextField *tf;
[cell addSubview:tf];
tf.tag = indexPath.row;
tf.delegate = self;

//textFieldDidBeginEditing:(UITextField *)text
[[self.tableView scrollToRowsAtIndexPath:[NSIndexPath indexPathForRow:text.tag in section:SECTIONINTEGER] animated:YES];

1

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

একটি ভাল উদাহরণের জন্য অ্যাপল উদাহরণ কোড প্রকল্প দেখুন: ট্যাগডলকেশন।

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


1

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

1) viewDidLoadআমি যোগ করেছি:

self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

2) আমি ফোন করতে ভুলে গিয়েছিলেন superমধ্যে সমতুল viewWillAppearএবং awakeFromNib। আমি এগুলিকে আবার যুক্ত করেছিলাম।


1

UITableViewControllerস্বয়ংক্রিয়ভাবে স্ক্রোলিং করে। পার্থক্য একটি ব্যবহার তুলনায় UIViewControllerআপনি ব্যবহার দ্বারা নেভিগেশনদণ্ড-Buttonitems প্রোগ্রামেটিক্যালি তৈরি করতে যে, NavigationControllerযখন ব্যবহার TableViewController

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