কীবোর্ড প্রদর্শিত হলে আমি কীভাবে ইউআইএসক্রোলভিউ স্ক্রোল করব?


107

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

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

আমি একজন করেনি NSLog()আমার ভেরিয়েবল আকার, দূরত্ব এবং textFieldRect.origin.y মত আপনি নীচের দেখতে পারেন। যখন আমি UITextFieldএকই জায়গায় দুটি (y উত্স) রেখেছি এবং আমি এই বিশেষ 'স্যুইচ' (রিটার্ন টিপুন), আমি একই নম্বর পাই তবে আমার কোডটি প্রথম UITextFieldসম্পাদনার জন্য ভাল কাজ করেছে তবে দ্বিতীয় সম্পাদনার জন্য নয়।

এটা দেখ:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
{
    int size;
    CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
    size = textFieldRect.origin.y + textFieldRect.size.height;
    if (change == FALSE)
    {
        size = size - distance;
    }
    if (size < PORTRAIT_KEYBOARD_HEIGHT)
    {
        distance = 0;
    }
    else if (size > PORTRAIT_KEYBOARD_HEIGHT)
    {
        distance = size - PORTRAIT_KEYBOARD_HEIGHT + 5; // +5 px for more visibility
    }
    NSLog(@"origin %f", textFieldRect.origin.y);
    NSLog(@"size %d", size);
    NSLog(@"distance %d", distance);
    CGRect viewFrame = self.view.frame;
    viewFrame.origin.y -= distance;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
    change = FALSE;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    change = TRUE;
    CGRect viewFrame = self.view.frame;
    viewFrame.origin.y += distance;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
}

কোন ধারনা ?

উত্তর:


204

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

// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(keyboardWasShown:)
            name:UIKeyboardDidShowNotification object:nil];
   [[NSNotificationCenter defaultCenter] addObserver:self
             selector:@selector(keyboardWillBeHidden:)
             name:UIKeyboardWillHideNotification object:nil];
}

// Called when the UIKeyboardDidShowNotification is sent.
- (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);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    // 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 (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
        CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent    
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}

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

func registerForKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardAppear(_:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisappear(_:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil)
}

// Don't forget to unregister when done
deinit {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardDidShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardDidHide, object: nil)
}

@objc func onKeyboardAppear(_ notification: NSNotification) {
    let info = notification.userInfo!
    let rect: CGRect = info[UIKeyboardFrameBeginUserInfoKey] as! CGRect
    let kbSize = rect.size

    let insets = UIEdgeInsetsMake(0, 0, kbSize.height, 0)
    scrollView.contentInset = insets
    scrollView.scrollIndicatorInsets = insets

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

    let activeField: UITextField? = [addressTextView, servicePathTextView, usernameTextView, passwordTextView].first { $0.isFirstResponder }
    if let activeField = activeField {
        if !aRect.contains(activeField.frame.origin) {
            let scrollPoint = CGPoint(x: 0, y: activeField.frame.origin.y-kbSize.height)
            scrollView.setContentOffset(scrollPoint, animated: true)
        }
    }
}

@objc func onKeyboardDisappear(_ notification: NSNotification) {
    scrollView.contentInset = UIEdgeInsets.zero
    scrollView.scrollIndicatorInsets = UIEdgeInsets.zero
}

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

2
আপনি আসলে বিদ্যমান কন্টেন্টআইনসেটস.টপটি ওভাররাইট করতে চান না, আপনি যদি এটি করেন তবে নেভিগেশনের পিছনে পিছলে যেতে পারে।
SwiftArchitect

6
github.com/michaeltyson/TPKeyboardAvided এই অতি সহজ সমাধান
প্রমোদ

2
activeField.frameআপেক্ষিক ফ্রেমে রূপান্তর করা ভাল কারণ activeFieldএটির সাথে তাত্ক্ষণিক শিশু হতে হবে না self.view। আপডেট হওয়া CGRect aRect = self.view.frame; aRect.size.height -= kbSize.height; CGRect relativeFieldFrame = [activeField convertRect:activeField.frame toView:self.view]; if (!CGRectContainsPoint(aRect, relativeFieldFrame.origin) ) { CGPoint scrollPoint = CGPointMake(0.0, relativeFieldFrame.origin.y-kbSize.height); [self.mainView.scrollView setContentOffset:scrollPoint animated:YES]; }
কোডটির

4
UIKeyboardFrameEndUserInfoKeyআইওএস 11-এ আমি কীটি ব্যবহার করতে হয়েছিল কারণ UIKeyboardFrameBeginUserInfoKeyপ্রায়শই আমাকে শূন্যের উচ্চতা দেয়।
কলিন

66

আমি স্রেফ এক্সকোড 7 (বিটা 6) এ আইওএস 9 এর জন্য সুইফট 2.0 এর সাথে এটি প্রয়োগ করেছি, এখানে দুর্দান্ত কাজ করে।

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

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

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

func keyboardWillShow(notification: NSNotification) {
    let userInfo: NSDictionary = notification.userInfo!
    let keyboardSize = userInfo.objectForKey(UIKeyboardFrameBeginUserInfoKey)!.CGRectValue.size
    let contentInsets = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
    scrollView.contentInset = contentInsets
    scrollView.scrollIndicatorInsets = contentInsets

    var viewRect = view.frame
    viewRect.size.height -= keyboardSize.height
    if CGRectContainsPoint(viewRect, textField.frame.origin) {
        let scrollPoint = CGPointMake(0, textField.frame.origin.y - keyboardSize.height)
        scrollView.setContentOffset(scrollPoint, animated: true)
    }
}

func keyboardWillHide(notification: NSNotification) {
    scrollView.contentInset = UIEdgeInsetsZero
    scrollView.scrollIndicatorInsets = UIEdgeInsetsZero
}

