কীবোর্ডটি যখন কোনও ইনপুট ক্ষেত্রটি কভার করে তখনই একটি দৃশ্য আপ করুন


148

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

নীচের ক্ষেত্রগুলি সম্পাদনা করা মাত্র পর্দাটি সরানোর কোনও উপায় আছে ?

আমি এখানে পাওয়া এই কোডটি ব্যবহার করেছি :

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

func keyboardWillShow(sender: NSNotification) {
    self.view.frame.origin.y -= 150
}

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

(! পাঠ্যক্ষেত্র: UITextField) আপনি textFieldDidBeginEditing func ব্যবহার করতে পারে হতে পারে {} সনাক্ত যা পাঠ্যক্ষেত্র সম্পাদনা শুরু করেছে এবং কীবোর্ড আড়াল / করতে
humblePilgrim

আমি উল্লেখ করতে ভুলে গেছি যে আমি সুইফটে নতুন :( এটি পরীক্ষা করার জন্য সঠিক বাক্য গঠন কী হবে? (এই
ফাংশনটিতে

উত্তর:


211

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

একটি ভেরিয়েবল ঘোষণা করুন

var activeField: UITextField?

তারপরে এই পদ্ধতিগুলি যুক্ত করুন

 func registerForKeyboardNotifications()
{
    //Adding notifies on keyboard appearing
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
}


func deregisterFromKeyboardNotifications()
{
    //Removing notifies on keyboard appearing
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
}

func keyboardWasShown(notification: NSNotification)
{
    //Need to calculate keyboard exact size due to Apple suggestions
    self.scrollView.scrollEnabled = true
    var info : NSDictionary = notification.userInfo!
    var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size
    var contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)

    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardSize!.height
    if let activeFieldPresent = activeField
    {
        if (!CGRectContainsPoint(aRect, activeField!.frame.origin))
        {
            self.scrollView.scrollRectToVisible(activeField!.frame, animated: true)
        }
    }


}


func keyboardWillBeHidden(notification: NSNotification)
{
    //Once keyboard disappears, restore original positions
    var info : NSDictionary = notification.userInfo!
    var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size
    var contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0)
    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets
    self.view.endEditing(true)
    self.scrollView.scrollEnabled = false

}

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

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

আপনার ভিউকন্ট্রোলার হিসাবে ঘোষণা UITextFieldDelegateএবং আপনার প্রারম্ভিককরণের পদ্ধতিতে সঠিক প্রতিনিধিদের সেট করতে ভুলবেন না : প্রাক্তন:

self.you_text_field.delegate = self

এবং registerForKeyboardNotificationsভিউইনাইট এবং deregisterFromKeyboardNotificationsপ্রস্থান করতে কল করতে মনে রাখবেন ।

সম্পাদনা / আপডেট: সুইফট 4.2 সিনট্যাক্স

func registerForKeyboardNotifications(){
    //Adding notifies on keyboard appearing
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: NSNotification.Name.UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIResponder.keyboardWillHideNotification, object: nil)
}

func deregisterFromKeyboardNotifications(){
    //Removing notifies on keyboard appearing
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIResponder.keyboardWillHideNotification, object: nil)
}

@objc func keyboardWasShown(notification: NSNotification){
    //Need to calculate keyboard exact size due to Apple suggestions
    self.scrollView.isScrollEnabled = true
    var info = notification.userInfo!
    let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize!.height, right: 0.0)

    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardSize!.height
    if let activeField = self.activeField {
        if (!aRect.contains(activeField.frame.origin)){
            self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
        }
    }
}

@objc func keyboardWillBeHidden(notification: NSNotification){
    //Once keyboard disappears, restore original positions
    var info = notification.userInfo!
    let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: -keyboardSize!.height, right: 0.0)
    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets
    self.view.endEditing(true)
    self.scrollView.isScrollEnabled = false
}

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

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

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

12
ধন্যবাদ, আমি ঠিক তাই খুঁজছিলাম - একটি আপেলের প্রস্তাবিত সমাধান। যাইহোক, আমার ক্ষেত্রে আমার ইতিমধ্যে দৃশ্যমান ক্ষেত্রের বাইরে ছড়িয়ে থাকা একটি স্ক্রোল ভিউ ছিল। এই কোডটি কীবোর্ডটি লুকানোর পরে স্ক্রোলিং অক্ষম করবে। আমি "স্ব.স্ক্রোলভিউ.স্রোকএনবলড = মিথ্যা" সরিয়েছি এবং এটি এখনও স্ক্রোল করবে না। আমার জন্য যা কাজ করেছে তা হ'ল "সেল্ফ.স্ক্রোলভিউ.কন্টেন্টআইনেসট = ইউআইইডিজইনসেটস জিরো;" কীবোর্ড
উইলহাইড

5
পারফেক্ট কোড তবে এর UIKeyboardFrameEndUserInfoKeyপরিবর্তে আমাকে ব্যবহার করতে হবে UIKeyboardFrameBeginUserInfoKey, কারণ উত্তরোত্তর উচ্চতা ০. এবং হিটতম পয়েন্টটি নীচের দিকে পরিবর্তন করুন not if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
ভিক্টর চয়ে

