কীবোর্ডটি দ্রুত প্রদর্শিত হলে পাঠ্যক্ষেত্রটি সরান


217

আমি আইওএসের সাথে প্রোগ্রামিংয়ের জন্য সুইফ্ট ব্যবহার করছি এবং আমি এই কোডটি সরানোর জন্য এই কোডটি ব্যবহার করছি UITextField, তবে এটি কার্যকর হয় না। আমি ফাংশনটি keyboardWillShowসঠিকভাবে বলেছি , তবে পাঠ্যক্ষেত্রটি সরবে না। আমি অটোলেআউট ব্যবহার করছি।

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

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

func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        //let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)

        var frame = self.ChatField.frame
        frame.origin.y = frame.origin.y - keyboardSize.height + 167
        self.chatField.frame = frame
        println("asdasd")
    }
}

2
প্রোজেক্ট ফাইলগুলির সাথে ওয়াকথ্রু
ড্যান

সম্ভবত ডিনিট এবং ভিউডিলড ভারসাম্যপূর্ণ নয়।
রিকার্ডো

অ্যাপলের উভয় দস্তাবেজ এবং ব্যক্তিগত অভিজ্ঞতার ভিত্তিতে। টিআইএফ সরানোর জন্য ইউআইএসক্রোলভিউ ব্যবহার করে আমার গিট রেপো এখানে রয়েছে: github.com/29satnam/MoveTextFieldWhenKeyboardAppearsSwift
কোডেটার্ড

উত্তর:


315

বিদ্যমান উত্তরের উপর বেশ কয়েকটি উন্নতি করতে হবে।

প্রথমত UIKeyboardWillChangeFrameNotifications সম্ভবত সেরা নোটিফিকেশন হ'ল এটি কেবল পরিবর্তন / হাইডের পরিবর্তিত কীবোর্ড পরিবর্তনের কারণে পরিবর্তিত (ভাষা, তৃতীয় পক্ষের কীবোর্ডগুলি ব্যবহার করে) এবং রোটেশনের কারণেও পরিবর্তনগুলি পরিচালনা করে (তবে নীচে নোট মন্তব্যটি কীবোর্ডটি লুকিয়ে রাখতে হবে হার্ডওয়্যার কীবোর্ড সংযোগ সমর্থন করার জন্যও পরিচালনা করা হবে)।

দ্বিতীয়ত অ্যানিমেশনগুলি সঠিকভাবে একসাথে রয়েছে কিনা তা নিশ্চিত করতে অ্যানিমেশন প্যারামিটারগুলি বিজ্ঞপ্তি থেকে টানা যেতে পারে।

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

সুইফট 3

class MyViewController: UIViewController {

// This constraint ties an element at zero points from the bottom layout guide
@IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint?

override func viewDidLoad() {
    super.viewDidLoad()
    // Note that SO highlighting makes the new selector syntax (#selector()) look
    // like a comment but it isn't one
    NotificationCenter.default.addObserver(self,
        selector: #selector(self.keyboardNotification(notification:)),
        name: NSNotification.Name.UIKeyboardWillChangeFrame,
        object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardNotification(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
        let endFrameY = endFrame.origin.y ?? 0
        let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue
        let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
        if endFrameY >= UIScreen.main.bounds.size.height {
            self.keyboardHeightLayoutConstraint?.constant = 0.0
        } else {
            self.keyboardHeightLayoutConstraint?.constant = endFrame?.size.height ?? 0.0
        }
        UIView.animate(withDuration: duration,
                                   delay: TimeInterval(0),
                                   options: animationCurve,
                                   animations: { self.view.layoutIfNeeded() },
                                   completion: nil)
    }
}

(নীচে @ গাবক্সের দুর্দান্ত মন্তব্য অনুসারে সঙ্কুচিত হওয়ার পরিবর্তে কীবোর্ড অ্যানিমেটিং অফস্ক্রিনের জন্য অ্যাকাউন্টে সম্পাদিত)

সুইফট 5

class MyViewController: UIViewController {

// This constraint ties an element at zero points from the bottom layout guide
@IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint?

override func viewDidLoad() {
    super.viewDidLoad()
    // Note that SO highlighting makes the new selector syntax (#selector()) look
    // like a comment but it isn't one
    NotificationCenter.default.addObserver(self,
        selector: #selector(self.keyboardNotification(notification:)),
        name: UIResponder.keyboardWillChangeFrameNotification,
        object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardNotification(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
        let endFrameY = endFrame?.origin.y ?? 0
        let duration:TimeInterval = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
        let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
        if endFrameY >= UIScreen.main.bounds.size.height {
            self.keyboardHeightLayoutConstraint?.constant = 0.0
        } else {
            self.keyboardHeightLayoutConstraint?.constant = endFrame?.size.height ?? 0.0
        }
        UIView.animate(withDuration: duration,
                                   delay: TimeInterval(0),
                                   options: animationCurve,
                                   animations: { self.view.layoutIfNeeded() },
                                   completion: nil)
    }
}

1
পছন্দ করেছেন কিন্তু আমি দেখতে পেলাম যে কীবোর্ডটি লুকিয়ে থাকলে endFrame?.size.heightএটি কার্যকর হয় না কারণ শূন্য নয়। আমি হিসাবে শেষ ফ্রেম পেয়েছিলাম UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 1024}, {768, 264}}";। আইওএস 8.3 আইপ্যাড সিমুলেটর, প্রতিকৃতিতে চলেছে Ran এক্সকোড 6.3 বিটা 4।
হ্লুং

8
যদি কীবোর্ডটি আড়াল না করে তবে এই কোডটি ব্যবহার করে শেষ ফ্রেম? = endFrame.size.height}
গ্যাব্রিয়েল

3
কীবোর্ডহাইটলাউটকন্ট্রাইন্ট ইন্টারফেসবিল্ডারে সংজ্ঞায়িত একটি সীমাবদ্ধতা যা আপনি নীচের বিন্যাস গাইড বা ভিউকন্ট্রোলারের জন্য মূল দৃশ্যের নীচে সরিয়ে নিতে / সঙ্কুচিত করতে চান এমন দৃশ্যের সীমাবদ্ধ করে। ধ্রুবকটি প্রাথমিকভাবে শূন্যে সেট করা থাকে এবং কীবোর্ড প্রদর্শিত হওয়ার সাথে সাথে আকার পরিবর্তিত হলে কীবোর্ডের জন্য জায়গা তৈরি করতে সামঞ্জস্য করা হবে।
জোসেফ লর্ড

2
নোট করুন যে .UIKeyboardWillChangeFrameকোনও হার্ডওয়্যার কীবোর্ড সংযুক্ত থাকা অবস্থায় অগ্নিকাণ্ড হয় না, যদিও আইওএস কীবোর্ড অদৃশ্য হয়ে যায়। .UIKeyboardWillHideএই প্রান্তের কেসটি ধরতে আপনাকে অবশ্যই পর্যবেক্ষণ করতে হবে।
জামেস্ক

1
@ সুলতান ঠিক আছে কাজ করে .. আমার সমস্যাটি হ'ল কী-বোর্ডের চেয়ে কিছুটা বেশি। কোন উপায় আছে যে আমরা এটি ঠিক করতে পারি?
পাভলোস

128

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

func keyboardWasShown(notification: NSNotification) {
    let info = notification.userInfo!
    let keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()

    UIView.animateWithDuration(0.1, animations: { () -> Void in
        self.bottomConstraint.constant = keyboardFrame.size.height + 20
    })
}

হার্ডকোডযুক্ত 20 টি কেবলমাত্র কিছুটা কীবোর্ডের উপরে পাঠ্যক্ষেত্রটি পপ করতে যুক্ত করা হয়েছে। অন্যথায় কীবোর্ডের শীর্ষস্থান এবং টেক্সটফিল্ডের নীচের মার্জিনটি স্পর্শ করবে।

কীবোর্ড খারিজ হয়ে গেলে, সীমাবদ্ধতার মানটিকে তার আসল মানটিতে পুনরায় সেট করুন।


1
আপনি কীভাবে আমি এটি সংজ্ঞায়িত করতে পারেন দয়া করে আমাকে ব্যাখ্যা করতে পারেন? ধন্যবাদ! আমি সবসময় স্টোরিবোর্ডে সমস্ত নিয়ন্ত্রণ করি
পেড্রো ম্যানফ্রেডি

4
সীমাবদ্ধতাটি আমি নাম দিয়েছি ra আমি কনস্ট্যান্টটি সিলেক্ট করেছি, টেনে এনে এটিতে একটি আইবিআউটলেট তৈরি করেছি এবং সেই নামটি দিয়েছি। আপনি অন্যান্য ইউআই উপাদান যেমন বোতাম এবং পাঠ্য ক্ষেত্রগুলির সাথে করতে পারেন ঠিক তেমন সীমাবদ্ধতার জন্য IBOutlet তৈরি করতে পারেন।
ইসুরু

2
অ্যানিমেশনটি আমার জন্য তাত্ক্ষণিক ঘটেছিল বাদে এই উত্তরটি দুর্দান্ত কাজ করেছিল। পরীক্ষা করে দেখুন আমি কিভাবে সজীব বাধ্যতা পরিবর্তন করবেন? কিভাবে সঠিকভাবে প্রাণবন্ত করতে হয়।
অ্যাডাম জনস

2
@ vinhai4u আপনাকে UIKeyboardWillShowNotificationবিজ্ঞপ্তির জন্য নিবন্ধন করতে হবে । ওপির প্রশ্নের কোডটি দেখুন।
ইসুরু

8
@ অ্যাডাম জোনস সীমাবদ্ধতার পরিবর্তনটি সক্রিয় করতে, অ্যানিমেট ব্লকের ভিতরে স্থির আপডেট করুন animateWithDurationএবং কল করুন self.view.layoutIfNeeded()
সর্বোচ্চ

110

একটি সহজ সমাধান কীবোর্ড উচ্চতার ধ্রুবক সঙ্গে ভিউ আপ সরানো হয়।

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

@objc func keyboardWillShow(sender: NSNotification) {
     self.view.frame.origin.y = -150 // Move view 150 points upward 
}

@objc func keyboardWillHide(sender: NSNotification) {
     self.view.frame.origin.y = 0 // Move view to original position  
}

সুইফট 5:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(sender:)), name: UIResponder.keyboardWillShowNotification, object: nil);

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(sender:)), name: UIResponder.keyboardWillHideNotification, object: nil);

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