সুইফট 3 এর জন্য সম্পাদিত

মনে হয় আপনি শুধুমাত্র সেট করতে হবে contentInsetএবং scrollIndicatorInsetসুইফট 3, স্ক্রলিং / contentOffset স্বয়ংক্রিয়ভাবে সম্পন্ন করা হয় ..

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

func registerKeyboardNotifications() {
    NotificationCenter.default.addObserver(self,
                                         selector: #selector(keyboardWillShow(notification:)),
                                         name: NSNotification.Name.UIKeyboardWillShow,
                                         object: nil)
    NotificationCenter.default.addObserver(self,
                                         selector: #selector(keyboardWillHide(notification:)),
                                         name: NSNotification.Name.UIKeyboardWillHide,
                                         object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

func keyboardWillShow(notification: NSNotification) {
    let userInfo: NSDictionary = notification.userInfo! as NSDictionary
    let keyboardInfo = userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue
    let keyboardSize = keyboardInfo.cgRectValue.size
    let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
    scrollView.contentInset = contentInsets
    scrollView.scrollIndicatorInsets = contentInsets
}

func keyboardWillHide(notification: NSNotification) {
    scrollView.contentInset = .zero
    scrollView.scrollIndicatorInsets = .zero
}

আপনি আপনার কোড ব্যাখ্যা করতে পারেন? আমার দুটি পাঠ্য ক্ষেত্র রয়েছে এবং আমি প্রথমটি সম্পাদন করার পরে এটি দ্বিতীয় স্ক্রোলফোল্ড স্ক্রোল আপ করার সময় এটি নীচে স্ক্রোল করে।
পারেন

আইপ্যাডে এটি স্ক্রোল ভিউটিকে উপরে পরিবর্তিত করে moves কোন ধারণা কি ঘটছে?
জাস্টিন ভ্যালি

2
পাঠ্যফিল্ডটি রেফার করা ক্যান্সেলফিল্ডটি আপনার বর্তমান দর্শকের উপর ভিত্তি করে আপনার ভিউকন্ট্রোলারের জন্য সেট করা একটি পরিবর্তনশীল
জোহানেস

আমি অবাক হয়েছি কেন আপেল এখন আমাদের জন্য কীবোর্ডের উপরে সক্রিয় পাঠ্য ক্ষেত্রটি স্ক্রোল করতে নিজেদের মধ্যে নিয়েছিল?
paulvs

2
সুইফটে 4 কীবোর্ড উইলশো এবং কীবোর্ড উইলহাইড পদ্ধতিগুলিতে @objc রাখুন
রোনালদো আলবার্টিনি

16

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

এখানে কৌশলটি হ'ল ভিউটি ওরিয়েন্টেশন সম্পর্কে সচেতন হলেও কীবোর্ডটি নয়। এর অর্থ ল্যান্ডস্কেপ-এ, কীবোর্ডগুলির প্রস্থটি আসলে এর উচ্চতা এবং ভিসার বিপরীতে।

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

// Call this method somewhere in your view controller setup code.
- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(keyboardWasShown:)
            name:UIKeyboardDidShowNotification object:nil];
   [[NSNotificationCenter defaultCenter] addObserver:self
             selector:@selector(keyboardWillBeHidden:)
             name:UIKeyboardWillHideNotification object:nil];
}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGSize keyboardSize = [[[notif userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight ) {
        CGSize origKeySize = keyboardSize;
        keyboardSize.height = origKeySize.width;
        keyboardSize.width = origKeySize.height;
    }
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0);
    scroller.contentInset = contentInsets;
    scroller.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    // Your application might not need or want this behavior.
    CGRect rect = scroller.frame;
    rect.size.height -= keyboardSize.height;
    NSLog(@"Rect Size Height: %f", rect.size.height);

    if (!CGRectContainsPoint(rect, activeField.frame.origin)) {
        CGPoint point = CGPointMake(0, activeField.frame.origin.y - keyboardSize.height);
        NSLog(@"Point Height: %f", point.y);
        [scroller setContentOffset:point animated:YES];
    }
}

// Called when the UIKeyboardWillHideNotification is sent    
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;
}