3
@ ম্যাক্স: এটি কাজ করা উচিত, তবে আপনি যদি সুইফট 4 সমাধান চান তবে আপনি এই আইওএস উদাহরণটি ম্যাট নেউবার্গের বই থেকে যাচাই করতে পারেন যা আমি সমস্ত আইওএস বিকাশকারীকে পরামর্শ দিই :)
নেર્কিয়েটর

1
@ ম্যাক্স আমি নিশ্চিত নই যে এটি একচেটিয়াভাবে দ্রুতগতির 4 জিনিস কিনা, তবে যা ঘটছে বলে মনে হচ্ছে তা হল textField's didBeginEditingপদ্ধতিটি বলা হওয়ার পরে keyboardWillShowপদ্ধতিটি বলা হয়। ফলস্বরূপ, activeFieldচলকটি এখনও শূন্য, যার অর্থ কোনও স্বয়ংক্রিয় স্ক্রোলিং ঘটে না। আমার সমাধানটি ছিল activeField = textFieldপাঠ্য ফিল্ডের shouldBeginEditingপদ্ধতিতে কলটি রাখা । এটি কল ইস্যুর ক্রম সমাধান করে।
হিরদয়গুপ্ত

150

এখানে আমার 2 সেন্ট:

আপনি চেষ্টা করেছেন: https://github.com/hackiftekhar/IQKeyboardManager

সুইফট বা উদ্দেশ্য-সি ইনস্টল করা চূড়ান্ত সহজ।

এখানে এটি কীভাবে কাজ করে:

আইকিউ কীবোর্ডম্যানেজার (সুইফ্ট): - আইকিউকিবোর্ডম্যানেজারসুইফ্টটি কোকোপডগুলির মাধ্যমে পাওয়া যায়, এটি ইনস্টল করতে কেবল আপনার পোডফাইলে নিম্নলিখিত লাইনটি যুক্ত করুন: (# 236)

pod 'IQKeyboardManagerSwift'

AppDelegate.swift এ, কেবলমাত্র IQKeyboardManagerSwift ফ্রেমওয়ার্কটি আমদানি করুন এবং IQKeyboardManager সক্ষম করুন।

import IQKeyboardManagerSwift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

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

    IQKeyboardManager.sharedManager().enable = true
    // For Swift 4, use this instead
    // IQKeyboardManager.shared.enable = true


    return true
    }
}

এবং এটি সব। সহজ!


17
পারফেক্ট। এটি ডিফল্টরূপে বিল্ট করা উচিত। হাস্যকর মনে হচ্ছে এটি তা নয়।
নাথফগড

1
এটি আসলে হাস্যকর, এটি প্রয়োগ করা এত সহজ এবং ঠিক কাজ করে, এছাড়াও আপনি একাধিক পাঠ্য ক্ষেত্রের মাধ্যমে টগল করার একটি সহজ উপায় পান
খুরি

একাধিক পাঠ্য ক্ষেত্রে টগল করা কাজ করবে না? পাঠ্যক্ষেত্রের মধ্যে যাওয়ার জন্য কীপ্যাডে কোনও তীর প্রদর্শন নেই।
আরসাল

1
এটি একটি আশ্চর্যজনক সমাধান ছিল, আপনাকে ধন্যবাদ! কোকোপডগুলি সঠিকভাবে সেট আপ করতে আমার সামান্য কাজ লাগল, কারণ সেগুলি আমার কাছে সম্পূর্ণ নতুন ছিল। আমি এটি সেট আপ করার পরে, এটি বাস্তবায়নের জন্য আক্ষরিক 2 কোডের কোড ছিল এবং এটি ব্যাটের ডানদিকে পুরোপুরি কাজ করেছিল। অনেক ধন্যবাদ!
আইসি ব্লুরোজ

5
এটি আমার পক্ষে সুইফট ৪.১ আইকিকিবোর্ডম্যানেজ.আরএসএসড ম্যানেজার () এ কাজ করে নি enable সক্ষম = IQKeyboardManager.shared.enable = true
সত্যটিতে

20

আমার জন্য যে পুরোপুরি কাজ করতে পেরেছি সে হ'ল:

func textFieldDidBeginEditing(textField: UITextField) {
    if textField == email || textField == password {
        animateViewMoving(true, moveValue: 100)
    }
}

func textFieldDidEndEditing(textField: UITextField) {
    if textField == email || textField == password {
        animateViewMoving(false, moveValue: 100)
    }
}

func animateViewMoving (up:Bool, moveValue :CGFloat){
    let movementDuration:NSTimeInterval = 0.3
    let movement:CGFloat = ( up ? -moveValue : moveValue)

    UIView.beginAnimations("animateView", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration)

    self.view.frame = CGRectOffset(self.view.frame, 0, movement)
    UIView.commitAnimations()
}

আপনি উচ্চতার মানগুলিও পরিবর্তন করতে পারেন। আপনি যদি সমস্ত পাঠ্য ক্ষেত্রে ব্যবহার করতে চান তবে "যদি বিবৃতি" সরিয়ে ফেলুন।

আপনি এটি এমন সমস্ত নিয়ন্ত্রণের জন্যও ব্যবহার করতে পারেন যা টেক্সটভিউয়ের মতো ব্যবহারকারীর ইনপুট দরকার।


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