2
দৃশ্যটি সরানোর পরিবর্তে, টেক্সটভিউটি সরান
23'15 এরিকগু

1
যদি ব্যবহারকারীরা ইনপুট ভাষা স্যুইচ করে তবে এটি ভিউটির y মানটি বজায় রাখবে।
জেফ্রি নিও

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

5
এর পরিবর্তে ব্যবহার করার self.view.frame.origin.y -= 150ব্যবহার self.view.frame.origin.y = -150এবং পরিবর্তে self.view.frame.origin.y += 150ব্যবহার self.view.frame.origin.y = 0। প্রতিবার নতুন ক্ষেত্রটি স্পর্শ করার সাথে সাথে দর্শনটি 150 চালিয়ে যাওয়া বাধা দেয়।
গানউইন

43

পাঠ্যক্ষেত্র সম্পাদনা করার সময় আপনার দর্শন সরিয়ে দেওয়ার জন্য, আমি এটি প্রয়োগ করেছি,

বিকল্প 1: - ** ** নোটিফিকেশন সেন্টার ব্যবহার করে সুইফ্ট 5.0 এবং আইফোন এক্স, এক্সআর, এক্সএস এবং এক্সএস ম্যাক্স মুভের আপডেট

  • এই বিজ্ঞপ্তিটি নিবন্ধন করুন func viewWillAppear(_ animated: Bool)

  • এই বিজ্ঞপ্তিটি নিবন্ধভুক্ত করুন func viewWillDisappear(_ animated: Bool)

দ্রষ্টব্য: - আপনি যদি এটির চেয়ে নিবন্ধন না করেন তবে শিশু শ্রেণী থেকে কল হবে এবং ক্র্যাশ হওয়ার কারণ হবে বা অন্যথায়।

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillShow(notification:)), name:  UIResponder.keyboardWillShowNotification, object: nil )
}
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
}

@objc func keyboardWillShow( notification: Notification) {
    if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        var newHeight: CGFloat
        let duration:TimeInterval = (notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = notification.userInfo![UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
        let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)
        if #available(iOS 11.0, *) {
            newHeight = keyboardFrame.cgRectValue.height - self.view.safeAreaInsets.bottom
        } else {
            newHeight = keyboardFrame.cgRectValue.height
        }
        let keyboardHeight = newHeight  + 10 // **10 is bottom margin of View**  and **this newHeight will be keyboard height**
        UIView.animate(withDuration: duration,
                       delay: TimeInterval(0),
                       options: animationCurve,
                       animations: {
                        self.view.textViewBottomConstraint.constant = keyboardHeight **//Here you can manage your view constraints for animated show**
                        self.view.layoutIfNeeded() },
                       completion: nil)
    }
}

বিকল্প 2: - এটির কাজ ঠিক আছে

func textFieldDidBeginEditing(textField: UITextField) {
        self.animateViewMoving(up: true, moveValue: 100)
}
func textFieldDidEndEditing(textField: UITextField) {
        self.animateViewMoving(up: false, moveValue: 100)
}

func animateViewMoving (up:Bool, moveValue :CGFloat){
    var movementDuration:NSTimeInterval = 0.3
    var movement:CGFloat = ( up ? -moveValue : moveValue)
    UIView.beginAnimations( "animateView", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration )
    self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
    UIView.commitAnimations()
}

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

সুইফটে 4 ---

func textFieldDidBeginEditing(_ textField: UITextField) {
        animateViewMoving(up: true, moveValue: 100)
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        animateViewMoving(up: false, moveValue: 100)
    }
    func animateViewMoving (up:Bool, moveValue :CGFloat){
        let movementDuration:TimeInterval = 0.3
        let movement:CGFloat = ( up ? -moveValue : moveValue)
        UIView.beginAnimations( "animateView", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(movementDuration ) 
        self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
        UIView.commitAnimations()
    }

1
@ জোগেন্দ্র.কম, আপনার কঠোর পরিশ্রমের জন্য ধন্যবাদ B তবে এটি আইফোন 5,4 এবং 6. এ সেরা কাজ করে তবে আমি কীভাবে এটি আইফোন 6 প্লাস এবং আইপ্যাড (উচ্চতর) এ অক্ষম করতে পারি
থিহা অং

আপনি যদি বিকল্প 1 ব্যবহার করছেন তবে দয়া করে একটি সীমাবদ্ধতা IBOutlet যুক্ত করবেন তা নিশ্চিত হন। আপনি একটি সীমাবদ্ধতা তৈরি করবেন যা আপনি অটো-লেআউটটি ব্যবহার করে পুনরায় আকার দিতে চান তারপরে আইবিআউটলেট তৈরি করতে এটি ভিউকন্ট্রোলারের কাছে টেনে আনুন এবং এটিকে অ্যানিমেট ফাংশনটিতে আমি self.iboutletConstraint.constant হিসাবে উল্লেখ করি। এছাড়াও এটি কীবোর্ডটি আড়াল করার সময় আউটলেটটিকে পুনরায় সামঞ্জস্য করে না, আমি সীমাবদ্ধতাটিকে মূল মূল্যে পুনরায় সেট করে পরিচালনা করেছি।
হামাদ তারিক

21

আমি পরিষ্কার সুইফ্ট কোড পছন্দ করি। তাই কীবোর্ডের সাহায্যে একটি পাঠ্য ভিউ উপরে / নীচে সরানোর জন্য আমি যেতমতম কোডটি নিয়ে আসতে পারি তা এখানে। এটি বর্তমানে একটি আইওএস 8/9 সুইফট 2 প্রোডাকশন অ্যাপে কাজ করছে।

আপডেট (মার্চ 2016): আমি যতটা সম্ভব আমার পূর্ববর্তী কোডটি আরও শক্ত করে তুলেছি। এছাড়াও, এখানে প্রচুর জনপ্রিয় উত্তর রয়েছে যা কীবোর্ডের উচ্চতা এবং অ্যানিমেশন প্যারামিটারগুলিকে হার্ডকোড করে। এর প্রয়োজন নেই, উল্লেখ করার দরকার নেই যে এই উত্তরগুলির সংখ্যাগুলি সর্বদা আমার 6s + iOS9 (226-র কীবোর্ডের উচ্চতা, 0.25 সময়কাল এবং 7 এর অ্যানিমেশন কার্ভ) এ দেখা প্রকৃত মানগুলির সাথে সামঞ্জস্য হয় না। যাইহোক, সিস্টেম থেকে এই মানগুলি পাওয়ার জন্য এটি কোনও অতিরিক্ত কোড নয়। নিচে দেখ.

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "animateWithKeyboard:", name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "animateWithKeyboard:", name: UIKeyboardWillHideNotification, object: nil)
}