এখানে মনোযোগ দেওয়ার অংশটি নিম্নলিখিত:

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
CGSize keyboardSize = [[[notif userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight ) {
    CGSize origKeySize = keyboardSize;
    keyboardSize.height = origKeySize.width;
    keyboardSize.width = origKeySize.height;
}

যা করছে তা ডিভাইসটি কী অরিয়েন্টেশনটিতে রয়েছে তা সনাক্ত করে it


ভাল, আপনি এই প্রতি বিষয়বস্তু আঁটা নীচে অতিরিক্ত সমন্বয় (কমানো) করতে চাইতে পারেন stackoverflow.com/questions/25704513/... ক্ষেত্রে scroller পর্দা UIEdgeInsetsMake (0.0, 0.0, kbSize.height সমগ্র উচ্চতা অধিষ্ঠিত হয় - ([ইউআইএস স্ক্রিন মূল স্ক্রিন] .bound.size.height - cvf.origin.y - cvf.size.height), 0.0); যেখানে সিভিএফ হ'ল স্ক্রোলআর ফ্রেম
অ্যান্টন ট্রপ্যাশকো

if (ওরিয়েন্টেশন == UIInterfaceOrientationLandPressLeft || ওরিয়েন্টেশন == #IInterfaceOrientationLandPressRight )
schmidt9

13

সুইফট 4 সমাধান:

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

func registerKeyboardNotifications() {
    NotificationCenter.default.addObserver(self,
                                         selector: #selector(keyboardWillShow(notification:)),
                                         name: NSNotification.Name.UIKeyboardWillShow,
                                         object: nil)
    NotificationCenter.default.addObserver(self,
                                         selector: #selector(keyboardWillHide(notification:)),
                                         name: NSNotification.Name.UIKeyboardWillHide,
                                         object: nil)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardWillShow(notification: NSNotification) {
    let userInfo: NSDictionary = notification.userInfo! as NSDictionary
    let keyboardInfo = userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue
    let keyboardSize = keyboardInfo.cgRectValue.size
    let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
    scrollView.contentInset = contentInsets
    scrollView.scrollIndicatorInsets = contentInsets
}

@objc func keyboardWillHide(notification: NSNotification) {
    scrollView.contentInset = .zero
    scrollView.scrollIndicatorInsets = .zero
}

3
বেশিরভাগ কাজ করেছে, সবেমাত্র পরিবর্তিত UIKeyboardFrameBeginUserInfoKeyহওয়া দরকারUIKeyboardFrameEndUserInfoKey
ফোনিক্স

আমি এই কোডটি ইউআইটিএবলভিউতে প্রয়োগ করি। তবে টেবিলভিউ অবিলম্বে স্ক্রোল করছে না।
শন বেক

3
UIKeyboardWillShow, UIKeyboardWillHide, এবং UIKeyboardFrameBeginUserInfoKeyনতুন নামকরণ করা হয়েছে UIResponder.keyboardWillShowNotification, UIResponder.keyboardWillHideNotificationআর UIResponder.keyboardFrameBeginUserInfoKey
অ্যারন ব্র্যাজার

9

এই স্টাফের জন্য কোডিংয়ের প্রচুর দরকার নেই এটি নীচের কোডের মতো খুব সহজ: -

আপনার সমস্ত পাঠ্য ফাইলটি ইউআইএসক্রোলভিউতে এই চিত্রটির মতো নিব থেকে:

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

YourViewController.h

@interface cntrInquiryViewController : UIViewController<UIScrollViewDelegate,UITextFieldDelegate>
{
     IBOutlet UITextField *txtName;
     IBOutlet UITextField *txtEmail;
     IBOutlet UIScrollView *srcScrollView;
}
@end

আইবিআউটলেটকে নিব থেকে সংযুক্ত করুন এবং ইউআইটেক্সটফিল্ডের প্রতিটি প্রতিনিধি এবং এনআইবি থেকে স্ক্রোলভিউ প্রতিনিধি সংযুক্ত করুন

-(void)viewWillAppear:(BOOL)animated
{
    srcScrollView.contentSize = CGSizeMake(320, 500);

    [super viewWillAppear:YES];
}


-(void)textFieldDidBeginEditing:(FMTextField *)textField
{
    [srcScrollView setContentOffset:CGPointMake(0,textField.center.y-140) animated:YES];//you can set your  y cordinate as your req also
}

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
     [textField resignFirstResponder];
     [srcScrollView setContentOffset:CGPointMake(0,0) animated:YES];


    return YES;
}

দ্রষ্টব্য যদি পাঠ্য-দায়ের করা প্রতিনিধি সংযুক্ত না থাকে তবে কোনও পদ্ধতিই কাজ করছে না দয়া করে নিশ্চিত করুন যে সমস্ত আইবিউলেট এবং প্রতিনিধি সঠিকভাবে সংযুক্ত আছেন


5
এটি খুব পুরানো পদ্ধতির এবং এটি ব্যবহার করা উচিত নয়। এটি হারকোডযুক্ত মান এবং অনুমানগুলির উপর নির্ভর করে যা আর প্রাসঙ্গিক নয়।
Womble

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

7

অ্যাপল এর প্রস্তাবনাটি সুইফট + এ আইওএসের অটো লেআউটের সাথে ইউআইএসক্রোলভিউ ব্যবহার করে পুনরায় পুনঃনির্মাণ করা হয়েছে (এই লিঙ্কগুলির উপর ভিত্তি করে: লিঙ্ক 1 , লিঙ্ক 2 , লিঙ্ক 3 ):

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var t1: UITextField!
    @IBOutlet var t2: UITextField!
    @IBOutlet var t3: UITextField!
    @IBOutlet var t4: UITextField!

    @IBOutlet var srcScrollView: UIScrollView!

    @IBOutlet var contentView: UIView!

    var contentViewCoordinates: CGPoint!

    override func viewDidLoad() {

        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        /* Constraints on content view */
        let leftConstraint = NSLayoutConstraint(item:self.contentView,
            attribute:NSLayoutAttribute.Leading,
            relatedBy:NSLayoutRelation.Equal,
            toItem:self.view,
            attribute:NSLayoutAttribute.Left,
            multiplier:1.0,
            constant:0)
        self.view.addConstraint(leftConstraint)

        let rightConstraint = NSLayoutConstraint(item:self.contentView,
            attribute:NSLayoutAttribute.Trailing,
            relatedBy:NSLayoutRelation.Equal,
            toItem:self.view,
            attribute:NSLayoutAttribute.Right,
            multiplier:1.0,
            constant:0)
        self.view.addConstraint(rightConstraint)

        /* Tap gesture */
        let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideKeyboard")
        // prevents the scroll view from swallowing up the touch event of child buttons
        tapGesture.cancelsTouchesInView = false
        srcScrollView.addGestureRecognizer(tapGesture)

        /* Save content view coordinates */
        contentViewCoordinates = contentView.frame.origin
    }

    func hideKeyboard() {
        t1.resignFirstResponder()
        t2.resignFirstResponder()
        t3.resignFirstResponder()
        t4.resignFirstResponder()
    }

    var activeField: UITextField?

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

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

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        let center = NSNotificationCenter.defaultCenter()
        center.addObserver(self, selector: "keyboardOnScreen:", name: UIKeyboardDidShowNotification, object: nil)
        center.addObserver(self, selector: "keyboardOffScreen:", name: UIKeyboardDidHideNotification, object: nil)
    }

    func keyboardOnScreen(notification: NSNotification){
        // Retrieve the size and top margin (inset is the fancy word used by Apple) 
        // of the keyboard displayed.
        let info: NSDictionary  = notification.userInfo!
        let kbSize = info.valueForKey(UIKeyboardFrameEndUserInfoKey)?.CGRectValue().size
        let contentInsets: UIEdgeInsets  = UIEdgeInsetsMake(0.0, 0.0, kbSize!.height, 0.0)

        srcScrollView.contentInset = contentInsets
        srcScrollView.scrollIndicatorInsets = contentInsets

        var aRect: CGRect = self.view.frame
        aRect.size.height -= kbSize!.height
        //you may not need to scroll, see if the active field is already visible
        if (CGRectContainsPoint(aRect, activeField!.frame.origin) == false) {
            let scrollPoint:CGPoint = CGPointMake(0.0, activeField!.frame.origin.y - kbSize!.height)
            srcScrollView.setContentOffset(scrollPoint, animated: true)
        }
    }

//    func keyboardOnScreen(aNotification: NSNotification) {
//        let info: NSDictionary  = aNotification.userInfo!
//        let kbSize = info.valueForKey(UIKeyboardFrameEndUserInfoKey)?.CGRectValue().size
//        
//        var bkgndRect: CGRect! = activeField?.superview?.frame
//        
//        bkgndRect.size.height += kbSize!.height
//        
//        activeField?.superview?.frame = bkgndRect
//        
//        srcScrollView.setContentOffset(CGPointMake(0.0, activeField!.frame.origin.y - kbSize!.height), animated: true)
//    }

    func keyboardOffScreen(notification: NSNotification){
        let contentInsets:UIEdgeInsets = UIEdgeInsetsZero

        srcScrollView.contentInset = contentInsets
        srcScrollView.scrollIndicatorInsets = contentInsets

        self.srcScrollView.setContentOffset(CGPointMake(0, -self.view.frame.origin.y/2), animated: true)
    }

}

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

আমি মনে করি ভিউটি মারা যাওয়ার আগে আপনাকেও বিজ্ঞপ্তি কেন্দ্র থেকে সদস্যতা বাতিল করতে হবে?
সিরিল ডুচন-ডরিস

4

অ্যাপল কোডে আমি কেবলমাত্র আপডেট করব কীডল উইলবিহিডেন: পদ্ধতিটি, মসৃণ রূপান্তর সরবরাহ করতে।

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;

    [UIView animateWithDuration:0.4 animations:^{
        self.scrollView.contentInset = contentInsets;
    }];
    self.scrollView.scrollIndicatorInsets = contentInsets;

}