@ মোবাইলব্যাট বোঝে, তবে এটিই কাজ করে।
তারভো ম্যাসেপ্প

আমাদের কোডে পরিবর্তন না করেই আশ্চর্যজনক পৃথক যুক্তি
দিলিপ জাঙ্গিদ

6

নীচের ক্ষেত্রগুলি সম্পাদনা করা মাত্র পর্দাটি সরানোর কোনও উপায় আছে ?

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

func keyboardWillShow(notification: NSNotification) {
    if bottomText.editing{
        self.view.window?.frame.origin.y = -1 * getKeyboardHeight(notification)
    }
}

func keyboardWillHide(notification: NSNotification) {
    if self.view.window?.frame.origin.y != 0 {
        self.view.window?.frame.origin.y += getKeyboardHeight(notification)
    }
}

এটি আমার পক্ষে একটি ভাল সমাধান ছিল কারণ আমার কেবল দুটি পাঠ্য ক্ষেত্র ছিল।

পুরো দর্শনটি স্থানান্তরিত করুন : কেবলমাত্র যখন নির্দিষ্ট পাঠ্য ক্ষেত্রগুলি (ডাউনটেক্সট) সম্পাদনা করা হয়

পুরো দর্শনটি নীচে স্থানান্তরিত করুন: কেবলমাত্র দৃশ্যটি আসল অবস্থানে না থাকলে


5

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

extension UIView {
    func bindToKeyboard(){
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillChange(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
    }

    @objc func keyboardWillChange(_ notification: NSNotification){
        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
        let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
        let beginningFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
        let endFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

        let deltaY = endFrame.origin.y - beginningFrame.origin.y

        UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
            self.frame.origin.y += deltaY
        }, completion: nil)
    }
}

তারপরে আপনার ভিডিডলোডে আপনার ভিউটি কীবোর্ডে আবদ্ধ করুন

UiView.bindToKeyboard()

এটি প্রয়োজন না হলেও ভিউটিকে উপরে সরিয়ে দেয় এবং পাঠ্যক্ষেত্রটি যদি দেখার শীর্ষে থাকে তবে এটি উপরে যাবে এবং দৃশ্যমান হবে না। এটি একটি ভাল সমাধান নয়।
শিবাম পোখরিয়াল

4

পরিবর্তে কোনও ইউআইটিএবলভিউ কনট্রোলার এ কেন প্রয়োগ করবেন না? কীবোর্ডটি কোনও পাঠ্য ক্ষেত্র দেখানো হবে না যখন এটি প্রদর্শিত হবে।


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

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

3

এক্সটেনশন সহ সুইফট 4 (** আপডেট করা ) **

  1. একটি পাত্রে বোতাম যুক্ত করুন
  2. IBOutlet ধারকবিটিএম কনস্ট্রেনের সাথে ধারকটির নীচের সীমাবদ্ধতাটি সংযুক্ত করুন
  3. inViewDidLoad

    self.containerDependOnKeyboardBottomConstrain = containerBtmConstrain
    self.watchForKeyboard() 
  4. নিম্নলিখিত এক্সটেনশন যুক্ত করুন

    import UIKit
    
    private var xoAssociationKeyForBottomConstrainInVC: UInt8 = 0
    
    extension UIViewController {
    
        var containerDependOnKeyboardBottomConstrain :NSLayoutConstraint! {
            get {
                return objc_getAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC) as? NSLayoutConstraint
            }
            set(newValue) {
                objc_setAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
            }
        }
    
        func watchForKeyboard() {
            NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasShown(notification:)), name:UIResponder.keyboardWillShowNotification, object: nil);
            NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(notification:)), name:UIResponder.keyboardWillHideNotification, object: nil);
        }
    
        @objc func keyboardWasShown(notification: NSNotification) {
            let info = notification.userInfo!
            guard let keyboardFrame: CGRect = (info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
              return
            }
    
            UIView.animate(withDuration: 0.3, animations: { () -> Void in
                self.containerDependOnKeyboardBottomConstrain.constant = -keyboardFrame.height
                self.view.layoutIfNeeded()
            })
        }
    
        @objc func keyboardWillHide(notification: NSNotification) {
            UIView.animate(withDuration: 0.3, animations: { () -> Void in
                self.containerDependOnKeyboardBottomConstrain.constant = 0
                self.view.layoutIfNeeded()
            })
        }
    }

1
ধন্যবাদ বন্ধু. সব কিছুই সঠিক কী সম্পর্কে about আমি UIKeyboardFrameBeginUserInfoKey ব্যবহার করছিলাম এবং এখন UIKeyboardFrameEndUserInfoKey ব্যবহার করছিলাম নিখরচায়।
ফিলিপ

2

আমি সুইফটলিন্টটি ব্যবহার করি, এতে স্বীকৃত উত্তরের ফর্ম্যাটটি নিয়ে কয়েকটি সমস্যা ছিল। বিশেষ করে:

কোলনের আগে কোনও স্থান নেই, বল প্রয়োগের জন্য ingালাই নেই, UIEgegennset পছন্দ করুন (শীর্ষ: ইত্যাদি ... UIEdgeInsetMake এর পরিবর্তে।

তাই এখানে সুইফট 3-র জন্য আপডেটগুলি রয়েছে

func registerForKeyboardNotifications() {
    //Adding notifies on keyboard appearing
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func deregisterFromKeyboardNotifications() {
    //Removing notifies on keyboard appearing
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func keyboardWasShown(notification: NSNotification) {
    //Need to calculate keyboard exact size due to Apple suggestions
    scrollView?.isScrollEnabled = true
    var info = notification.userInfo!
    if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
        let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)

        scrollView?.contentInset = contentInsets
        scrollView?.scrollIndicatorInsets = contentInsets

        var aRect: CGRect = self.view.frame
        aRect.size.height -= keyboardSize.height
        if let activeField = self.activeField {
            if !aRect.contains(activeField.frame.origin) {
                self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
            }
        }
    }
}

func keyboardWillBeHidden(notification: NSNotification) {
    //Once keyboard disappears, restore original positions
    var info = notification.userInfo!
    if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
        let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: -keyboardSize.height, right: 0.0)
        scrollView?.contentInset = contentInsets
        scrollView?.scrollIndicatorInsets = contentInsets
    }

    view.endEditing(true)
    scrollView?.isScrollEnabled = false
}

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

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

1

আমি মনে করি এই ধারাটি ভুল:

if (!CGRectContainsPoint(aRect, activeField!.frame.origin))

সক্রিয়ফিল্ডের উত্সটি কীবোর্ডের ওপরে থাকতে পারে তবে সর্বাধিক সংস্থানটি হতে পারে না ...

অ্যাক্টিভফিল্ডের জন্য আমি একটি 'সর্বোচ্চ' পয়েন্ট তৈরি করব এবং এটি কীবোর্ড রেক্টে আছে কিনা তা পরীক্ষা করব।


0

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

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

let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
    if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY))) {
        // scroll textView/textField into view
    }

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

self.automaticallyAdjustsScrollViewInsets = false

হ্যান্ডলিংয়ের জন্য প্রতিনিধিদের সেট করতে এটি প্রতিটি পাঠ্যদর্শন এবং টেক্সটফিল্ডের মধ্য দিয়ে যায়

    for view in self.view.subviews {
        if view is UITextView {
            let tv = view as! UITextView
            tv.delegate = self
        } else if view is UITextField {
            let tf = view as! UITextField
            tf.delegate = self
        }
    }

কেবলমাত্র ফলাফলের জন্য এখানে তৈরি সাবক্লাসে আপনার বেস ক্লাসটি সেট করুন।

import UIKit

class ScrollingFormViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {

var activeFieldRect: CGRect?
var keyboardRect: CGRect?
var scrollView: UIScrollView!

override func viewDidLoad() {

    self.automaticallyAdjustsScrollViewInsets = false

    super.viewDidLoad()

    // Do any additional setup after loading the view.
    self.registerForKeyboardNotifications()
    for view in self.view.subviews {
        if view is UITextView {
            let tv = view as! UITextView
            tv.delegate = self
        } else if view is UITextField {
            let tf = view as! UITextField
            tf.delegate = self
        }
    }
    scrollView = UIScrollView(frame: self.view.frame)
    scrollView.scrollEnabled = false
    scrollView.showsVerticalScrollIndicator = false
    scrollView.showsHorizontalScrollIndicator = false
    scrollView.addSubview(self.view)
    self.view = scrollView
}

override func viewDidLayoutSubviews() {
    scrollView.sizeToFit()
    scrollView.contentSize = scrollView.frame.size
    super.viewDidLayoutSubviews()
}

deinit {
    self.deregisterFromKeyboardNotifications()
}

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


func registerForKeyboardNotifications()
{
    //Adding notifies on keyboard appearing
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.keyboardWasShown), name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.keyboardWillBeHidden), name: UIKeyboardWillHideNotification, object: nil)
}


func deregisterFromKeyboardNotifications()
{
    //Removing notifies on keyboard appearing
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
}

func keyboardWasShown(notification: NSNotification)
{
    let info : NSDictionary = notification.userInfo!
    keyboardRect = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
    adjustForKeyboard()
}


func keyboardWillBeHidden(notification: NSNotification)
{
    keyboardRect = nil
    adjustForKeyboard()
}

func adjustForKeyboard() {
    if keyboardRect != nil && activeFieldRect != nil {
        let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
        if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY)))
        {
            scrollView.scrollEnabled = true
            let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardRect!.size.height, 0.0)
            scrollView.contentInset = contentInsets
            scrollView.scrollIndicatorInsets = contentInsets
            scrollView.scrollRectToVisible(activeFieldRect!, animated: true)
        }
    } else {
        let contentInsets : UIEdgeInsets = UIEdgeInsetsZero
        scrollView.contentInset = contentInsets
        scrollView.scrollIndicatorInsets = contentInsets
        scrollView.scrollEnabled = false
    }
}

func textViewDidBeginEditing(textView: UITextView) {
    activeFieldRect = textView.frame
    adjustForKeyboard()
}

func textViewDidEndEditing(textView: UITextView) {
    activeFieldRect = nil
    adjustForKeyboard()
}

func textFieldDidBeginEditing(textField: UITextField)
{
    activeFieldRect = textField.frame
    adjustForKeyboard()
}