func animateWithKeyboard(notification: NSNotification) {

    // Based on both Apple's docs and personal experience, 
    // I assume userInfo and its documented keys are available.
    // If you'd like, you can remove the forced unwrapping and add your own default values.

    let userInfo = notification.userInfo!
    let keyboardHeight = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue().height
    let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as! Double
    let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as! UInt
    let moveUp = (notification.name == UIKeyboardWillShowNotification)

    // baseContraint is your Auto Layout constraint that pins the
    // text view to the bottom of the superview.

    baseConstraint.constant = moveUp ? -keyboardHeight : 0

    let options = UIViewAnimationOptions(rawValue: curve << 16)
    UIView.animateWithDuration(duration, delay: 0, options: options,
        animations: {
            self.view.layoutIfNeeded()
        },
        completion: nil
    )

}

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


সুইফট ১.১ বলে মনে হচ্ছে এবং আমি মনে করি যে সুইফট ১.২ এ সংকলন করা হবে না কারণ এটি asফোর্স ক্যাসেটগুলির জন্য ব্যবহার করে। as!কাজ করতে পারে তবে আপনি এই পৃষ্ঠায় অন্য কোথাও দেখতে পাচ্ছেন আমি বলপূর্বক ক্যাসেটগুলি এড়িয়ে চলি এবং নিজেকে নিজেকে মোড়ানোর জন্য বাধ্য করি।
জোসেফ লর্ড

এখন সুইফট ১.২ এ সংকলন করুন। এবং আমি কোড পুনরায় একটি মন্তব্য যুক্ত করেছি: জোর করে আন-র্যাপিং। চিয়ার্স।
স্কুটার্ম্গ

উফ। আমি সুইফট 2
-কে

আপনি কীভাবে baseConstraintএটি সংযুক্ত করেছেন তার উপর নির্ভর করে এটি এর baseConstraint.constant = moveUp ? keyboardHeight : 0পরিবর্তে হতে পারে baseConstraint.constant = moveUp ? -keyboardHeight : 0
দৈর্ঘ্য

15

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


এটি @ জোসেফলর্ডের উত্তরের একটি উন্নত সংস্করণ।

আইওএস 8.3 আইপ্যাড সিমুলেটর, প্রতিকৃতি হিসাবে পরীক্ষা করা হয়েছে। Xcode6.3 beta4, আমি দেখেছি তার উত্তর কাজ কীবোর্ড লুকিয়ে কারণ না UIKeyboardFrameEndUserInfoKeyহয় "NSRect: {{0, 1024}, {768, 264}}";। উচ্চতা কখনই হয় না 0

এটি গতানুগতিক ব্যবহার করতে UIKeyboardWillShowNotificationএবং UIKeyboardWillHideNotificationশেষ ফ্রেমের উচ্চতার উপর নির্ভর করার পরিবর্তে কীবোর্ডটি কখন লুকিয়ে থাকে তা আরও ভাল করে বলতে। UIKeyboardWillShowNotificationকীবোর্ড ফ্রেম পরিবর্তন করা হয় তখন এটি প্রেরণ করা হয় যাতে এটি সমস্ত ব্যবহারের ক্ষেত্রে আবশ্যক।

    // You have to set this up in storyboard first!. 
    // It's a vertical spacing constraint between view and bottom of superview.
    @IBOutlet weak var bottomSpacingConstraint: NSLayoutConstraint! 

    override func viewDidLoad() {
        super.viewDidLoad()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardNotification:"), name:UIKeyboardWillShowNotification, object: nil);
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardNotification:"), name:UIKeyboardWillHideNotification, object: nil);
    }

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

    func keyboardNotification(notification: NSNotification) {

        let isShowing = notification.name == UIKeyboardWillShowNotification

        if let userInfo = notification.userInfo {
            let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
            let endFrameHeight = endFrame?.size.height ?? 0.0
            let duration:NSTimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
            let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
            let animationCurveRaw = animationCurveRawNSN?.unsignedLongValue ?? UIViewAnimationOptions.CurveEaseInOut.rawValue
            let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
            self.bottomSpacingConstraint?.constant = isShowing ? endFrameHeight : 0.0
            UIView.animateWithDuration(duration,
                delay: NSTimeInterval(0),
                options: animationCurve,
                animations: { self.view.layoutIfNeeded() },
                completion: nil)
        }
    }

আপনি দয়া করে আপনার সম্পাদনা ব্যাখ্যা করতে পারেন? আমি এটি কাজ করতে পারে না। নীচে একটি বাটন সহ আমার একটি ইউআইএসক্রোলভিউ রয়েছে। আমি ক্লাসটি নীচে মার্জিন নীচের সীমাবদ্ধতায় সেট করেছি।
schw4ndi

@ schw4ndi আপনার নীচের সীমাবদ্ধতাগুলি কী দেখায়? এটি স্ক্রোলভিউয়ের তত্ত্বাবধানের নীচে স্ক্রোলভিউয়ের নীচে সংযোগ করা উচিত।
হ্লুং

ওহ ধন্যবাদ, আমার বোতাম এবং স্ক্রোলভিউয়ের মধ্যে বাধা ছিল
schw4ndi

9

আমি দ্রুত 4 নিয়ে কাজ করছি এবং আমি কোনও অতিরিক্ত নীচের সীমাবদ্ধতা ব্যবহার না করেই এই সমস্যাটি সমাধান করে দেখছি আমার কোডটি এখানে রয়েছে its সত্যই আমার ক্ষেত্রে কাজ করছে

1) লোড মধ্যে বিজ্ঞপ্তি পর্যবেক্ষক যুক্ত করুন

override func viewDidLoad() {
        super.viewDidLoad()
        setupManager()
        // Do any additional setup after loading the view.
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

2) বিজ্ঞপ্তি পর্যবেক্ষকের মত সরান

deinit {
        NotificationCenter.default.removeObserver(self)
    }

3) কীবোর্ড শো / লুকানোর পদ্ধতি যুক্ত করুন

 @objc func keyboardWillShow(notification: NSNotification) {
            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                UIView.animate(withDuration: 0.1, animations: { () -> Void in
                    self.view.frame.origin.y -= keyboardSize.height
                    self.view.layoutIfNeeded()
                })
            }
        }

@objc func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            UIView.animate(withDuration: 0.1, animations: { () -> Void in
                self.view.frame.origin.y += keyboardSize.height
                self.view.layoutIfNeeded()
            })
        }
    }

৪) টেক্সটফিল্ড প্রতিনিধি যুক্ত করুন এবং স্পর্শগুলি শুরু করুন বিগান পদ্ধতিগুলি screen

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view.endEditing(true)

    }

হওয়া দরকারUIKeyboardFrameEndUserInfoKey
মাইক্রো

1
NSNotification.Name.UIKeyboardWillShow এ পুনঃনাম করা হয় UIResponder.keyboardWillShowNotificationএছাড়াও UIKeyboardFrameBeginUserInfoKey থেকেUIResponder.keyboardFrameBeginUserInfoKey
smj

7

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

// You have to set this up in storyboard first!. 
// It's a vertical spacing constraint between view and bottom of superview.
@IBOutlet weak var bottomSpacingConstraint: NSLayoutConstraint! 

override func viewDidLoad() {
        super.viewDidLoad()            

        //    Receive(Get) Notification
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardNotification:", name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardNotification:", name: UIKeyboardWillHideNotification, object: nil)


        self.originalConstraint = self.keyboardHeightLayoutConstraint?.constant //for original coordinate.
}

func keyboardNotification(notification: NSNotification) {
        let isShowing = notification.name == UIKeyboardWillShowNotification

        var tabbarHeight: CGFloat = 0
        if self.tabBarController? != nil {
            tabbarHeight = self.tabBarController!.tabBar.frame.height
        }
        if let userInfo = notification.userInfo {
            let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
            let duration:NSTimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
            let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
            let animationCurveRaw = animationCurveRawNSN?.unsignedLongValue ?? UIViewAnimationOptions.CurveEaseInOut.rawValue
            let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)
            self.keyboardHeightLayoutConstraint?.constant = isShowing ? (endFrame!.size.height - tabbarHeight) : self.originalConstraint!
            UIView.animateWithDuration(duration,
                delay: NSTimeInterval(0),
                options: animationCurve,
                animations: { self.view.layoutIfNeeded() },
                completion: nil)
        }
}