4

এখানে একটি সুইফ্ট 3 সামঞ্জস্যপূর্ণ উত্তর রয়েছে, এটি একটি নেভিগেশন নিয়ন্ত্রকের মধ্যে দর্শন নিয়ন্ত্রকদের সাথেও কাজ করবে - যেহেতু তারা স্ক্রল দর্শন contentInset.topসম্পত্তি পরিবর্তন করবে ।

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

    self.registerKeyboardNotifications()
}

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

    self.unregisterKeyboardNotifications()
}

func registerKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(LoginViewController.keyboardDidShow(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(LoginViewController.keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func unregisterKeyboardNotifications() {
    NotificationCenter.default.removeObserver(self)
}


func keyboardDidShow(notification: NSNotification) {
    let userInfo: NSDictionary = notification.userInfo! as NSDictionary
    let keyboardInfo = userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue
    let keyboardSize = keyboardInfo.cgRectValue.size

    // Get the existing contentInset for the scrollView and set the bottom property to be the height of the keyboard
    var contentInset = self.scrollView.contentInset
    contentInset.bottom = keyboardSize.height

    self.scrollView.contentInset = contentInset
    self.scrollView.scrollIndicatorInsets = contentInset
}

func keyboardWillHide(notification: NSNotification) {
    var contentInset = self.scrollView.contentInset
    contentInset.bottom = 0

    self.scrollView.contentInset = contentInset
    self.scrollView.scrollIndicatorInsets = UIEdgeInsets.zero
}

4

সুইট 4.2 সমাধান যা ইউআইটিউলবার এবং ইউআইটিববারের সম্ভাব্য উচ্চতা বিবেচনা করে।

private func setupKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIControl.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIControl.keyboardWillHideNotification, object: nil)
}

@objc func keyboardWillShow(_ notification: Notification) {
    let userInfo: NSDictionary = notification.userInfo! as NSDictionary
    let keyboardSize = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size

    let tabbarHeight = tabBarController?.tabBar.frame.size.height ?? 0
    let toolbarHeight = navigationController?.toolbar.frame.size.height ?? 0
    let bottomInset = keyboardSize.height - tabbarHeight - toolbarHeight

    scrollView.contentInset.bottom = bottomInset
    scrollView.scrollIndicatorInsets.bottom = bottomInset
}

@objc func keyboardWillHide(_ notification: Notification) {
    scrollView.contentInset = .zero
    scrollView.scrollIndicatorInsets = .zero
}

এবং, যদি আপনি <আইওএস 9 টার্গেট করছেন তবে আপনাকে কিছু সময় পর্যবেক্ষককে নিবন্ধভুক্ত করতে হবে (ধন্যবাদ জো )


এটি আইফোন এক্স-এ ট্যাববারের নিচে অ্যাকাউন্টের স্থান গ্রহণ করে? আইওএস স্ট্রিপ প্রদর্শিত হয়।
surfrider

iOS9 + আপনি পর্যবেক্ষক মুছে ফেলার জন্য প্রয়োজন হবে না developer.apple.com/documentation/foundation/notificationcenter/...
জো

হ্যাঁ আপনি ঠিক. আমি সেই অনুযায়ী উত্তর আপডেট করেছি।
জানোপোথেকার

3

আমি খুঁজে পেয়েছি উপরের উত্তরগুলি পুরানো হয়ে গেছে। স্ক্রোল করার সময়ও নিখুঁত নয়।

এখানে একটি দ্রুত সংস্করণ।

এটি টেক্সটফিল্ডের ঠিক নীচে স্ক্রোল করবে, কোনও অতিরিক্ত জায়গা নেই। এটি এটি প্রথম প্রদর্শিত হওয়ার মতোই পুনরুদ্ধার করবে।

//add observer
override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ARVHttpPlayVC.keyboardDidShow(_:)), name: UIKeyboardDidShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ARVHttpPlayVC.keyboardDidHide(_:)), name: UIKeyboardDidHideNotification, object: nil)
}