func textFieldDidEndEditing(textField: UITextField)
{
    activeFieldRect = nil
    adjustForKeyboard()
}

}

0

দুর্দান্ত উত্তর ইতিমধ্যে দেওয়া হয়েছে তবে এই পরিস্থিতিটি মোকাবেলার জন্য এটি একটি আলাদা উপায় ( সুইফট 3x ব্যবহার করে ):

প্রথমে নীচের পদ্ধতিটি কল করুন viewWillAppear()

func registerForKeyboardNotifications() {

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasShown), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillBeHidden), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

}

এখন একটি গ্রহন IBOutletএর UIViewআপনার এর 'র শীর্ষ সীমাবদ্ধতার UIViewcontrollerভালো: (এখানে UIViewএর subview হয় UIScrollViewতার মানে তোমার উচিত ছিল একটি UIScrollViewসব জন্য আপনার subViews)

@IBOutlet weak var loginViewTopConstraint: NSLayoutConstraint!

এবং অন্য একটি পরিবর্তনশীল যেমন অনুসরণ এবং একটি প্রতিনিধি যুক্ত করুন UITextFieldDelegate:

var activeTextField = UITextField() //This is to keep the reference of UITextField currently active

এর পরে এখানে মায়াবী অংশটি কেবল এটি নীচে স্নিপেটে পেস্ট করুন :

func keyboardWasShown(_ notification: Notification) {

let keyboardInfo  = notification.userInfo as NSDictionary?

//print(keyboardInfo!)

let keyboardFrameEnd: NSValue? = (keyboardInfo?.value(forKey: UIKeyboardFrameEndUserInfoKey) as? NSValue)

let keyboardFrameEndRect: CGRect? = keyboardFrameEnd?.cgRectValue


if activeTextField.frame.origin.y + activeTextField.frame.size.height + 10 > (keyboardFrameEndRect?.origin.y)! {

    UIView.animate(withDuration: 0.3, delay: 0, options: .transitionFlipFromTop, animations: {() -> Void in

        //code with animation

        //Print some stuff to know what is actually happening
        //print(self.activeTextField.frame.origin.y)
        //print(self.activeTextField.frame.size.height)
        //print(self.activeTextField.frame.size.height)

        self.loginViewTopConstraint.constant = -(self.activeTextField.frame.origin.y + self.activeTextField.frame.size.height - (keyboardFrameEndRect?.origin.y)!) - 30.0

        self.view.layoutIfNeeded()

    }, completion: {(_ finished: Bool) -> Void in
        //code for completion

    })
}
}

func keyboardWillBeHidden(_ notification: Notification) {

UIView.animate(withDuration: 0.3, animations: {() -> Void in

    self.loginViewTopConstraint.constant = self.view.frame.origin.y
    self.view.layoutIfNeeded()

})
}

//MARK: textfield delegates
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    activeTextField = textField
    return true
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

           switch textField {
    case YOUR_TEXTFIELD_ONE:
        YOUR_TEXTFIELD_TWO.becomeFirstResponder()
        break
    case YOUR_TEXTFIELD_TWO:
        YOUR_TEXTFIELD_THREE.becomeFirstResponder()
        break
    default:
        textField.resignFirstResponder()
        break
    }
    return true
}

এখন শেষ স্নিপেট:

//Remove Keyboard Observers
override func viewWillDisappear(_ animated: Bool) {

NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardDidShow, object: nil)

NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

আপনার সমস্ত UITextFieldএর মধ্যে প্রতিনিধি নিয়োগ করতে ভুলবেন নাUIStoryboard

শুভকামনা!


0

সুইফট 3 সিনট্যাক্স:

func textFieldDidBeginEditing(_ textField: UITextField) {
    // add if for some desired textfields
        animateViewMoving(up: true, moveValue: 100)
}

func textFieldDidEndEditing(_ textField: UITextField) {
    // add if for some desired textfields
        animateViewMoving(up: false, moveValue: 100)
}

func animateViewMoving (up:Bool, moveValue :CGFloat){
     textFieldDidEndEditing(_ textField: UITextField) {

    let movementDuration:TimeInterval = 0.5

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

আপনি যা চান তা পেতে একটি দুর্দান্ত পদ্ধতি যা আপনি নির্দিষ্ট পাঠ্যক্ষেত্রের জন্য "যদি" শর্ত যোগ করতে পারেন তবে এই ধরণটি সকলের পক্ষে কাজ করে ... আশা করি এটি সবার পক্ষে কার্যকর হতে পারে


0

প্রথমে আপনার সক্রিয় ইউআইটিেক্সটফিল্ড সনাক্ত করতে একটি পরিবর্তনশীল ঘোষণা করুন।

ধাপ 1:-

যেমন var activeTextField: UITextField?

পদক্ষেপ 2: - এর পরে ভিডিডলয়েডে এই দুটি লাইন যুক্ত করুন।

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)

ধাপ 3:-

এখন আপনার নিয়ামক শ্রেণিতে এই দুটি পদ্ধতি সংজ্ঞায়িত করুন।

func keyboardWillShow(_ notification: NSNotification) {

    self.scrollView.isScrollEnabled = true
    var info = notification.userInfo!
    let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0)

    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardSize!.height
    if let activeField = self.activeField {
        if (!aRect.contains(activeField.frame.origin)){
            self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
        }
    }
}