6

সবচেয়ে সহজ উপায় যে কোনও কোডের প্রয়োজন নেই:

  1. কীবোর্ডলয়আউটকন্ট্রাইনট.সুইফ্ট ডাউনলোড করুন করুন এবং যদি আপনি ইতিমধ্যে স্প্রিং অ্যানিমেশন কাঠামো ব্যবহার না করেন তবে আপনার প্রকল্পটিতে ফাইলটি যুক্ত করুন (টেনে আনুন এবং ছেড়ে দিন)।
  2. আপনার স্টোরিবোর্ডে, অবজেক্ট / ভিউ / টেক্সটফিল্ডের জন্য নীচের সীমাবদ্ধতা তৈরি করুন, সীমাবদ্ধতাটি নির্বাচন করুন (এটিতে ডাবল ক্লিক করুন) এবং পরিচয় পরিদর্শকতে, এনএসলয়আউটকন্ট্রেন্ট থেকে তার বোর্ডকে কী-বোর্ড-লেআউটকন্ট্রেন্টে পরিবর্তন করুন।
  3. সম্পন্ন!

সিঙ্কে অবজেক্টটি কীবোর্ডের সাহায্যে স্বয়ংক্রিয়ভাবে সরে যাবে।


2
দুর্দান্ত সমাধান! তবে আপনার সীমাবদ্ধতার প্রথম আইটেম হিসাবে নিরাপদ অঞ্চল। নীচের অংশটি দরকার (এটি যখন দ্বিতীয় আইটেম ছিল তখন আমার পক্ষে কাজ করেনি)। ক্ষেত্র এবং কীবোর্ডটি প্রদর্শন করার জন্য এটি কেবলমাত্র স্থিতিস্থাপকতা সংরক্ষণ করে এবং এটি সামঞ্জস্য করে না কেন এটি ধ্রুবক সেট 0 তে সেরা কাজ করেছে।
মিথিল্যান্ডিয়া

আপনার কী-বোর্ড-লেআউটকন্ট্রাইট সুইফট 4 সংস্করণ রয়েছে?
jeet.chanchawat

6

কীবোর্ডের উপস্থিতি / অন্তর্ধানের জন্য আমি একটি সুইফট 3 প্রোটোকল তৈরি করেছি

import UIKit

protocol KeyboardHandler: class {

var bottomConstraint: NSLayoutConstraint! { get set }

    func keyboardWillShow(_ notification: Notification)
    func keyboardWillHide(_ notification: Notification)
    func startObservingKeyboardChanges()
    func stopObservingKeyboardChanges()
}


extension KeyboardHandler where Self: UIViewController {

    func startObservingKeyboardChanges() {

        // NotificationCenter observers
        NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillShow, object: nil, queue: nil) { [weak self] notification in
          self?.keyboardWillShow(notification)
        }

        // Deal with rotations
        NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil, queue: nil) { [weak self] notification in
          self?.keyboardWillShow(notification)
        }

        // Deal with keyboard change (emoji, numerical, etc.)
        NotificationCenter.default.addObserver(forName: NSNotification.Name.UITextInputCurrentInputModeDidChange, object: nil, queue: nil) { [weak self] notification in
          self?.keyboardWillShow(notification)
        }

        NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillHide, object: nil, queue: nil) { [weak self] notification in
          self?.keyboardWillHide(notification)
        }
    }


    func keyboardWillShow(_ notification: Notification) {

      let verticalPadding: CGFloat = 20 // Padding between the bottom of the view and the top of the keyboard

      guard let value = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
      let keyboardHeight = value.cgRectValue.height

      // Here you could have more complex rules, like checking if the textField currently selected is actually covered by the keyboard, but that's out of this scope.
      self.bottomConstraint.constant = keyboardHeight + verticalPadding

      UIView.animate(withDuration: 0.1, animations: { () -> Void in
          self.view.layoutIfNeeded()
      })
  }


  func keyboardWillHide(_ notification: Notification) {
      self.bottomConstraint.constant = 0

      UIView.animate(withDuration: 0.1, animations: { () -> Void in
          self.view.layoutIfNeeded()
      })
  }


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

}

তারপরে, এটি কোনও ইউআইভিউউকন্ট্রোলারে প্রয়োগ করতে, নিম্নলিখিতগুলি করুন:

  • ভিউকন্ট্রোলারটিকে এই প্রোটোকলের সাথে সামঞ্জস্য করুন:

    class FormMailVC: UIViewControlle, KeyboardHandler {
  • উইলঅ্যাপিয়ারে কীবোর্ড পরিবর্তনগুলি পর্যবেক্ষণ শুরু করুন:

    // MARK: - View controller life cycle
    override func viewWillAppear(_ animated: Bool) {
      super.viewWillAppear(animated)
      startObservingKeyboardChanges()
    }
  • উইলডিস্পায়ারে কীবোর্ড পরিবর্তনগুলি পর্যবেক্ষণ বন্ধ করুন:

    override func viewWillDisappear(_ animated: Bool) {
      super.viewWillDisappear(animated)
      stopObservingKeyboardChanges()
    }
  • স্টোরিবোর্ড থেকে নীচের সীমাবদ্ধতার জন্য একটি আইবিআউটলেট তৈরি করুন:

    // NSLayoutConstraints
    @IBOutlet weak var bottomConstraint: NSLayoutConstraint!

    (আমি আপনার সমস্ত ইউআইকে একটি "কন্টেন্টভিউ" এর মধ্যে এম্বেড করার পরামর্শ দিচ্ছি এবং এই সামগ্রীর সাথে এই বিষয়বস্তু থেকে নীচের সীমাবদ্ধতাটি দেখুন নীচের বিন্যাস গাইডটিতে) বিষয়বস্তু দেখার নীচে সীমাবদ্ধতা

  • শীর্ষ সীমাবদ্ধতার সীমাবদ্ধ অগ্রাধিকার 250 (নিম্ন) এ পরিবর্তন করুন

বিষয়বস্তু দেখার শীর্ষ সীমাবদ্ধতা

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

  • কনটেন্টভিউ কীভাবে স্লাইড হওয়া উচিত তা নির্ধারণ করার জন্য আপনার অটলআউটে যথেষ্ট বাধা রয়েছে তা নিশ্চিত করুন।

এর জন্য আপনাকে "সমান চেয়ে বড়" সীমাবদ্ধতা যুক্ত করতে হতে পারে: "সমান থেকে বড়" বাধা

এবং এই আপনি যান! কীবোর্ড ছাড়া

কীবোর্ড সহ


আপনি যদি কোনও সতর্কতা ছাড়াই "রিলেশন = সমান" রাখেন তবে এটি কাজ করে।
ভালটনী বোয়াভেন্তুরা

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

ওকে ফ্রেডেরিক, রাজি হয়েছেন। একটি দুর্দান্ত সমাধান ছিল!
ভল্টোনি বোয়াভেন্তুরা

নিখোঁজimport UIKit
মিরকো

6

যেমন সহজ UIViewController এক্সটেনশন ব্যবহার করা যেতে পারে

//MARK: - Observers
extension UIViewController {

    func addObserverForNotification(notificationName: String, actionBlock: (NSNotification) -> Void) {
        NSNotificationCenter.defaultCenter().addObserverForName(notificationName, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: actionBlock)
    }

    func removeObserver(observer: AnyObject, notificationName: String) {
        NSNotificationCenter.defaultCenter().removeObserver(observer, name: notificationName, object: nil)
    }
}

//MARK: - Keyboard observers
extension UIViewController {

    typealias KeyboardHeightClosure = (CGFloat) -> ()

    func addKeyboardChangeFrameObserver(willShow willShowClosure: KeyboardHeightClosure?,
        willHide willHideClosure: KeyboardHeightClosure?) {
            NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardWillChangeFrameNotification,
                object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: { [weak self](notification) in
                    if let userInfo = notification.userInfo,
                        let frame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue(),
                        let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double,
                        let c = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? UInt,
                        let kFrame = self?.view.convertRect(frame, fromView: nil),
                        let kBounds = self?.view.bounds {

                            let animationType = UIViewAnimationOptions(rawValue: c)
                            let kHeight = kFrame.size.height
                            UIView.animateWithDuration(duration, delay: 0, options: animationType, animations: {
                                if CGRectIntersectsRect(kBounds, kFrame) { // keyboard will be shown
                                    willShowClosure?(kHeight)
                                } else { // keyboard will be hidden
                                    willHideClosure?(kHeight)
                                }
                                }, completion: nil)
                    } else {
                            print("Invalid conditions for UIKeyboardWillChangeFrameNotification")
                    }
            })
    }

    func removeKeyboardObserver() {
        removeObserver(self, notificationName: UIKeyboardWillChangeFrameNotification)
    }
}