func keyboardDidShow(notification: NSNotification) {
    let userInfo: NSDictionary = notification.userInfo!
    let keyboardSize = userInfo.objectForKey(UIKeyboardFrameEndUserInfoKey)!.CGRectValue.size
    let difference = keyboardSize.height - (self.view.frame.height - inputTextField.frame.origin.y - inputTextField.frame.size.height)
    if difference > 0 {
        var contentInset:UIEdgeInsets = self.scrollView.contentInset
        contentInset.bottom = difference
        self.scrollView.contentInset = contentInset

        let scrollPoint = CGPointMake(0, difference)
        self.scrollView.setContentOffset(scrollPoint, animated: true)
    }

}

func keyboardDidHide(notification: NSNotification) {
    let contentInset:UIEdgeInsets = UIEdgeInsetsZero
    self.scrollView.contentInset = contentInset
}

//remove observer
deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

এটি কিছুটা স্ক্রোলআপ করে তবে পুরো উচ্চতা প্রকাশের জন্য এটি যথেষ্ট নয়। আমি সুইফট 2.3 ব্যবহার করছি এবং আইফোন 5 এ এটি পরীক্ষা করছি
কেএমসি

2

এই আমি ব্যবহার করে যাচ্ছি। এটি সহজ এবং এটি ভাল কাজ করে।

#pragma mark - Scrolling

-(void)scrollElement:(UIView *)view toPoint:(float)y
{
    CGRect theFrame = view.frame;
    float orig_y = theFrame.origin.y;
    float diff = y - orig_y;

    if (diff < 0) 
        [self scrollToY:diff];

    else 
        [self scrollToY:0];
}

-(void)scrollToY:(float)y
{
    [UIView animateWithDuration:0.3f animations:^{
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        self.view.transform = CGAffineTransformMakeTranslation(0, y);
    }];
}

আপনার দর্শনটি উপরের দিকে সরিয়ে নিতে UITextFieldপ্রতিনিধি কলটি ব্যবহার করুন textFieldDidBeginEditing:এবং কীবোর্ডটি যখন লুকিয়ে রাখেন তখন ভিউটিকে স্বাভাবিক অবস্থায় ফেরাতে একটি বিজ্ঞপ্তি পর্যবেক্ষক যুক্ত করুন:

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

    if (self.view.frame.origin.y == 0)
        [self scrollToY:-90.0];  // y can be changed to your liking

}

-(void)keyboardWillHide:(NSNotification*)note
{
    [self scrollToY:0];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

2

এটি সুইফ্টের উন্নতিগুলির সাথে চূড়ান্ত কোড

    //MARK: UITextFieldDelegate
func textFieldDidBeginEditing(textField: UITextField!) {    //delegate method
    self.textField = textField
}

func textFieldShouldReturn(textField: UITextField!) -> Bool {   //delegate method
    textField.resignFirstResponder()
    return true
}

//MARK: Keyboard handling
override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    unregisterKeyboardNotifications()
}

func registerKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UCProfileSettingsViewController.keyboardDidShow(_:)), name: UIKeyboardDidShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UCProfileSettingsViewController.keyboardWillHide(_:)), name: UIKeyboardWillHideNotification, object: nil)
}