func keyboardWillHide(_ notification: NSNotification) {

    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets
    self.view.endEditing(true)
    self.scrollView.isScrollEnabled = true
}


func textFieldDidBeginEditing(_ textField: UITextField){

    activeField = textField
}

func textFieldDidEndEditing(_ textField: UITextField){

    activeField = nil
}

0

দ্রুত 4.2 জন্য।

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

বিভিন্ন ধরণের ইউটেক্সটফিল্ড তৈরি করুন

var clickedTextField = UITextField()

আপনার ভিডিড লোডে

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

ক্লিক করা পাঠ্য ক্ষেত্রটি জানুন। সম্ভবত আপনি পুরো স্ক্রিনে টেক্সটফিল্ড রাখছেন।

func textFieldDidBeginEditing(_ textField: UITextField) {
    clickedTextField = textField
}

কীবোর্ডটি পাঠ্যক্ষেত্রটি আবরণ করছে কিনা তা পরীক্ষা করুন।

@objc func keyboardWillShow(sender: NSNotification,_ textField : UITextField) {
    if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

        if clickedTextField.frame.origin.y > keyboardSize.origin.y {
            self.view.frame.origin.y = keyboardSize.origin.y - clickedTextField.center.y - 20
        }
    }
}

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

বন্ধ কীবোর্ড ফিরে

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

আপডেট: এনএসনিটিফিকেশন.নাম.উইকিবোর্ড উইল শো এবং এনএসনিটিফিকেশন.নাম.ইউইকিবোর্ড উইলহাইড যথাক্রমে ইউআইআরআইএসপন্ডার.কিবোর্ডওয়িলশো নোটিফিকেশন এবং ইউআইআরআইএসপন্ডার.কিবোর্ড উইলহাইডনোটিকেশনের নামকরণ করা হয়েছে।


0

সুইফট : কোন টেক্সটফিল্ডটি উপস্থাপন করা হচ্ছে তা পরীক্ষা করে আপনি এটি করতে পারেন।

@objc func keyboardWillShow(notification: NSNotification) {
    if self.textField.isFirstResponder == true {
        self.view.frame.origin.y -= 150
     }
}

@objc func keyboardWillHide(notification: NSNotification){
    if self.textField.isFirstResponder == true {
       self.view.frame.origin.y += 150
    }
}

-1

এই কোডটি আপনি সম্পাদনা করছেন এমন পাঠ্য ক্ষেত্রটি সরিয়ে নিয়েছে যাতে আপনি এটি উত্তরটির জন্য সুইফট 3 এ দেখতে পারবেন যাতে আপনার ভিউটিকে একটি ইউআইটিেক্সটফিল্ডডিলিগেট করতে হবে:

var moveValue: CGFloat!
var moved: Bool = false
var activeTextField = UITextField()

func textFieldDidBeginEditing(_ textField: UITextField) {
    self.activeTextField = textField
}
func textFieldDidEndEditing(_ textField: UITextField) {
    if moved == true{
    self.animateViewMoving(up: false, moveValue: moveValue )
        moved = false
    }
}
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()
}

এবং তারপরে ভিডডিডলোড:

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)

কোন কলগুলি (ভিউডিডলডের বাইরে):