ব্যবহারের উদাহরণ

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

        removeKeyboardObserver()
    }

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

    addKeyboardChangeFrameObserver(willShow: { [weak self](height) in
        //Update constraints here
        self?.view.setNeedsUpdateConstraints()
        }, willHide: { [weak self](height) in
        //Reset constraints here
        self?.view.setNeedsUpdateConstraints()
    })
}

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

//MARK: - Observers
extension UIViewController {

  func addObserverForNotification(_ notificationName: Notification.Name, actionBlock: @escaping (Notification) -> Void) {
    NotificationCenter.default.addObserver(forName: notificationName, object: nil, queue: OperationQueue.main, using: actionBlock)
  }

  func removeObserver(_ observer: AnyObject, notificationName: Notification.Name) {
    NotificationCenter.default.removeObserver(observer, name: notificationName, object: nil)
  }
}

//MARK: - Keyboard handling
extension UIViewController {

  typealias KeyboardHeightClosure = (CGFloat) -> ()

  func addKeyboardChangeFrameObserver(willShow willShowClosure: KeyboardHeightClosure?,
                                      willHide willHideClosure: KeyboardHeightClosure?) {
    NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillChangeFrame,
                                           object: nil, queue: OperationQueue.main, using: { [weak self](notification) in
                                            if let userInfo = notification.userInfo,
                                              let frame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue,
                                              let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double,
                                              let c = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? UInt,
                                              let kFrame = self?.view.convert(frame, from: nil),
                                              let kBounds = self?.view.bounds {

                                              let animationType = UIViewAnimationOptions(rawValue: c)
                                              let kHeight = kFrame.size.height
                                              UIView.animate(withDuration: duration, delay: 0, options: animationType, animations: {
                                                if kBounds.intersects(kFrame) { // keyboard will be shown
                                                  willShowClosure?(kHeight)
                                                } else { // keyboard will be hidden
                                                  willHideClosure?(kHeight)
                                                }
                                              }, completion: nil)
                                            } else {
                                              print("Invalid conditions for UIKeyboardWillChangeFrameNotification")
                                            }
    })
  }

  func removeKeyboardObserver() {
    removeObserver(self, notificationName: NSNotification.Name.UIKeyboardWillChangeFrame)
  }
}

সুইফট 4.2

//MARK: - Keyboard handling
extension UIViewController {

    func addObserverForNotification(_ notificationName: Notification.Name, actionBlock: @escaping (Notification) -> Void) {
        NotificationCenter.default.addObserver(forName: notificationName, object: nil, queue: OperationQueue.main, using: actionBlock)
    }

    func removeObserver(_ observer: AnyObject, notificationName: Notification.Name) {
        NotificationCenter.default.removeObserver(observer, name: notificationName, object: nil)
    }

    typealias KeyboardHeightClosure = (CGFloat) -> ()

    func removeKeyboardObserver() {
        removeObserver(self, notificationName: UIResponder.keyboardWillChangeFrameNotification)
    }

    func addKeyboardChangeFrameObserver(willShow willShowClosure: KeyboardHeightClosure?,
                                        willHide willHideClosure: KeyboardHeightClosure?) {
        NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillChangeFrameNotification,
                                               object: nil, queue: OperationQueue.main, using: { [weak self](notification) in
                                                if let userInfo = notification.userInfo,
                                                    let frame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue,
                                                    let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double,
                                                    let c = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt,
                                                    let kFrame = self?.view.convert(frame, from: nil),
                                                    let kBounds = self?.view.bounds {

                                                    let animationType = UIView.AnimationOptions(rawValue: c)
                                                    let kHeight = kFrame.size.height
                                                    UIView.animate(withDuration: duration, delay: 0, options: animationType, animations: {
                                                        if kBounds.intersects(kFrame) { // keyboard will be shown
                                                            willShowClosure?(kHeight)
                                                        } else { // keyboard will be hidden
                                                            willHideClosure?(kHeight)
                                                        }
                                                    }, completion: nil)
                                                } else {
                                                    print("Invalid conditions for UIKeyboardWillChangeFrameNotification")
                                                }
        })
    }
}

2
অন্যান্য সমাধানগুলির চেয়ে অনেক বেশি "সুইফ্ট" প্রতিটি কন্ট্রোলারে সবকিছু পুনর্লিখন না করে দুর্দান্ত / পুনঃব্যবহারযোগ্য কাজ করে -> অবশ্যই এখানে সেরা একটি :)
তিব

আমি চেষ্টা করেছি কিন্তু কোন সুযোগ নেই, ইউআইএসক্রোলভিউ দরকার কি বা কী?
এরডেমজিসি

@erdemgc আপনি ব্যবহারের উদাহরণ দেখেছেন? আপনার কেবলমাত্র ইউআইভিউকন্ট্রোলার + অ্যাডকি-বোর্ড-চেঞ্জফ্রেমঅবসভার প্রয়োজন এবং এটি সরাতে ভুলবেন না
ale_stro

এখানে removeKeyboardObserver()পদ্ধতিটি আসলে পর্যবেক্ষককে সরিয়ে দেয় না। আপনি যদি এটি কল না করেন তবে আপনি Invalid conditions for UIKeyboardWillChangeFrameNotificationঅ্যাড পদ্ধতি থেকে কনসোলে একটি দেখতে পাবেন । আপনি যদি এটি কল করেন তবে আপনি একই ত্রুটি দেখতে পাবেন, যার অর্থ পর্যবেক্ষক সরানো হয়নি। ডকুমেন্টেশনটিতে বলা হয়েছে "পর্যবেক্ষণগুলি নিবন্ধন করতে, আপনি এই পদ্ধতিতে ফিরে আসা বস্তুটি পাস করে removeObserver(_:)"। এর পরিবর্তে আপনি যা করেন তা হ'ল সেই পদ্ধতিটি দ্বারা ফিরে আসা অবজেক্টটি সংরক্ষণ করুন, তারপরে আপনি যখন পর্যবেক্ষককে সরাতে চান তখন এটি পাস করুন।
হুই-আনহ হোয়াং

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

5

আপনি অ্যাপ্লিকেশনটিতে এই লাইব্রেরি এবং কোডের একটি মাত্র লাইন ব্যবহার করতে পারেনডিডফিনিশড লঞ্চিং এবং আপনি হয়ে গেছেন ..

func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    IQKeyboardManager.sharedManager().enable = true
    return true
}

আইকিউ কীবোর্ড ম্যানেজার - যখনই কীবোর্ডের লিঙ্ক উপস্থিত হয় তখন ভিউ সামঞ্জস্য করুন - https://github.com/hackiftekhar/IQKeyboardManager


4
struct MoveKeyboard {
    static let KEYBOARD_ANIMATION_DURATION : CGFloat = 0.3
    static let MINIMUM_SCROLL_FRACTION : CGFloat = 0.2;
    static let MAXIMUM_SCROLL_FRACTION : CGFloat = 0.8;
    static let PORTRAIT_KEYBOARD_HEIGHT : CGFloat = 216;
    static let LANDSCAPE_KEYBOARD_HEIGHT : CGFloat = 162;
}


  func textFieldDidBeginEditing(textField: UITextField) {
    let textFieldRect : CGRect = self.view.window!.convertRect(textField.bounds, fromView: textField)
    let viewRect : CGRect = self.view.window!.convertRect(self.view.bounds, fromView: self.view)

    let midline : CGFloat = textFieldRect.origin.y + 0.5 * textFieldRect.size.height
    let numerator : CGFloat = midline - viewRect.origin.y - MoveKeyboard.MINIMUM_SCROLL_FRACTION * viewRect.size.height
    let denominator : CGFloat = (MoveKeyboard.MAXIMUM_SCROLL_FRACTION - MoveKeyboard.MINIMUM_SCROLL_FRACTION) * viewRect.size.height
    var heightFraction : CGFloat = numerator / denominator

    if heightFraction < 0.0 {
        heightFraction = 0.0
    } else if heightFraction > 1.0 {
        heightFraction = 1.0
    }

    let orientation : UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
    if (orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown) {
        animateDistance = floor(MoveKeyboard.PORTRAIT_KEYBOARD_HEIGHT * heightFraction)
    } else {
        animateDistance = floor(MoveKeyboard.LANDSCAPE_KEYBOARD_HEIGHT * heightFraction)
    }

    var viewFrame : CGRect = self.view.frame
    viewFrame.origin.y -= animateDistance

    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(NSTimeInterval(MoveKeyboard.KEYBOARD_ANIMATION_DURATION))

    self.view.frame = viewFrame

    UIView.commitAnimations()
}