func unregisterKeyboardNotifications() {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

func keyboardDidShow(notification: NSNotification) {
    let userInfo: NSDictionary = notification.userInfo!
    let keyboardSize = userInfo.objectForKey(UIKeyboardFrameBeginUserInfoKey)!.CGRectValue.size
    let contentInsets = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
    scrollView.contentInset = contentInsets
    scrollView.scrollIndicatorInsets = contentInsets

    var viewRect = self.view.frame
    viewRect.size.height -= keyboardSize.height
    let relativeFieldFrame: CGRect = textField.convertRect(textField.frame, toView: self.view)
    if CGRectContainsPoint(viewRect, relativeFieldFrame.origin) {
        let scrollPoint = CGPointMake(0, relativeFieldFrame.origin.y - keyboardSize.height)
        scrollView.setContentOffset(scrollPoint, animated: true)
    }

}

func keyboardWillHide(notification: NSNotification) {
    scrollView.contentInset = UIEdgeInsetsZero
    scrollView.scrollIndicatorInsets = UIEdgeInsetsZero
}

1
আমি মনে করি আপনার যুক্তিটি বিপরীত হয়েছে - আপনি কেবল তখনই স্ক্রোল করতে চান যদি সিজিআরেক্টকন্টেনসপয়েন্টে আপেক্ষিক ফিল্ডফ্রেম.ওরিগিন না থাকে।
রায়ফ্লেক

2

অন্যতম সহজ সমাধান নিম্নোক্ত প্রোটোকলটি ব্যবহার করে:

protocol ScrollViewKeyboardDelegate: class {
    var scrollView: UIScrollView? { get set }

    func registerKeyboardNotifications()
    func unregisterKeyboardNotifications()
}

extension ScrollViewKeyboardDelegate where Self: UIViewController {
    func registerKeyboardNotifications() {
        NotificationCenter.default.addObserver(
            forName: UIResponder.keyboardWillChangeFrameNotification,
            object: nil,
            queue: nil) { [weak self] notification in
                self?.keyboardWillBeShown(notification)
        }

        NotificationCenter.default.addObserver(
            forName: UIResponder.keyboardWillHideNotification,
            object: nil,
            queue: nil) { [weak self] notification in
                self?.keyboardWillBeHidden(notification)
        }
    }

    func unregisterKeyboardNotifications() {
        NotificationCenter.default.removeObserver(
            self,
            name: UIResponder.keyboardWillChangeFrameNotification,
            object: nil
        )
        NotificationCenter.default.removeObserver(
            self,
            name: UIResponder.keyboardWillHideNotification,
            object: nil
        )
    }

    func keyboardWillBeShown(_ notification: Notification) {
        let info = notification.userInfo
        let key = (info?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)
        let aKeyboardSize = key?.cgRectValue

        guard let keyboardSize = aKeyboardSize,
            let scrollView = self.scrollView else {
                return
        }

        let bottomInset = keyboardSize.height
        scrollView.contentInset.bottom = bottomInset
        scrollView.scrollIndicatorInsets.bottom = bottomInset
        if let activeField = self.view.firstResponder {
            let yPosition = activeField.frame.origin.y - bottomInset
            if yPosition > 0 {
                let scrollPoint = CGPoint(x: 0, y: yPosition)
                scrollView.setContentOffset(scrollPoint, animated: true)
            }
        }
    }

    func keyboardWillBeHidden(_ notification: Notification) {
        self.scrollView?.contentInset = .zero
        self.scrollView?.scrollIndicatorInsets = .zero
    }
}

extension UIView {
    var firstResponder: UIView? {
        guard !isFirstResponder else { return self }
        return subviews.first(where: {$0.firstResponder != nil })
    }
}

আপনি যখন এই প্রোটোকলটি ব্যবহার করতে চান, আপনাকে কেবল এটির সাথে সামঞ্জস্য করতে হবে এবং নীচের মত আপনার নিয়ামকটিতে আপনার স্ক্রোল ভিউ নিযুক্ত করতে হবে:

class MyViewController: UIViewController {
      @IBOutlet var scrollViewOutlet: UIScrollView?
      var scrollView: UIScrollView?

      public override func viewDidLoad() {
        super.viewDidLoad()

        self.scrollView = self.scrollViewOutlet
        self.scrollView?.isScrollEnabled = true
        self.registerKeyboardNotifications()
    }

    extension MyViewController: ScrollViewKeyboardDelegate {}

    deinit {
       self.unregisterKeyboardNotifications()
    }

}

1

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

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
    NSDictionary *info = [notification userInfo];
    NSValue *keyBoardEndFrame = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
    CGSize keyboardSize = [keyBoardEndFrame CGRectValue].size;
    self.keyboardSize = keyboardSize;

    [self adjustScrollViewOffsetToCenterTextField:self.currentTextField];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    self.keyboardSize = CGSizeZero;
}

- (IBAction)textFieldGotFocus:(UITextField *)sender {
    sender.inputAccessoryView = self.keyboardAccessoryView;
    self.currentTextField = sender;
    [self adjustScrollViewOffsetToCenterTextField:sender];    
}

- (void)adjustScrollViewOffsetToCenterTextField:(UITextField *)textField
{
    CGRect textFieldFrame = textField.frame;
    float keyboardHeight = MIN(self.keyboardSize.width, self.keyboardSize.height);

    float visibleScrollViewHeight = self.scrollView.frame.size.height - keyboardHeight;
    float offsetInScrollViewCoords = (visibleScrollViewHeight / 2) - (textFieldFrame.size.height / 2);

    float scrollViewOffset = textFieldFrame.origin.y - offsetInScrollViewCoords;


    [UIView animateWithDuration:.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, scrollViewOffset);
    }completion:NULL];

}

you'll need these two properties in your @interface...
@property (nonatomic, assign) CGSize keyboardSize;
@property (nonatomic, strong) UITextField *currentTextField;

নোট করুন যে - (IBAction)textFieldGotFocus:ক্রিয়াটি প্রতিটি পাঠ্যফিল্ডের DidBeginEditingরাজ্যে আবদ্ধ ook

এছাড়াও কীবোর্ড বিজ্ঞপ্তি থেকে অ্যানিমেশন সময়কাল পাওয়া এবং এটি একটি নির্দিষ্ট মানের পরিবর্তে স্ক্রোলভিউ অ্যানিমেশনের জন্য ব্যবহার করা কিছুটা ভাল হবে তবে আমার বিরুদ্ধে মামলা করুন, এটি আমার পক্ষে যথেষ্ট ভাল ছিল;)


1

আপনি যদি খুব বেশি গণনা করতে না চান তবে নিম্নলিখিত এক্সটেনশনটি ব্যবহার করুন:

func scrollSubviewToBeVisible(subview: UIView, animated: Bool) {
    let visibleFrame = UIEdgeInsetsInsetRect(self.bounds, self.contentInset)
    let subviewFrame = subview.convertRect(subview.bounds, toView: self)
    if (!CGRectContainsRect(visibleFrame, subviewFrame)) {
        self.scrollRectToVisible(subviewFrame, animated: animated)
    }
}

এবং সম্ভবত আপনি আপনার ইউআইটিেক্সটফিল্ড সর্বদা দৃশ্যমান রাখতে চান:

func textViewDidChange(textView: UITextView) {
    self.scrollView?.scrollSubviewToBeVisible(textView, animated: false)
}

1

এই কোডটি সুইফট 3 এ চেষ্টা করুন:

override func viewDidAppear(_ animated: Bool) {
    setupViewResizerOnKeyboardShown()
}