func keyboardWillShow(notification: Notification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        let keyboardHeight = keyboardSize.height
        if (view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height < keyboardHeight{
            moveValue = keyboardHeight - ((view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height)
            self.animateViewMoving(up: true, moveValue: moveValue )
            moved = true
        }
    }
}

-1

সুইফট 3

@IBOutlet var scrollView: UIScrollView!
@IBOutlet var edtEmail: UITextField!
@IBOutlet var bottomTextfieldConstrain: NSLayoutConstraint! // <- this guy is the constrain that connect the bottom of textField to lower object or bottom of page!

 @IBAction func edtEmailEditingDidBegin(_ sender: Any) { 
        self.bottomTextfieldConstrain.constant = 200
        let point = CGPoint(x: 0, y: 200)
        scrollView.contentOffset = point
    }

@IBAction func edtEmailEditingDidEnd(_ sender: Any) { 
    self.bottomTextfieldConstrain.constant = 50
}

-1

গৃহীত আনসার প্রায় নিখুঁত। তবে এর UIKeyboardFrameEndUserInfoKeyপরিবর্তে আমাকে ব্যবহার করতে হবে UIKeyboardFrameBeginUserInfoKey,কারণ উত্তরোত্তর কিবোর্ড উচ্চতা ০. এবং হিটেস্ট পয়েন্টটি মূলটির পরিবর্তে নীচে পরিবর্তন করুন।

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardSize!.height
    if let activeField = self.activeField {
        var point = activeField.frame.origin
        point.y += activeField.frame.size.height
        if (!aRect.contains(point)){
            self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
        }
    }

-1

সুইফট 4 আমার সমাধান আপডেট করেছে

কীবোর্ড শো / লুকানোর ক্ষেত্রে সীমাবদ্ধ অ্যানিমেশন সহ, উপভোগ করুন।

import Foundation
import UIKit

class PhoneController: UIViewController, UITextFieldDelegate{

    var phoneLayoutYConstraint: NSLayoutConstraint?

    override func viewDidLoad() {

        super.viewDidLoad()

        view.backgroundColor = .white

        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        phoneField.delegate = self

        view.addSubview(phoneField)

        NSLayoutConstraint.activate([phoneField.heightAnchor.constraint(equalToConstant: 50),
                                     phoneField.centerXAnchor.constraint(equalTo: view.centerXAnchor),
                                     phoneField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
                                     phoneField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20)])

        phoneLayoutYConstraint = NSLayoutConstraint(item: phoneField, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
        phoneLayoutYConstraint?.isActive = true

    }

    let phoneField: UITextField = {
        let text = UITextField()
        text.translatesAutoresizingMaskIntoConstraints = false
        text.keyboardType = .numberPad
        text.font = UIFont.systemFont(ofSize: 30)
        text.layer.cornerRadius = 5.0
        text.layer.masksToBounds = true
        text.layer.borderColor = UIColor.darkGray.cgColor
        text.layer.borderWidth = 2.0

        return text
    }()


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

    func textFieldDidBeginEditing(_ textField: UITextField) {

    }


    func textFieldDidEndEditing(_ textField: UITextField) {

    }

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


   @objc func handleKeyBoardNotification(_ notification: NSNotification) {

        if let info = notification.userInfo {

            let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
            let isKeyBoardShowing = notification.name == NSNotification.Name.UIKeyboardWillShow

            var aRect : CGRect = self.phoneField.frame
            aRect.size.height -= keyboardSize!.height


            phoneLayoutYConstraint?.constant = isKeyBoardShowing ? -keyboardSize!.height : 0

            UIView.animate(withDuration: 0, delay: 0, options: .curveEaseOut, animations: {
                self.view.layoutIfNeeded()
            }, completion: { (boo) in

            })

        }
    }

}

-1

সুইফট 4

আপনি UITextFieldঅ্যানিমেশন সহ কীবোর্ড সহ সহজেই উপরে এবং নিচে যেতে পারেন

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

import UIKit

class ViewController: UIViewController {

    @IBOutlet var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil)
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        textField.resignFirstResponder()
    }

    @objc func keyboardWillChange(notification: NSNotification) {

        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
        let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
        let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
        let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let deltaY = targetFrame.origin.y - curFrame.origin.y

        UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
            self.textField.frame.origin.y+=deltaY

        },completion: nil)
    }

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

-1

সুইফট 4.2

আমার দ্রবণটি (উল্লম্বভাবে) UITextFieldএর অবস্থানটি কীবোর্ডের নীচে থাকলে একটিতে কেন্দ্র করে ।

পদক্ষেপ 1: নতুন সুইফ্ট ফাইল এবং কপি-পেস্ট UIViewWithKeyboardক্লাস তৈরি করুন।
পদক্ষেপ 2: ইন্টারফেস বিল্ডার এটিকে আপনার শীর্ষের জন্য কাস্টম ক্লাস হিসাবে সেট করুন UIView

import UIKit

class UIViewWithKeyboard: UIView {
    @IBInspectable var offsetMultiplier: CGFloat = 0.75
    private var keyboardHeight = 0 as CGFloat
    private weak var activeTextField: UITextField?
    override func awakeFromNib() {
        super.awakeFromNib()
        NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.textDidBeginEditing),
                                               name: UITextField.textDidBeginEditingNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillShow),
                                               name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillHide),
                                               name: UIResponder.keyboardWillHideNotification, object: nil)
    }

    @objc func textDidBeginEditing(_ notification: NSNotification) {
        self.activeTextField = notification.object as? UITextField
    }

    @objc func keyboardWillShow(_ notification: Notification) {
        if let frameValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
            keyboardHeight = frameValue.cgRectValue.size.height
            if let textField = self.activeTextField {
                let offset = textField.frame.maxY < frame.maxY - keyboardHeight ? 0
                           : textField.frame.maxY - (frame.maxY - keyboardHeight) * offsetMultiplier
                self.setView(offset: offset)
            }
        }
    }

    @objc func keyboardWillHide(_ notification: NSNotification) {
        self.setView(offset: 0)
    }

    func setView(offset: CGFloat) {
        UIView.animate(withDuration: 0.25) {
            self.bounds.origin.y = offset
        }
    }
}

-1

দ্রুত 4.2 এর জন্য পুনরায় লিখিত