func textFieldDidEndEditing(textField: UITextField) {
    var viewFrame : CGRect = self.view.frame
    viewFrame.origin.y += animateDistance

    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)

    UIView.setAnimationDuration(NSTimeInterval(MoveKeyboard.KEYBOARD_ANIMATION_DURATION))

    self.view.frame = viewFrame

    UIView.commitAnimations()

}

এবং শেষ পর্যন্ত যেহেতু আমরা প্রতিনিধি পদ্ধতি ব্যবহার করি

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

অবজেক্টিভ-সি ব্যবহার করে রিফেক্টরড http://www.cocoawithlove.com/2008/10/slider-uitextfields-around-to-avoid.html


এই সমাধানটি আমার পক্ষে কাজ করেছে, যদিও আমাকে কিছু অতিরিক্ত কাজ করতে হয়েছিল: একটি var animateDistance: CGFloat!প্লাস ঘোষণা করুন আমাকে যখন ইউজার কীবোর্ড বোতামটি টিপবে তখন আমাকে ইউআইকিবোর্ডওয়ালহাইডনোটিকেশন হ্যান্ডেল করতে হয়েছিল।
রুয়ান্টাভন

4

আর একটি সমাধান যা অটোলেআউট, সীমাবদ্ধতা বা কোনও আউটলেটগুলির উপর নির্ভর করে না। আপনার যা দরকার তা হ'ল একটি স্ক্রলভিউতে আপনার ক্ষেত্র (গুলি)।

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "makeSpaceForKeyboard:", name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "makeSpaceForKeyboard:", name: UIKeyboardWillHideNotification, object: nil)
}

func makeSpaceForKeyboard(notification: NSNotification) {
    let info = notification.userInfo!
    let keyboardHeight:CGFloat = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue().size.height
    let duration:Double = info[UIKeyboardAnimationDurationUserInfoKey] as! Double

    if notification.name == UIKeyboardWillShowNotification {
        UIView.animateWithDuration(duration, animations: { () -> Void in
            var frame = self.view.frame
            frame.size.height = frame.size.height - keyboardHeight
            self.view.frame = frame
        })
    } else {
        UIView.animateWithDuration(duration, animations: { () -> Void in
            var frame = self.view.frame
            frame.size.height = frame.size.height + keyboardHeight
            self.view.frame = frame
        })
    }

}

1
এটি UIKeyboardWillShowNotificationডেকে কালো পর্দা দেখাচ্ছে ।
শচীন কুমারাম

4

সুইফট ২.২ এর সমাধানের জন্য আমার সংস্করণটি এখানে রয়েছে:

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

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

তারপরে পদ্ধতিগুলিতে এই বিজ্ঞপ্তিগুলির জন্য কোরস্প্যান্ডিং মূল দর্শনটিকে উপরে বা নীচে নিয়ে যায়

func keyboardWillShow(sender: NSNotification) {
if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() {
  self.view.frame.origin.y = -keyboardSize.height
  }
}

func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y = 0
}

কৌতুকটি "কীবোর্ড উইলশো" অংশে রয়েছে যা প্রতিবার "কুইকটাইপ প্রস্তাব বার" সম্প্রসারিত বা সঙ্কুচিত হয়ে কল আসে। তারপরে আমরা সর্বদা মূল দৃশ্যের y স্থানাঙ্ক সেট করি যা মোট কীবোর্ড উচ্চতার নেতিবাচক মানের সমান ("কুইকটাইপ বার" অংশটি সহ বা তার বাইরে)।

শেষে পর্যবেক্ষকদের অপসারণ করতে ভুলবেন না

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

3

নিম্নলিখিতটি একটি সহজ সমাধান, যার সাহায্যে পাঠ্য ক্ষেত্রটির নীচে বিন্যাস গাইডটিতে এটি বেঁধে রাখা বাধা রয়েছে। এটি কেবল সীমাবদ্ধতার ধ্রুবকটিতে কীবোর্ডের উচ্চতা যুক্ত করে।

// This constraint ties the text field to the bottom layout guide
@IBOutlet var textFieldToBottomLayoutGuideConstraint: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()

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

func keyboardWillShow(sender: NSNotification) {
    if let keyboardSize = (sender.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        self.textFieldToBottomLayoutGuideConstraint?.constant += keyboardSize.height
    }
}

func keyboardWillHide(sender: NSNotification) {
    if let keyboardSize = (sender.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        self.textFieldToBottomLayoutGuideConstraint?.constant -= keyboardSize.height
    }
}

3

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

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

  func keyboardWillShow(sender: NSNotification) {
    self.centerYConstraint.constant += 30
  }

  func keyboardWillHide(sender: NSNotification) {
    self.centerYConstraint.constant = self.originalConstraint
  }

কীবোর্ডের ভিতরে উইলশো পদ্ধতিতে শর্তটি পরীক্ষা করুন যদি self.centerYConstraint.constant == self.originalCenterYConstraint এর পরে এই অবস্থার মধ্যে একটি লাইন কোড থাকে have অরিজিনাল সেন্টারওয়াই কনট্রেন্টটি ওয়াই কন্ট্রেন্টের মূল মান যা আমি ভিডিডলোডে সঞ্চয় করছি। এটি আমার পক্ষে কাজ করেছে।
সাশী

3

@ জোসেফ লর্ড এবং @ ইসুরুর কাছ থেকে উত্তর মার্জ করে 4.x উত্তর সুইফ্ট করুন। bottomConstraintআপনি স্থানান্তর করতে আগ্রহী এমন দৃশ্যের নীচের সীমাবদ্ধতা উপস্থাপন করে।

override func viewDidLoad() {
    // Call super
    super.viewDidLoad()

    // Subscribe to keyboard notifications
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(keyboardNotification(notification:)),
                                           name: UIResponder.keyboardWillChangeFrameNotification,
                                           object: nil)        
}


deinit {
    NotificationCenter.default.removeObserver(self)
}


@objc func keyboardNotification(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        // Get keyboard frame
        let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

        // Set new bottom constraint constant
        let bottomConstraintConstant = keyboardFrame.origin.y >= UIScreen.main.bounds.size.height ? 0.0 : keyboardFrame.size.height

        // Set animation properties
        let duration = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
        let animationCurve = UIView.AnimationOptions(rawValue: animationCurveRaw)

        // Animate the view you care about
        UIView.animate(withDuration: duration, delay: 0, options: animationCurve, animations: {
            self.bottomConstraint.constant = bottomConstraintConstant
            self.view.layoutIfNeeded()
        }, completion: nil)
    }
}

2

আমি নিম্নলিখিত পদ্ধতি দ্বারা সম্পন্ন করেছি:

পাঠ্যক্ষেত্রের তত্ত্বাবধানটি দেখার সময় এটি কার্যকর