func setupViewResizerOnKeyboardShown() {
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(self.keyboardWillShowForResizing),
                                           name: Notification.Name.UIKeyboardWillShow,
                                           object: nil)
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(self.keyboardWillHideForResizing),
                                           name: Notification.Name.UIKeyboardWillHide,
                                           object: nil)
}

func keyboardWillShowForResizing(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue,
        let window = self.view.window?.frame {
        // We're not just minusing the kb height from the view height because
        // the view could already have been resized for the keyboard before
        self.view.frame = CGRect(x: self.view.frame.origin.x,
                                 y: self.view.frame.origin.y,
                                 width: self.view.frame.width,
                                 height: window.origin.y + window.height - keyboardSize.height)

    } else {
        debugPrint("We're showing the keyboard and either the keyboard size or window is nil: panic widely.")
    }
}

func keyboardWillHideForResizing(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        let viewHeight = self.view.frame.height
        self.view.frame = CGRect(x: self.view.frame.origin.x,
                                 y: self.view.frame.origin.y,
                                 width: self.view.frame.width,
                                 height: viewHeight) //viewHeight + keyboardSize.height

    } else {
        debugPrint("We're about to hide the keyboard and the keyboard size is nil. Now is the rapture.")
    }
}

deinit {
        NotificationCenter.default.removeObserver(self)
    }

1

উপরের মাসা সমাধানের ভিত্তিতে সুইফট 5 সমাধান - এর সাথে সম্পর্কিত পরিবর্তনগুলি:

  • keyboardFrameEndUserInfoKeyপরিবর্তে ব্যবহার করুন keyboardFrameBeginUserInfoKey, কারণ এখানে keyboardFrameBeginUserInfoKeyপ্রথম উদাহরণ হিসাবে বর্ণিত অন্য মানটি প্রদর্শন করতে পারে: কীবোর্ডের উচ্চতা উপস্থিত হওয়ার সময় পরিবর্তিত হয়
  • বিজ্ঞপ্তিগুলি "করা" পরিবর্তে "উইল" ব্যবহার করে এটি সুইফট 5 কী নামগুলিতে পরিবর্তন করা: UIResponder.keyboardWillShowNotification/ এর UIResponder.keyboardWillHideNotificationপরিবর্তে NSNotification.Name.UIKeyboardDidShow/NSNotification.Name.UIKeyboardDidHide

কোড:

override func viewDidLoad() {
    super.viewDidLoad()
    registerForKeyboardNotifications()
}

func registerForKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardAppear(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisappear(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}

@objc func onKeyboardAppear(_ notification: NSNotification) {
    guard let info = notification.userInfo, let kbSize = (info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.size else { return }

    let insets = UIEdgeInsets(top: 0, left: 0, bottom: kbSize.height, right: 0)

    scrollView.contentInset = insets
    scrollView.scrollIndicatorInsets = insets

    //Other changes if needed
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

0

এটি করার জন্য আপনার আসলে ইউআইএসক্রোলভিউ দরকার নেই। আমি এই কোডটি ব্যবহার করেছি এবং এটি আমার পক্ষে কাজ করে:

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

   if (textField==_myTextField)
   {
      [self keyBoardAppeared];
   }
   return true;
}

-(void)textFieldDidEndEditing:(UITextField *)textField {
   if (textField==_myTextField)
   {
      [self keyBoardDisappeared];
   }
}

-(void) keyBoardAppeared
{
   CGRect frame = self.view.frame;

[UIView animateWithDuration:0.3
                      delay:0
                    options: UIViewAnimationCurveEaseOut
                 animations:^{
                     self.view.frame = CGRectMake(frame.origin.x, frame.origin.y-215, frame.size.width, frame.size.height);
                 }
                 completion:^(BOOL finished){

                 }];
}

-(void) keyBoardDisappeared
{
   CGRect frame = self.view.frame;

  [UIView animateWithDuration:0.3
                      delay:0
                    options: UIViewAnimationCurveEaseOut
                 animations:^{
                     self.view.frame = CGRectMake(frame.origin.x, frame.origin.y+215, frame.size.width, frame.size.height);
                 }
                 completion:^(BOOL finished){

                 }];
}

সমস্যা: হার্ড-কোডড মানগুলি ব্যবহার করে। আপনার পুরো ইউআইটিকে উপরে এবং নীচে স্থানান্তর করুন যা প্রায়শই দর্শনটির চেহারাতে গোলমাল করবে।
অর্থ-বিষয়গুলি

0

আপনি সম্পত্তি ব্যবহার করে স্ক্রল করতে পারেন contentOffsetমধ্যে UIScrollView, যেমন,

CGPoint offset = scrollview.contentOffset;
offset.y -= KEYBOARD_HEIGHT + 5;
scrollview.contentOffset = offset;

অ্যানিমেটেড স্ক্রোলিং করার একটি পদ্ধতিও রয়েছে।

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

কীবোর্ড বিজ্ঞপ্তি শুনতে আরও ভাল সমাধান হতে পারে, যেমন:

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

0

আমি জানি এটি এখন একটি পুরানো প্রশ্ন তবে আমি ভেবেছিলাম এটি অন্যকে সাহায্য করতে পারে। আমার কাছে থাকা কয়েকটি অ্যাপ্লিকেশনের জন্য আমি কিছু সহজ প্রয়োগ করতে চেয়েছিলাম, তাই আমি এটির জন্য একটি ক্লাস তৈরি করেছি। আপনি চাইলে এটি এখানে ডাউনলোড করতে পারেন: https://github.com/sdernley/iOSTextFieldHandler

এটি সমস্ত ইউআইটিেক্সটফিল্ডকে নিজের প্রতিনিধি রাখার মতোই সহজ

textfieldname.delegate = self;

এবং তারপরে আপনার স্ক্রোলভিউ এবং জমা বোতামের নাম সহ এটি আপনার ভিউ কন্ট্রোলারে যুক্ত করুন

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [iOSTextFieldHandler TextboxKeyboardMover:containingScrollView tf:textField btn:btnSubmit];
}

0

নীচে আমার সমাধানগুলি যা কাজ করে (5 টি পদক্ষেপ)

পদক্ষেপ 1: কোন ইউআইটিএসটিএফআইএলডিডি বা ইউআইটিএসটিভিউ শোডব্যাগেইনএডিটিং (যেখানে বস্তুটি ইনটাইটেড বা ভিউডিডলড রয়েছে তা ধরতে একটি পর্যবেক্ষক যুক্ত করুন।

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(updateActiveField:)
                                             name:@"UPDATE_ACTIVE_FIELD" object:nil];

পদক্ষেপ 2: যখন ..SITINDFIELD বা ইউআইটিএসটিভিউ এর ওবিজেইসিটি সহ স্বেচ্ছাসেবীকরণ সম্পাদনা করুন তখন একটি বিজ্ঞপ্তি পোস্ট করুন

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView {

[[NSNotificationCenter defaultCenter] postNotificationName:@"UPDATE_ACTIVE_FIELD" 
                                                    object:textView];
return YES;
}

স্টিপি 3: যে পদ্ধতিটি (স্টেপ 1 কল) বর্তমান ইউআইটিএসটিফিল্ড বা ইউআইটিএসটভিউ দেয়

-(void) updateActiveField: (id) sender {
    activeField = [sender object];
}

পদক্ষেপ 4: কীবোর্ড পর্যবেক্ষক যুক্ত করুন UIKeyboardWillShowNotifications (পদক্ষেপ 1 এর মতো একই জায়গা)

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification object:nil];