ViewDidLoad এ ..

 NotificationCenter.default.addObserver(self, selector: #selector(trailViewController.keyboardWasShown), name: UIResponder.keyboardWillShowNotification, object: nil)
 NotificationCenter.default.addObserver(self, selector: #selector(trailViewController.keyboardWillBeHidden), name: UIResponder.keyboardWillHideNotification, object: nil)

বাকী কাজ

func registerForKeyboardNotifications(){
    //Adding notifies on keyboard appearing
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
}

func deregisterFromKeyboardNotifications(){
    //Removing notifies on keyboard appearing
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}

@objc func keyboardWasShown(notification: NSNotification){
    //Need to calculate keyboard exact size due to Apple suggestions
    self.scrollView.isScrollEnabled = true
    var info = notification.userInfo!
    let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize!.height, right: 0.0)

    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets

    var aRect : CGRect = self.view.frame
    aRect.size.height -= keyboardSize!.height
    if let activeField = self.activeField {
        if (!aRect.contains(activeField.frame.origin)){
            self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
        }
    }
}

@objc func keyboardWillBeHidden(notification: NSNotification){
    //Once keyboard disappears, restore original positions
    var info = notification.userInfo!
    let keyboardSize = (info[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
    let contentInsets : UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: -keyboardSize!.height, right: 0.0)
    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets
    self.view.endEditing(true)
    self.scrollView.isScrollEnabled = false
}

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

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

-2

"আমি সুইফটে নতুন: আমি এটি উল্লেখ করতে ভুলে গেছি :( এটি যাচাই করার জন্য সঠিক সিনট্যাক্সটি কী হবে? (এই ফাংশনটিতে আমি ক্ষেত্রের নামটি কীভাবে পাব?)"

ঠিক আছে . প্রথমে UITextFieldDelegate প্রোটোকলটি নিশ্চিত করুন

class YourClass:UITextFieldDelegate

তারপরে ফাংশনটি বাস্তবায়ন করুন

func textFieldDidBeginEditing(textField: UITextField!) {

    if textField == txtOne
    {
        println("TextOne")
    }
    if textField == txtTwo
    {
        println("TextTwo")
    }
}

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


-3

সুইফট 4.2 এর জন্য

এই কোডটি আপনাকে নির্দিষ্ট ডিভাইসের স্ক্রিন আকারের জন্য ফ্রেমের ওয়াই অক্ষ মুহুর্তটি নিয়ন্ত্রণ করতে দেয়।

পিএস: এই কোডটি টেক্সটফিল্ডের অবস্থানের ভিত্তিতে ফ্রেমটিকে বুদ্ধিমানের সাথে স্থানান্তরিত করবে না।

ইউআইডিভাইসির জন্য একটি এক্সটেনশন তৈরি করুন

extension UIDevice {
    enum ScreenType: String {
        case iPhone4_4S = "iPhone 4 or iPhone 4s"
        case iPhones_5_5s_5c_SE = "iPhone 5, iPhone 5s, iPhone 5c or iPhone SE"
        case iPhones_6_6s_7_8 = "iPhone 6, iPhone 6s, iPhone 7 or iPhone 8"
        case iPhones_6Plus_6sPlus_7Plus_8Plus = "iPhone 6 Plus, iPhone 6s Plus, iPhone 7 Plus or iPhone 8 Plus"
        case iPhoneX_Xs = "iPhone X, iPhone Xs"
        case iPhoneXR = "iPhone XR"
        case iPhoneXSMax = "iPhone Xs Max"
        case unknown
    }
    var screenType: ScreenType {
        switch UIScreen.main.nativeBounds.height {
        case 960:
            return .iPhone4_4S
        case 1136:
            return .iPhones_5_5s_5c_SE
        case 1334:
            return .iPhones_6_6s_7_8
        case 1920, 2208:
            return .iPhones_6Plus_6sPlus_7Plus_8Plus
        case 1792:
            return .iPhoneXR
        case 2436:
            return .iPhoneX_Xs
        case 2688:
            return .iPhoneXSMax
        default:
            return .unknown
        }
    }
}

ভিউডিডোডে বিজ্ঞপ্তিঅবসভার যোগ করুন

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 ((notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue) != nil {
        if self.view.frame.origin.y == 0 {
            switch (UIDevice.current.screenType.rawValue) {
            case (UIDevice.ScreenType.iPhones_5_5s_5c_SE.rawValue):
                self.view.frame.origin.y -= 210
            case (UIDevice.ScreenType.iPhones_6_6s_7_8.rawValue):
                self.view.frame.origin.y -= 110
            case (UIDevice.ScreenType.iPhones_6Plus_6sPlus_7Plus_8Plus.rawValue):
                self.view.frame.origin.y -= 80
            case (UIDevice.ScreenType.iPhoneX_Xs.rawValue):
                self.view.frame.origin.y -= 70
            case (UIDevice.ScreenType.iPhoneXR.rawValue):
                self.view.frame.origin.y -= 70
            case (UIDevice.ScreenType.iPhoneXSMax.rawValue):
                self.view.frame.origin.y -= 70
            default:
                self.view.frame.origin.y -= 150
            }
        }
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if ((notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue) != nil {
        if self.view.frame.origin.y != 0 {
            switch (UIDevice.current.screenType.rawValue) {
            case (UIDevice.ScreenType.iPhones_5_5s_5c_SE.rawValue):
                self.view.frame.origin.y += 210
            case (UIDevice.ScreenType.iPhones_6_6s_7_8.rawValue):
                self.view.frame.origin.y += 110
            case (UIDevice.ScreenType.iPhones_6Plus_6sPlus_7Plus_8Plus.rawValue):
                self.view.frame.origin.y += 80
            case (UIDevice.ScreenType.iPhoneX_Xs.rawValue):
                self.view.frame.origin.y += 70
            case (UIDevice.ScreenType.iPhoneXR.rawValue):
                self.view.frame.origin.y += 70
            case (UIDevice.ScreenType.iPhoneXSMax.rawValue):
                self.view.frame.origin.y += 70
            default:
                self.view.frame.origin.y += 150
            }
        }
    }
}

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