class AdminLoginViewController: UIViewController,
UITextFieldDelegate{

    @IBOutlet weak var txtUserName: UITextField!
    @IBOutlet weak var txtUserPassword: UITextField!
    @IBOutlet weak var btnAdminLogin: UIButton!

    private var activeField : UIView?

    var param:String!
    var adminUser : Admin? = nil
    var kbHeight: CGFloat!

    override func viewDidLoad()
    {
        self.addKeyBoardObserver()
        self.addGestureForHideKeyBoard()
    }

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

    func addGestureForHideKeyBoard()
    {
        let tapGesture = UITapGestureRecognizer(target: self, action: Selector("hideKeyboard"))
        tapGesture.cancelsTouchesInView = false
        view.addGestureRecognizer(tapGesture)
    }

    func hideKeyboard() {
        self.view.endEditing(true)
    }

    func addKeyBoardObserver(){

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "willChangeKeyboardFrame:",
name:UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "willChangeKeyboardFrame:",
name:UIKeyboardWillHideNotification, object: nil)
    }

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

    //MARK:- textfiled Delegate

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool
    {
         activeField = textField

        return true
    }
    func textFieldShouldEndEditing(textField: UITextField) -> Bool
    {
        if activeField == textField
        {
            activeField = nil
        }

        return true
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {

        if txtUserName == textField
        {
            txtUserPassword.becomeFirstResponder()
        }
        else if (textField == txtUserPassword)
        {
            self.btnAdminLoginAction(nil)
        }
        return true;
    }

    func willChangeKeyboardFrame(aNotification : NSNotification)
    {
       if self.activeField != nil && self.activeField!.isFirstResponder()
    {
        if let keyboardSize =  (aNotification.userInfo![UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue()
        {
            let dy = (self.activeField?.superview?.convertRect((self.activeField?.frame)!, toView: view).origin.y)!

            let height = (self.view.frame.size.height - keyboardSize.size.height)

            if dy > height
            {
                var frame = self.view.frame

                frame.origin.y = -((dy - height) + (self.activeField?.frame.size.height)! + 20)

                self.view.frame = frame
            }
        }
    }
    else
    {
        var frame = self.view.frame
        frame.origin.y = 0
        self.view.frame = frame
    }
    } }

2
    func registerForKeyboardNotifications(){
        //Keyboard
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWasShown), name: UIKeyboardDidShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillBeHidden), name: UIKeyboardDidHideNotification, object: nil)


    }
    func deregisterFromKeyboardNotifications(){

        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)

    }
    func keyboardWasShown(notification: NSNotification){

        let userInfo: NSDictionary = notification.userInfo!
        let keyboardInfoFrame = userInfo.objectForKey(UIKeyboardFrameEndUserInfoKey)?.CGRectValue()

        let windowFrame:CGRect = (UIApplication.sharedApplication().keyWindow!.convertRect(self.view.frame, fromView:self.view))

        let keyboardFrame = CGRectIntersection(windowFrame, keyboardInfoFrame!)

        let coveredFrame = UIApplication.sharedApplication().keyWindow!.convertRect(keyboardFrame, toView:self.view)

        let contentInsets = UIEdgeInsetsMake(0, 0, (coveredFrame.size.height), 0.0)
        self.scrollViewInAddCase .contentInset = contentInsets;
        self.scrollViewInAddCase.scrollIndicatorInsets = contentInsets;
        self.scrollViewInAddCase.contentSize = CGSizeMake((self.scrollViewInAddCase.contentSize.width), (self.scrollViewInAddCase.contentSize.height))

    }
    /**
     this method will fire when keyboard was hidden

     - parameter notification: contains keyboard details
     */
    func keyboardWillBeHidden (notification: NSNotification) {

        self.scrollViewInAddCase.contentInset = UIEdgeInsetsZero
        self.scrollViewInAddCase.scrollIndicatorInsets = UIEdgeInsetsZero

    }

1
উপরের কোডটি ব্যবহার করে কিবোর্ডের উপরে টেক্সটফিল্ডটি স্যুইপট ২.২ এ সরিয়ে ফেলুন এটি কার্যকর হবে। আমি আশা করি এটি কিছু সাহায্য করবে।
কমলকুমার.ই.আগস্ট

1

আমি নিম্নলিখিত পদ্ধতিতে সম্পন্ন করেছি:

class SignInController: UIViewController , UITextFieldDelegate {

@IBOutlet weak var scrollView: UIScrollView!

// outlet declartion
@IBOutlet weak var signInTextView: UITextField!

var kbHeight: CGFloat!

/**
*
* @method viewDidLoad
*
*/

override func viewDidLoad() {
    super.viewDidLoad()

    self.signInTextView.delegate = self

}// end viewDidLoad

/**
*
* @method viewWillAppear
*
*/

override func viewWillAppear(animated: Bool) {
    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)

}// end viewWillAppear

/**
*
* @method viewDidAppear
*
*/

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)


}// end viewDidAppear

/**
*
* @method viewWillDisappear
*
*/
override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

/**
*
* @method textFieldShouldReturn
* retun the keyboard value
*
*/

// MARK -
func textFieldShouldReturn(textField: UITextField) -> Bool {
    signInTextView.resignFirstResponder()
    return true;

}// end textFieldShouldReturn

// MARK - keyboardWillShow
func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        if let keyboardSize =  (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            kbHeight = keyboardSize.height
            self.animateTextField(true)
        }
    }
}// end keyboardWillShow

// MARK - keyboardWillHide
func keyboardWillHide(notification: NSNotification) {
    self.animateTextField(false)
}// end keyboardWillHide

// MARK - animateTextField
func animateTextField(up: Bool) {
    var movement = (up ? -kbHeight : kbHeight)

    UIView.animateWithDuration(0.3, animations: {
        self.view.frame = CGRectOffset(self.view.frame, 0, movement)
    })
}// end animateTextField

/**
*
* @method didReceiveMemoryWarning
*
*/

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

}// end didReceiveMemoryWarning


}// end SignInController

1

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

  1. আমার ক্ষেত্রে আইকিউইবোর্ডেঞ্জার কেবল তখনই কাজ করছিল যখন উপাদানগুলিতে কোনও অটো লেআউট প্রয়োগ করা হয় না, যদি এটি প্রয়োগ করা হয় তবে আইকিউবোর্ড ম্যানেজার আমাদের ধারণা মতো কাজ করবে না।
  2. সেলফ.ভিউয়ের upর্ধ্বমুখী আন্দোলনের সাথে একই জিনিস
  3. আমি ইউআইটিএক্সফিল্ডকে উপরের দিকে এগিয়ে দেওয়ার জন্য সুইফট সাপোর্টের সাথে একটি অবজেক্টিভ সি শিরোলেখকে বেঁধে ফেলেছি যখন ব্যবহারকারী এটিতে ক্লিক করে, ইউআইটিেক্সটফিল্ডকে coveringেকে রাখার কীবোর্ডের সমস্যাটি সমাধান করে: https://github.com/coolvasanth/smart_keyboard
  4. আইওএস অ্যাপ্লিকেশন বিকাশে যার মধ্যবর্তী বা উচ্চতর স্তর রয়েছে সে সহজেই সংগ্রহস্থলটি বুঝতে পারে এবং এটি প্রয়োগ করতে পারে। শুভকামনা

1

সমস্ত পাঠ্যফিল্ড পদক্ষেপের জন্য এখানে জেনেরিক সমাধান রয়েছে -

1) একটি সাধারণ ভিউ কন্ট্রোলার তৈরি করুন যা অন্যান্য ভিউকন্ট্রোলারদের দ্বারা প্রসারিত

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)

}
 @objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y == 0 {
            self.view.frame.origin.y -= getMoveableDistance(keyboarHeight: keyboardSize.height)
        }
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if self.view.frame.origin.y != 0 {
        self.view.frame.origin.y = 0
    }
}
deinit {
    NotificationCenter.default.removeObserver(self)
}

//get the distance to move up the main view for the focus textfiled
func getMoveableDistance(keyboarHeight : CGFloat) ->  CGFloat{
    var y:CGFloat = 0.0
    if let activeTF = getSelectedTextField(){
        var tfMaxY = activeTF.frame.maxY
        var containerView = activeTF.superview!
        while containerView.frame.maxY != self.view.frame.maxY{
            let contViewFrm = containerView.convert(activeTF.frame, to: containerView.superview)
            tfMaxY = tfMaxY + contViewFrm.minY
            containerView = containerView.superview!
        }
        let keyboardMinY = self.view.frame.height - keyboarHeight
        if tfMaxY > keyboardMinY{
            y = (tfMaxY - keyboardMinY) + 10.0
        }
    }

    return y
}

2) ইউআইভিউউকন্ট্রোলারের একটি এক্সটেনশন এবং বর্তমানে সক্রিয় টেক্সটফিল্ড তৈরি করুন

//get active text field