এবং পদ্ধতি:

// Called when the UIKeyboardDidShowNotification is sent.
- (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);

    _currentEdgeInsets = self.layoutPanel.contentInset; // store current insets to restore them later
    self.layoutPanel.contentInset = contentInsets;
    self.layoutPanel.scrollIndicatorInsets = contentInsets;

    // If active text field is hidden by keyboard, scroll it so it's visible
    CGRect aRect =  self.view.frame;
    aRect.size.height -= kbSize.height;

    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
    CGPoint p = [activeField convertPoint:activeField.bounds.origin toView:window];

    if (!CGRectContainsPoint(aRect, p) ) {
        CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y +kbSize.height);
       [self.layoutPanel setContentOffset:scrollPoint animated:YES];
       self.layoutPanel.scrollEnabled = NO;
    }
}

পদক্ষেপ 5: কীবোর্ড পর্যবেক্ষক যুক্ত করুন UIKeyboardWillHideNotifications (পদক্ষেপ 1 হিসাবে একই স্থান)

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

এবং পদ্ধতি:

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    self.layoutPanel.contentInset = _currentEdgeInsets;
    self.layoutPanel.scrollIndicatorInsets = _currentEdgeInsets;
    self.layoutPanel.scrollEnabled = YES;
}

মনে রাখবেন পর্যবেক্ষকদের অপসারণ!


0

আমি এই উত্তরটি সুধীর পালচুরি https://stackoverflow.com/users/2873919/sudheer-palchuri https://stackoverflow.com/a/32583809/6193496 সরবরাহ করে

ViewDidLoad এ, বিজ্ঞপ্তিগুলি নিবন্ধ করুন:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(DetailsViewController.keyboardWillShow(_:)), name:UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(DetailsViewController.keyboardWillHide(_:)), name:UIKeyboardWillHideNotification, object: nil)

নীচে পর্যবেক্ষক পদ্ধতিগুলি যুক্ত করুন যা কীবোর্ড প্রদর্শিত হওয়ার পরে স্বয়ংক্রিয় স্ক্রোলিং করে।

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

func keyboardWillShow(notification:NSNotification){

var userInfo = notification.userInfo!
var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue()
keyboardFrame = self.view.convertRect(keyboardFrame, fromView: nil)

var contentInset:UIEdgeInsets = self.scrollView.contentInset
contentInset.bottom = keyboardFrame.size.height
self.scrollView.contentInset = contentInset
}

func keyboardWillHide(notification:NSNotification){

var contentInset:UIEdgeInsets = UIEdgeInsetsZero
self.scrollView.contentInset = contentInset
}

0

আমার সমাধানটির 4 টি পদক্ষেপ রয়েছে:
- পদক্ষেপ 1: কীবোর্ডটি উপস্থিত হওয়ার পরে ফাংশনটি শোনে

- (void)keyboardWasShown:(NSNotification *)notification {
// Get the size of the keyboard.
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
//top: 64 for navigation bar, 0 for without navigation
UIEdgeInsets contentInsets = UIEdgeInsetsMake(64, 0, keyboardSize.height, 0);
_scrollView.contentInset = contentInsets;
_scrollView.scrollIndicatorInsets = contentInsets;
}

- দ্বিতীয় পদক্ষেপ: কীবোর্ডটি অদৃশ্য হয়ে গেলে ফাংশনটি শোনে

- (void)keyboardWillHide:(NSNotification *)notification {
//top: 64 for navigatiob bar
UIEdgeInsets contentInsets = UIEdgeInsetsMake(64, 0, 0, 0);
[_editScrollView setContentInset: contentInsets];
[_editScrollView setScrollIndicatorInsets: contentInsets];
}

- পদক্ষেপ 3: বিজ্ঞপ্তি কেন্দ্রে এই ফাংশনগুলি যুক্ত করুন:

- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- চতুর্থ ধাপ: দেখুন যখন নিয়ামক অদৃশ্য হয়ে যায় তখন শোনো

- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.