এক্সটেনশান ইউআইভিউকন্ট্রোলার {ফান সিলেক্টডেক্সটফিল্ড () -> ইউআইটিেক্সটফিল্ড? {

    let totalTextFields = getTextFieldsInView(view: self.view)

    for textField in totalTextFields{
        if textField.isFirstResponder{
            return textField
        }
    }

    return nil

}

func getTextFieldsInView(view: UIView) -> [UITextField] {

    var totalTextFields = [UITextField]()

    for subview in view.subviews as [UIView] {
        if let textField = subview as? UITextField {
            totalTextFields += [textField]
        } else {
            totalTextFields += getTextFieldsInView(view: subview)
        }
    }

    return totalTextFields
}

}


কোনও কারণে, কীবোর্ড উইলশো ফাংশনে আমার একটি সমস্যা ছিল, কীবোর্ডসাইজটি প্রথম কীবোর্ড টগল করার পরে ভুল আকার পাচ্ছিল (প্রথম টোগলটিতে সঠিক ফ্রেম রয়েছে)। আমি এটির রক্ষণে এটি পরিবর্তন করে এটি স্থির করে দিয়েছি ইউজারআইএনফো = বিজ্ঞপ্তি। ব্যবহারকারীর তথ্য n ফেরত দিন else প্রহরীকে কীবোর্ডসাইজ = ইউজারআইএনফো [ইউআইআরএসপন্ডার.কিবোর্ডফ্রেমইন্ড ইউজারআইফোনকি] হিসাবে রাখি? এনএসভ্যালু অন্যটি {ফেরত দিন keyboard আসুন কীবোর্ডফ্রেম = কীবোর্ডসাইজ.সি.জি.রেটভ্যালু যদি self.view.frame.origin.y == 0 {self.view.frame.origin.y - = getMoveableDistance (কীবোয়ারহাইট: কীবোর্ডফ্রেম.হাইট)} .এই সাহায্য করবে যদি কেউ একই সমস্যা পেয়ে থাকে :)
ইস্তানজর

1

খুব সাধারণ এবং আরও কোড করার দরকার নেই। কেবল pod 'IQKeyboardManagerSwift'আপনার পডফাইলে এবং আপনার AppDelegateপৃষ্ঠায় নীচের কোড যুক্ত করুন।

import IQKeyboardManagerSwift

এবং পদ্ধতি didFinishLaunchingWithOptions()টাইপ

IQKeyboardManager.shared.enable = true

হ্যাঁ, ওটাই. https://youtu.be/eOM94K1ZWN8 আরও ভাল বোঝার জন্য এই ভিডিও লিঙ্কটি দেখুন Hope আশা করি এটি আপনাকে সহায়তা করবে।


এটি কী টেক্সটভিউয়ের জন্য কাজ করে এবং কীভাবে আমি কীভাবে "সম্পন্ন" কী কী তার শিরোনাম পরিবর্তন করতে পারি?
টিডিটি কিয়েন

গোটো: - "আইকিউকিবোর্ডম্যানেজ.আর।" এই লাইনটি প্রতিস্থাপন করুন (লাইন নং 968): - [পাঠ্যফিল্ড অ্যাডডোনঅনকি-বোর্ডবোর্ড উইথটারাগেট: স্ব-ক্রিয়া: @ নির্বাচক (সম্পন্ন :) হওয়া উচিত শোধপ্লেসোল্ডার: _শোল্ডশটওফ্যাক্টফিল্ডপ্লেসোল্ডার] এর সাথে: - "পাঠ্যফিল্ডঅর্টব্যাটবোর্ডটন স্ব-ক্রিয়া: @ নির্বাচক (সম্পন্ন করণ :) উচিত শপপ্লেসোল্ডার: _শোল্ডশটেক্সটফিল্ডপ্লেসোল্ডার]; এবং পাঠ্যদর্শনটির জন্য এখনও চেষ্টা করেননি, আশা করি এটি আপনাকে সহায়তা করবে।
রঘিব আরশি

1

কীবোর্ড পরিচালনার জন্য সম্পূর্ণ কোড।

        override func viewWillAppear(_ animated: Bool) {
            NotificationCenter.default.addObserver(self, selector: #selector(StoryMediaVC.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(StoryMediaVC.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
        }
        override func viewWillDisappear(_ animated: Bool) {
            NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
            NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
        }
        @objc func keyboardWillShow(notification: NSNotification) {
            guard let userInfo = notification.userInfo else {return}
            guard let keyboardSize = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {return}
            let keyboardFrame = keyboardSize.cgRectValue

            if self.view.bounds.origin.y == 0{
                self.view.bounds.origin.y += keyboardFrame.height
            }
        }


        @objc func keyboardWillHide(notification: NSNotification) {
            if self.view.bounds.origin.y != 0 {
                self.view.bounds.origin.y = 0
            }
        }

0

আমি @ সিম্পা সলিউশনটি কিছুটা পরিবর্তন করেছি .........

override func viewDidLoad() 
{

    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("makeSpaceForKeyboard:"), name:UIKeyboardWillShowNotification, object: nil);
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("makeSpaceForKeyboard:"), name:UIKeyboardWillHideNotification, object: nil);
}

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

var keyboardIsVisible = false
override func makeSpaceForKeyboard(notification: NSNotification) {

    let info = notification.userInfo!
    let keyboardHeight:CGFloat = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue().size.height
    let duration:Double = info[UIKeyboardAnimationDurationUserInfoKey] as! Double

    if notification.name == UIKeyboardWillShowNotification && keyboardIsVisible == false{

        keyboardIsVisible = true

        UIView.animateWithDuration(duration, animations: { () -> Void in
            var frame = self.view.frame
            frame.size.height = frame.size.height - keyboardHeight
            self.view.frame = frame
        })

    } else if keyboardIsVisible == true && notification.name == UIKeyboardWillShowNotification{

    }else {
        keyboardIsVisible = false

        UIView.animateWithDuration(duration, animations: { () -> Void in
            var frame = self.view.frame
            frame.size.height = frame.size.height + keyboardHeight
            self.view.frame = frame
        })
    }
}

0

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

দ্রষ্টব্য: আমি একটি ইউআইটিএবলভিউ ব্যবহার করছিলাম

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

বিজ্ঞপ্তি পর্যবেক্ষক যোগ করুন @ দেখুনডিডলড ()

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(yourClass.keyboardWillBeShown), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(yourClass.keyboardWillBeHidden), name:UIKeyboardWillHideNotification, object: nil);

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

সেই অভিধান থেকে আমরা সিআইআরেক্ট আইটেমটি কী UIKeyboardFrameBeginUserInfoKey কী ব্যবহার করে কীবোর্ডের ফ্রেম বর্ণনা করে পেতে পারি।

টেবিল দেখুন @ কীবোর্ডবিলবিউন পদ্ধতিতে সামগ্রীর ইনসেট প্রয়োগ করুন,

func keyboardWillBeShown(sender: NSNotification)
{        
    // Move the table view

    if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
    {
        let contentInsets = UIEdgeInsetsMake(0.0, 0.0, (keyboardSize.height), 0.0);

        yourTableView.contentInset = contentInsets;

        yourTableView.scrollIndicatorInsets = contentInsets;
    }
}

ভিউ @ কীবোর্ডবিলবিহিন পদ্ধতি পুনরুদ্ধার করুন

func keyboardWillBeHidden(sender: NSNotification)
{
    // Moving back the table view back to the default position

    yourTableView.contentInset = UIEdgeInsetsZero;

    yourTableView.scrollIndicatorInsets = UIEdgeInsetsZero;
}

আপনি যদি ডিভাইস ওরিয়েন্টেশনটিকেও বিবেচনায় রাখতে চান তবে কোডটি আপনার প্রয়োজন অনুসারে শর্তাধীন বিবৃতি ব্যবহার করুন।

// Portrait
UIEdgeInsetsMake(0.0, 0.0, (keyboardSize.height), 0.0);

// Landscape
UIEdgeInsetsMake(0.0, 0.0, (keyboardSize.width), 0.0);

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

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

func keyboardWillShow(_ notification:Notification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
    }
}

func keyboardWillHide(_ notification:Notification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
    }
}

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


0

আমি যে সুইফট 4 দ্রবণটি ব্যবহার করি তা কীবোর্ড আকারে নেয়। প্রতিস্থাপন করাserverStatusStackViewআপনি যা দেখেন তার সাথে , যেমন self.view:

deinit {
    NotificationCenter.default.removeObserver(self)
}

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        serverStatusStackView.frame.origin.y = keyboardSize.height * 2 - serverStatusStackView.frame.height
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        serverStatusStackView.frame.origin.y += keyboardSize.height
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    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)
}

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