সুইফট ব্যবহার করে কীবোর্ডের সাথে ভিউ সরান


278

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

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

আমি সর্বত্র দেখেছি কিন্তু সমস্ত সমাধান ওবজ-সিতে উপস্থিত হয়েছে যা আমি এখনও রূপান্তর করতে পারি না।

কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে।


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

1
আসলে, অ্যাপল ডক্স আপনাকে কীভাবে এটি করতে হয় তা "কী-বোর্ড পরিচালনা" এর অধীনে
জানায়

11
আমি মনে করি নীচের সমস্ত উত্তর একটি ক্ষেত্রে বিবেচনা করে না: আপনার যদি একাধিক পাঠ্যক্ষেত্র থাকে এবং সেগুলির কয়েকটি পর্দার শীর্ষে অবস্থিত হয় তবে কী হবে? যে কোনও সময় ব্যবহারকারী সেই পাঠ্যক্ষেত্রটি ট্যাপ করেন, এটি পর্দার বাইরে চলে যায়, আমি সঠিকভাবে নিশ্চিত যে সঠিক উত্তরটি সনাক্ত করা উচিত কিনাit is actually needed to scroll view up when keyboard appears
ডিডিসি

এই উত্তর কিনা তা সনাক্ত করতে এটি আসলে দৃশ্য উপরে স্ক্রল প্রয়োজন হয় কীবোর্ড পরীক্ষণ পাঠ্যক্ষেত্র বর্তমানে সম্পাদিত হচ্ছে কীবোর্ড হিসাবে একই স্থান দখল করে যদি দ্বারা প্রদর্শিত সক্ষম হয় stackoverflow.com/a/28813720/6749410
HirdayGupta

উত্তর:


710

একটি পাঠ্য ফিল্ড থেকে অন্যটিতে স্যুইচটি পরিচালনা না করেই এখানে একটি সমাধান দেওয়া হয়েছে:

 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(notification: NSNotification) {            
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() {
        self.view.frame.origin.y -= keyboardSize.height
    }            
}

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

এটি সমাধানের জন্য, দুটি ফাংশন keyboardWillShow/Hideএগুলি দিয়ে প্রতিস্থাপন করুন :

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

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

SWIFT 3.0 এর জন্য সম্পাদনা করুন:

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

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

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

সুইফট ৪.০ এর জন্য সম্পাদনা করুন:

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

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

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

সুইফট ৪.২ এর জন্য সম্পাদনা করুন:

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.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y == 0 {
            self.view.frame.origin.y -= keyboardSize.height
        }
    }
}

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

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


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

36
কীবোর্ড আকার প্রাপ্ত করার UIKeyboardFrameEndUserInfoKeyপরিবর্তে আপনাকে ব্যবহার করা উচিত UIKeyboardFrameBeginUserInfoKey। আমি এই মুহুর্তে নিশ্চিত নই, তবে প্রাক্তন আরও ধারাবাহিক ফলাফল আনবে।
jshapy8

3
UIKeyboardFrameBeginUserInfoKeyসঙ্গে প্রতিস্থাপন করুন UIKeyboardFrameEndUserInfoKey। প্রথমটি কীবোর্ডের প্রারম্ভিক ফ্রেম দেয় যা কখনও কখনও শূন্য হয় এবং দ্বিতীয়টি কীবোর্ডের শেষ ফ্রেম দেয়।
অর্ণব 12

90

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

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

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


4
নীচের সীমাবদ্ধতা বাছাই করতে আপনি আকার পরিদর্শকের কাছেও যেতে পারেন, তারপরে তালিকার সীমাবদ্ধতায় ডাবল-ক্লিক করুন - raywenderlich.com/wp-content/uploads/2015/09/…
gammachill

3
এটি আমার জন্য নিখুঁত কাজ করেছে। এটি আক্ষরিকভাবে একটি 2 পদক্ষেপ প্রক্রিয়া। 1. কীবোর্ডলয়আউটকন্ট্রাইন্টসইউইফ্ট যুক্ত করুন, ২. স্টোরিবোর্ডে ভিউ বা পাঠ্য ক্ষেত্রের জন্য নীচে সীমাবদ্ধতা তৈরি করুন। দ্রষ্টব্য: আমি আমার সীমাবদ্ধতাগুলি মুছে ফেলেছি এবং ভিউ বা পাঠ্যক্ষেত্রের নীচে কেবল 1 সীমাবদ্ধতা যুক্ত করেছি এবং এর শ্রেণিবদ্ধতাকে এনএসলয়েটকন্ট্রেন্ট থেকে কী-বোর্ড-লেআউটকন্ট্রেন্টে পরিবর্তন করেছি। তারপরে উপরের কোনও দৃশ্য / পাঠ্যক্ষেত্র ইত্যাদি I আমি কেবলমাত্র একটি কীবোর্ডলাউটকন্ট্রেন্টের সাহায্যে আইটেমটির প্রতিবন্ধকতাগুলি আইটেমটির সাথে সংযুক্ত করেছি এবং ফলস্বরূপ সমস্ত আইটেমটি দৃশ্যপটে ইউপি / ডাউন সরানো হয়েছে যখন কী বোর্ড হাজির / নিখোঁজ হয়
ব্রায়ান

4
এটি সেরা সমাধান, প্রদত্ত কোডটি অ্যানিমেশনের দৈর্ঘ্য বা বক্রতা বা কীবোর্ডের আকারের মতো কোনও মানকে হার্ডকোড দেয় না। এটি বোঝাও সহজ।
মাইগুয়েলস্যান্তিরসো

3
এটি আমার জন্য কাজ করছে, তবে আমি কীবোর্ডের শীর্ষ এবং আমার স্ক্রোলভিউয়ের নীচের মাঝে একটি অতিরিক্ত 50px স্থান পাচ্ছি। আমি ভাবছি যে এটির আমি ব্যবহার করছি সেফ এরিয়া নীচের সীমাবদ্ধতার কারণে। এর মধ্যে কেউ দৌড়ায়?
ক্লিফটন ল্যাব্রাম

1
এটি একটি দুর্দান্ত উত্তর ছিল। খুব দুর্দান্ত নকশা। একটি পরামর্শ: আপনার পাঠ্যদর্শনগুলি / পাঠ্যক্ষেত্রগুলি যদি টেবিল ভিউ সেলগুলিতে থাকে তবে আপনি দেখতে পাচ্ছেন যে এই প্রতিবন্ধকতাটি ব্যবহারকারীরা প্রতিবার ক্লিক করার সাথে সাথে পরবর্তী পাঠ্য ক্ষেত্রে প্রবেশ করার সময় অদ্ভুতভাবে লাফিয়ে উঠবে। এনিমেশনগুলি DispatchQueue.main.async {}সংশোধন করতে আপনি এটি মোড়ানো করতে পারেন । ভাল কাজ! থাম্বস আপ!
স্কটিব্ল্যাডেস

68

এই থ্রেডের জনপ্রিয় একটি উত্তর নিম্নলিখিত কোড ব্যবহার করে:

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

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

এখানে এমন একটি সমাধান রয়েছে যা সমস্ত ডিভাইসে কাজ করে এবং প্রান্ত-কেস পরিচালনা করে যেখানে ব্যবহারকারী টাইপ করার সময় ভবিষ্যদ্বাণীপূর্ণ পাঠ্য ক্ষেত্রটি লুকিয়ে রাখেন।

সমাধান

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

@IBOutlet weak var messageField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: self.view.window)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: self.view.window)
}

func keyboardWillHide(sender: NSNotification) {
    let userInfo: [NSObject : AnyObject] = sender.userInfo!
    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    self.view.frame.origin.y += keyboardSize.height
}

আমরা এটি সমস্ত ডিভাইসে সুন্দর দেখাব এবং ব্যবহারকারী ভবিষ্যদ্বাণীপূর্ণ পাঠ্য ক্ষেত্রটি যুক্ত বা সরিয়ে ফেলবে এমন কেস পরিচালনা করব।

func keyboardWillShow(sender: NSNotification) {
    let userInfo: [NSObject : AnyObject] = sender.userInfo!
    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size

    if keyboardSize.height == offset.height {
        UIView.animateWithDuration(0.1, animations: { () -> Void in
            self.view.frame.origin.y -= keyboardSize.height
        })
    } else {
        UIView.animateWithDuration(0.1, animations: { () -> Void in
            self.view.frame.origin.y += keyboardSize.height - offset.height
        })
    }
}

পর্যবেক্ষকদের সরান

অপ্রয়োজনীয় বার্তাগুলি সঞ্চারিত হতে বাধা দিতে আপনার ভিউটি ত্যাগ করার আগে আপনার পর্যবেক্ষকদের অপসারণ করতে ভুলবেন না।

override func viewWillDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: self.view.window)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: self.view.window)
}

মন্তব্যসমূহের প্রশ্নের ভিত্তিতে আপডেট করুন:

আপনার যদি দুটি বা ততোধিক পাঠ্য ক্ষেত্র থাকে, তবে আপনার ভিউ.ফ্রেম.রিগিন.ইউ শূন্য রয়েছে কিনা তা পরীক্ষা করে দেখতে পারেন।

func keyboardWillShow(sender: NSNotification) {
    let userInfo: [NSObject : AnyObject] = sender.userInfo!

    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size

    if keyboardSize.height == offset.height {
        if self.view.frame.origin.y == 0 {
            UIView.animateWithDuration(0.1, animations: { () -> Void in
                self.view.frame.origin.y -= keyboardSize.height
            })
        }
    } else {
        UIView.animateWithDuration(0.1, animations: { () -> Void in
            self.view.frame.origin.y += keyboardSize.height - offset.height
        })
    }
     print(self.view.frame.origin.y)
}

1
একাধিক পাঠ্য ক্ষেত্রের সাথে কাজ করার সময়, দৃষ্টিভঙ্গিটি চলতে থাকে এবং ফিরে আসে না
মুগুনথন বালাকৃষ্ণন

আপনাকে পাঠ্য ক্ষেত্রগুলির অ্যাকাউন্টে আপনার শর্তগুলি পরিবর্তন করতে চলেছেন
ড্যান বিউলিউ

ধন্যবাদ প্রতিক্রিয়ার জন্য, আমি উত্তর আমি স্ট্যাক ওভারফ্লো এই থ্রেড এ খুঁজছেন ছিল পাওয়া stackoverflow.com/questions/1126726/...
Mugunthan Balakrishnan

@ মুগুন্থান বালাকৃষ্ণন এটিকে সামনে আনার জন্য ধন্যবাদ, আমি একটি সমাধান যুক্ত করেছি।
ড্যান বিউলিউ

হাই বন্ধুরা, একটি বাগ আছে। ভিউউইলডিস্পিয়ারে ডাকার পরে পর্যবেক্ষকরা ভিউ থেকে সরানো হবে না। এই লাইনটি "NSNotificationsCenter.defaultCenter ()।" অপসারণকারী (স্ব, নাম: UIKeyboardWillHideNotifications, অবজেক্ট: self.view.window) "এর সাথে" NSNotificationsCenter.defaultCenter () পরিবর্তন করুন। অপসারণকারী (স্ব, নাম: UIKeyboardWillHideNotication অবজেক্ট, অবজেক্ট) সরানো হয়েছে
রডাল্ড

29

এটি আপনার ভিউকন্ট্রোলারে যুক্ত করুন। একটি যাদুমন্ত্র মত কাজ করে. শুধু মানগুলি সামঞ্জস্য করুন।

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

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

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

2
এটি "অটো-লেআউট" নিয়ে কাজ নাও করতে পারে তাই যদি এটি নিষ্ক্রিয় করার কথা বিবেচনা করে।
টিওডর সিউরারু

1
এটি অটোলেআউট @ জোশের সাথে কিছু মজার আচরণের কারণ হয়ে দাঁড়ায়, আপনি ভুল হয়ে গেছেন
মাইক

5
এই না! আপনি ধরে নিতে পারবেন না কীবোর্ডটি একটি নির্দিষ্ট আকার।
নিলসবট

2
কীবোর্ডসাইজ ব্যবহার করা উচিত। যখন আপনার ডিভাইসে আনুষঙ্গিক দর্শন এবং বিভিন্ন কীবোর্ড হাইট থাকে তখন কী ঘটে? বিচ্ছিন্ন কীবোর্ড?
xtrinch

25

আমি একটি পৃষ্ঠার বিভিন্ন কীবোর্ড এবং বিভিন্ন পাঠ্যদর্শন / ক্ষেত্রের সাথে এটির কাজ করার জন্য উত্তরগুলির মধ্যে কিছুটা উন্নত করেছি:

পর্যবেক্ষক যুক্ত করুন:

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

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)

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

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

func keyboardWillChange(notification: NSNotification) {

    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        if YOURTEXTVIEW.isFirstResponder {
            self.view.frame.origin.y = -keyboardSize.height
        }
    }
}

পর্যবেক্ষকগুলি সরান:

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

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

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

এটি এক্সকোড 10.1 এবং আইওএস 12 এর জন্য কাজ করে The গৃহীত উত্তরটি আর বৈধ নয়।
জিশান

এটি একটি দুর্দান্ত উত্তর, কেবলমাত্র আমি যুক্ত করব নতুন ডিভাইসগুলির (নীচে, এক্সএস, ইত্যাদি) নীচের নিরাপদ অঞ্চলটি ট্র্যাক করা so যাতে এটির জন্য অ্যাকাউন্ট হয়।
মুনিব

@Munib দেখুন stackoverflow.com/a/54993623/1485230 অন্যান্য বিষয় দৃশ্য অ্যানিমেট না এবং কীবোর্ডের উচ্চতা পরিবর্তন অনুসরণ হওয়া অন্তর্ভুক্ত।
আন্তজি

আমার টেক্সটফিল্ড যদি শীর্ষে থাকে তবে ..? আমি বলতে চাইছি যদি এখানে ওয়াই = 0 দিয়ে পাঠ্যক্ষেত্র থাকে .. ?? তারপরে টেক্সটফিল্ড উপরে যাচ্ছে এবং আমি এটি দেখতে পাচ্ছি না
সাইফান নাদফ

18

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

pod 'IQKeyboardManagerSwift'

এবং তারপরে আপনার AppDelegate.swift do এর ভিতরে import IQKeyboardManagerSwift

import IQKeyboardManagerSwift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

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

      IQKeyboardManager.shared.enable = true // just add this line

      return true
    }
}

IQKeyboardManager.shared.enable = trueএটি সক্ষম করতে লাইনটি যুক্ত করুন আপনি
যদি উত্পাদনের জন্য যান তবে এই সমাধানটি অবশ্যই আবশ্যক।


এটি সত্যিই ভাল, তবে সর্বশেষতম সংস্করণটি আমার পক্ষে কাজ করে না, আমি .2.২.১ import IQKeyboardManagerব্যবহার করেছি IQKeyboardManager.shared().isEnabled = trueএবং অ্যাপডেলিগেট হিসাবে এবং হিসাবে ব্যবহার করেছি আমদানি করেছি
ধনু কে

2
এবং একাধিক সম্পাদনা পাঠগুলি ব্যবহার করার সময় এটি দুর্দান্তভাবে কাজ করে, এটি আমার সময় সাশ্রয় করেছে
ধনু কে

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

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

@ ধনুক, সবেমাত্র এই লাইব্রেরিটি খুঁজে পেয়েছে এবং নিখুঁতভাবে কাজ করে এবং এটি অনায়াসে। অ্যাপের প্রতিনিধি কোডটি আইকিউইবোর্ডেমেজ.আরএসএআরেড.ইনবেল = সত্য
অ্যাডজিজ

15

কালো স্ক্রিন ত্রুটির জন্য (সুইফট 4 এবং 4.2)

আমি ব্ল্যাক স্ক্রিনের সমস্যা ঠিক করেছি। যাচাই করা সমাধানটিতে ক্যাপচারের পরে কীবোর্ডের উচ্চতা পরিবর্তন হয় এবং এটি কালো পর্দার কারণ ঘটায়।

UIKeyboardFrameBeginUserInfoKey এর পরিবর্তে UIKeyboardFrameEndUserInfoKey ব্যবহার করতে হবে

var isKeyboardAppear = false

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

@objc func keyboardWillShow(notification: NSNotification) {
    if !isKeyboardAppear {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y == 0{
                self.view.frame.origin.y -= keyboardSize.height
            }
        }
        isKeyboardAppear = true
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    if isKeyboardAppear {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y != 0{
                self.view.frame.origin.y += keyboardSize.height
            }
        }
         isKeyboardAppear = false
    }
}

ট্যাববার থাকলে কাজ করবে না on't আপনাকে ট্যাববারের উচ্চতা গণনা করতে হবে, অন্যথায় কীবোর্ড এবং দর্শনের মধ্যে একটি কালো পর্দার ফাঁক থাকবে।
অঙ্কুর লাহিড়ী

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

14

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

এই উদাহরণে, আমি 175 এর প্রাথমিক মান সহ পাঠ্যক্ষেত্র থেকে নীচে লেআউট ভিউতে নীচের সীমাবদ্ধতা ব্যবহার করি।

@IBOutlet weak var bottomConstraint: NSLayoutConstraint!

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(notification: NSNotification) {
    //To retrieve keyboard size, uncomment following line
    //let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue()
    bottomConstraint.constant = 260
    UIView.animateWithDuration(0.3) {
        self.view.layoutIfNeeded()
    }
}

func keyboardWillHide(notification: NSNotification) {
    //To retrieve keyboard size, uncomment following line
    //let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue()
    bottomConstraint.constant = 175
    UIView.animateWithDuration(0.3) {
        self.view.layoutIfNeeded()
    }
}

হাই স্যার, আপনি কি দয়া করে আমাকে বলতে পারবেন যে টেবিলভিউ রয়েছে এমন একটি দৃশ্যে রাখলে এটি কেন কাজ করে না? এটি একই দৃশ্যে দুর্দান্ত কাজ করে যখন এটিতে কালেকশন ভিউ রয়েছে।
elacoiris

9

আমরা কী-বোর্ড উইলহাইডনোটিকেশনটিকে কীভাবে সংজ্ঞায়িত করব তাতে কিছু পরিবর্তন হয়েছে।

এই দ্রবণটি সুইফট ৪.২ এর সাথে কাজ করে :

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)


@objc func keyboardWillShow(_ notification:Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        self.view.frame.origin.y -= keyboardSize.height
    }
}

@objc func keyboardWillHide(_ notification:Notification) {
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        self.view.frame.origin.y += keyboardSize.height
    }
}

2
আমার টেক্সটফিল্ড যদি শীর্ষে থাকে তবে ..? আমি বলতে চাইছি যদি এখানে ওয়াই = 0 দিয়ে পাঠ্যক্ষেত্র থাকে .. ?? তারপরে টেক্সটফিল্ড উপরে যাচ্ছে এবং আমি এটি দেখতে পাচ্ছি না
সাইফান নাদফ

7

সুইফ্ট 5.0:

৪-৫ ঘন্টা লড়াইয়ের পরে আমি ইউআইভিউউকন্ট্রোলারের একটি সাধারণ এক্সটেনশান নিয়ে এসেছি সহজ কোড সহ যা কবজ হিসাবে কাজ করে

টেক্সটফিল্ড কীবোর্ডের উপরে থাকলে ভিউটি সরানো উচিত নয়

* NSLayoutConstraint এ ধ্রুবক মান সেট করার দরকার নেই

* কোনও তৃতীয় পক্ষের গ্রন্থাগারের প্রয়োজন নেই

* কোনও অ্যানিমেশন কোডের প্রয়োজন নেই

* টেবিলভিউতেও কাজ করে

* এটি অটো লেআউট / অটো পুনরায় আকারে কাজ করে

extension UIViewController {
    func addKeyboardObserver() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardNotifications(notification:)),
                                               name: UIResponder.keyboardWillChangeFrameNotification,
                                               object: nil)
    }

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

    // This method will notify when keyboard appears/ dissapears
    @objc func keyboardNotifications(notification: NSNotification) {

        var txtFieldY : CGFloat = 0.0  //Using this we will calculate the selected textFields Y Position
        let spaceBetweenTxtFieldAndKeyboard : CGFloat = 5.0 //Specify the space between textfield and keyboard


        var frame = CGRect(x: 0, y: 0, width: 0, height: 0)
        if let activeTextField = UIResponder.currentFirst() as? UITextField ?? UIResponder.currentFirst() as? UITextView {
            // Here we will get accurate frame of textField which is selected if there are multiple textfields
            frame = self.view.convert(activeTextField.frame, from:activeTextField.superview)
            txtFieldY = frame.origin.y + frame.size.height
        }

        if let userInfo = notification.userInfo {
            // here we will get frame of keyBoard (i.e. x, y, width, height)
            let keyBoardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
            let keyBoardFrameY = keyBoardFrame!.origin.y
            let keyBoardFrameHeight = keyBoardFrame!.size.height

            var viewOriginY: CGFloat = 0.0
            //Check keyboards Y position and according to that move view up and down
            if keyBoardFrameY >= UIScreen.main.bounds.size.height {
                viewOriginY = 0.0
            } else {
                // if textfields y is greater than keyboards y then only move View to up
                if txtFieldY >= keyBoardFrameY {

                    viewOriginY = (txtFieldY - keyBoardFrameY) + spaceBetweenTxtFieldAndKeyboard

                    //This condition is just to check viewOriginY should not be greator than keyboard height
                    // if its more than keyboard height then there will be black space on the top of keyboard.
                    if viewOriginY > keyBoardFrameHeight { viewOriginY = keyBoardFrameHeight }
                }
            }

            //set the Y position of view
            self.view.frame.origin.y = -viewOriginY
        }
    }
}

কোন টেক্সটফিল্ডটি নির্বাচিত হয়েছে তা পেতে এই ইউআরআইএসপেন্ডারের এই সম্প্রসারণ যুক্ত করুন

extension UIResponder {

    static weak var responder: UIResponder?

    static func currentFirst() -> UIResponder? {
        responder = nil
        UIApplication.shared.sendAction(#selector(trap), to: nil, from: nil, for: nil)
        return responder
    }

    @objc private func trap() {
        UIResponder.responder = self
    }
}

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

   override func viewWillAppear(_ animated: Bool) {
        self.addKeyboardObserver()
    }

    override func viewWillDisappear(_ animated: Bool) {
        self.removeKeyboardObserver()
    }


এটি সেরা সমাধানের মতো দেখায়, তবে কয়েকটি বাগ রয়েছে। 1, পাঠ্যক্ষেত্রটি সরে যায় তবে আমি এটিতে টাইপ করতে শুরু করলে এটি আরও কিছুটা লাফিয়ে। 2, পাঠ্যপুস্তকটি টাইপ করার সময় ল্যান্ডস্কেপে কখনও কখনও বাম দিকে ঝাঁপ দেয়।
ড্যারেন

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

6

সুইফ্ট 3-এর জন্য, আমি একটি ইউআইভিউকন্ট্রোলার সাবক্লাস তৈরি করেছি যেহেতু সমস্ত ভিউ কন্ট্রোলারে আমার ধ্রুবক আচরণ প্রয়োজন needed

class SomeClassVC: UIViewController {

  //MARK: - Lifecycle
  override func viewDidLoad() {
    super.viewDidLoad()

    addKeyboardObservers()
  }

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

    removeKeyboardObservers()
  }

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

  //MARK: - Help
  func addKeyboardObservers() {
    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)
  }

  func removeKeyboardObservers() {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: self.view.window)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: self.view.window)
  }

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

  func keyboardWillHide(notification: NSNotification) {
    UIView.animate(withDuration: 0.1, animations: { () -> Void in
      self.view.window?.frame.origin.y = 0
      self.view.layoutIfNeeded()
    })
  }

  func resignTextFieldFirstResponders() {
    for textField in self.view.subviews where textField is UITextField {
      textField.resignFirstResponder()
    }
  }

  func resignAllFirstResponders() {
      view.endEditing(true)
  }
}

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

আমার ট্যাব বারটিও উইন্ডো দিয়ে উপরে চলেছে! :(
আলফি

6

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

ধারণাটি হ'ল:

  • ফোকাস পাঠ্যফিল্ড পরম ওয়াই অবস্থান পেতে
  • কীবোর্ড উচ্চতা পেতে
  • স্ক্রিন হাইট পেতে
  • তারপরে কীবোর্ড অবস্থান এবং পাঠ্যক্ষেত্রের মধ্যে দূরত্ব গণনা করুন (যদি <0 -> ভিউ উপরে সরানো হয়)
  • ইউআইভিউ.ফ্রেমে.রিগিন.ইয়ের পরিবর্তে ইউআইভিউ.ট্রান্সফর্ম ব্যবহার করতে - = .., ইউআইভিউ.টান্সফর্ম =। ঘটনাবলির সাহায্যে মূল অবস্থানে ফিরে আসা আরও সহজ

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

কোডটি এখানে:

সুইফট 4

class ViewController: UIViewController, UITextFieldDelegate {

var textFieldRealYPosition: CGFloat = 0.0

override func viewDidLoad() {
    super.viewDidLoad()

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

  // Delegate all textfields

}


@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        let distanceBetweenTextfielAndKeyboard = self.view.frame.height - textFieldRealYPosition - keyboardSize.height
        if distanceBetweenTextfielAndKeyboard < 0 {
            UIView.animate(withDuration: 0.4) {
                self.view.transform = CGAffineTransform(translationX: 0.0, y: distanceBetweenTextfielAndKeyboard)
            }
        }
    }
}


@objc func keyboardWillHide(notification: NSNotification) {
    UIView.animate(withDuration: 0.4) {
        self.view.transform = .identity
    }
}


func textFieldDidBeginEditing(_ textField: UITextField) {
  textFieldRealYPosition = textField.frame.origin.y + textField.frame.height
  //take in account all superviews from textfield and potential contentOffset if you are using tableview to calculate the real position
}

}


খুব ভালো! (ভিউডিডলডে আপনার কাছে কেবল "ভিউকন্ট্রোলার" এর পরিবর্তে "VehiculeViewController" রয়েছে)।
নবীন

আরও অনেক সম্পূর্ণ এবং দরকারী উত্তর। ধন্যবাদ! আমি পরামর্শ দিচ্ছি যে কীবোর্ড চেকটি নিম্নরূপে বলা হয়েছে কারণ এটি কীবোর্ডের একটি ধারাবাহিক আকার দেবে ......... যদি কীবোর্ডসাইজ = (নোটিকেশন.ইউজারইনফো? [ইউআইআরআইএসপন্ডার.কিবোর্ডফ্রেমইন্ডইউজারআইফোনকি]? এনএসভ্যালু হিসাবে?)? সিজিআরেক্টভ্যালিউ? .size
বেন

4

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

func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        self.view.setTranslatesAutoresizingMaskIntoConstraints(true)
        self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.height - keyboardSize.height)
    }
}

func keyboardWillHide(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        self.collectionView.setTranslatesAutoresizingMaskIntoConstraints(false)
        self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.height + keyboardSize.height)
    }
}

4

আমার দুটি সেন্ট শুরুর জন্য: উপরের নমুনাগুলিতে কেউ স্থানাঙ্ক পরিবর্তন করে, অন্যান্য ব্যবহার "অটোরিসাইজিং মাস্ক" এবং অন্যান্য সীমাবদ্ধতাগুলি:

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


4

সুতরাং অন্য উত্তরগুলির কোনওটিই এটি সঠিক বলে মনে হচ্ছে না।

আইওএসের গুড বিহেভিয়ার কীবোর্ডের উচিত:

  • কীবোর্ডের আকার পরিবর্তন করার পরে স্বয়ংক্রিয়ভাবে পুনরায় আকার দিন (হ্যাঁ এটি করতে পারেন)
  • কীবোর্ডের মতো একই গতিতে অ্যানিমেট করুন
  • কীবোর্ডের মতো একই বক্ররেখা ব্যবহার করে অ্যানিমেট করুন
  • প্রাসঙ্গিক হলে নিরাপদ অঞ্চলগুলিকে সম্মান করুন।
  • আইপ্যাড / আনডকড মোডেও কাজ করে

আমার কোড একটি NSLayoutConstraintহিসাবে ঘোষিত একটি ব্যবহার@IBOutlet

@IBOutlet private var bottomLayoutConstraint: NSLayoutConstraint!

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

কোডটি এখানে:

// In ViewDidLoad
    NotificationCenter.default.addObserver(self, selector: #selector(?MyViewController.keyboardDidChange), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)


@objc func keyboardDidChange(notification: Notification) {
    let userInfo = notification.userInfo! as [AnyHashable: Any]
    let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
    let animationDuration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber
    let animationCurve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as! NSNumber
    bottomLayoutConstraint.constant = view.frame.height - endFrame.origin.y - view.safeAreaInsets.bottom // If your constraint is not defined as a safeArea constraint you might want to skip the last part.
    // Prevents iPad undocked keyboard.
    guard endFrame.height != 0, view.frame.height == endFrame.height + endFrame.origin.y else {
        bottomLayoutConstraint.constant = 0
        return
    }
    UIView.setAnimationCurve(UIView.AnimationCurve(rawValue: animationCurve.intValue)!)
    UIView.animate(withDuration: animationDuration.doubleValue) {
        self.view.layoutIfNeeded()
        // Do additional tasks such as scrolling in a UICollectionView
    }
}

3

কীবোর্ড খুললে সমস্ত গাইয়ের আপডেট টেবিলভিউ উচ্চতার জন্য এটির 100% নিখুঁত উত্তর

Swift4.2 এর জন্য

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

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

   @objc func keyboardWillShow(notification: NSNotification) {
    if ((notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue) != nil {

        var userInfo = notification.userInfo!
        var keyboardFrame:CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        keyboardFrame = self.view.convert(keyboardFrame, from: nil)

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

   @objc func keyboardWillHide(notification: NSNotification) {
    if ((notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue) != nil {
        let contentInset:UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        self.tbl.contentInset = contentInset
    }
}

Swift3.2

    override func viewDidLoad() {
          super.viewDidLoad()

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

           NotificationCenter.default.addObserver(self, selector: #selector(RecipeVC.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }
    func keyboardWillShow(notification: NSNotification) {
         if ((notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue) != nil {
         //self.view.frame.origin.y -= keyboardSize.height
         var userInfo = notification.userInfo!
         var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
          keyboardFrame = self.view.convert(keyboardFrame, from: nil)

          var contentInset:UIEdgeInsets = self.tbl.contentInset
          contentInset.bottom = keyboardFrame.size.height
          self.tbl.contentInset = contentInset

       }
    }

    func keyboardWillHide(notification: NSNotification) {
         if ((notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue) != nil {
         let contentInset:UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
         self.tbl.contentInset = contentInset
         }
    }

এটি সেরা উত্তর। টিবিএলটি টেবিলভিউ হওয়া উচিত এবং আমি কিছু প্যাডিং যুক্ত করেছি: কন্টেন্টইনেসট.বটম = কীবোর্ডফ্রেম.সাইজ.হাইট + 10
আইফাউ

2

জন্য সুইফট 3

func textFieldDidBeginEditing(_ textField: UITextField) { // became first responder

    //move textfields up
    let myScreenRect: CGRect = UIScreen.main.bounds
    let keyboardHeight : CGFloat = 216

    UIView.beginAnimations( "animateView", context: nil)
    var movementDuration:TimeInterval = 0.35
    var needToMove: CGFloat = 0

    var frame : CGRect = self.view.frame
    if (textField.frame.origin.y + textField.frame.size.height + UIApplication.shared.statusBarFrame.size.height > (myScreenRect.size.height - keyboardHeight - 30)) {
        needToMove = (textField.frame.origin.y + textField.frame.size.height + UIApplication.shared.statusBarFrame.size.height) - (myScreenRect.size.height - keyboardHeight - 30);
    }

    frame.origin.y = -needToMove
    self.view.frame = frame
    UIView.commitAnimations()
}

func textFieldDidEndEditing(_ textField: UITextField) {
    //move textfields back down
    UIView.beginAnimations( "animateView", context: nil)
    var movementDuration:TimeInterval = 0.35
    var frame : CGRect = self.view.frame
    frame.origin.y = 0
    self.view.frame = frame
    UIView.commitAnimations()
}

2

সুইফট 4:

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

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

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

@objc func keyboardWillHide(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y != 0{
            self.view.frame.origin.y = 0
        }
    }
}

আমার টেক্সটফিল্ড যদি শীর্ষে থাকে তবে ..? আমি বলতে চাইছি যদি এখানে ওয়াই = 0 দিয়ে পাঠ্যক্ষেত্র থাকে .. ?? তারপরে টেক্সটফিল্ড উপরে যাচ্ছে এবং আমি এটি দেখতে পাচ্ছি না
সাইফান নাদফ

2

@ বরিস উত্তরের মতো, তবে সুইফ্ট 5 এ :

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

@IBAction 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 -= keyboardSize.height
        }
    }
}

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

1

এখানে আমার সমাধান রয়েছে (আসলে আপনার কোডটি আপনার দৃষ্টিতে কয়েকটি পাঠ্যক্ষেত্র রয়েছে তখন এই কোডটি সেই ক্ষেত্রে হয়, যখন আপনার কাছে একটি পাঠ্যক্ষেত্র থাকে তখন এটি ক্ষেত্রেও কার্যকর হয়)

class MyViewController: UIViewController, UITextFieldDelegate {

@IBOutlet weak var firstTextField: UITextField!
@IBOutlet weak var secondTextField: UITextField!

var activeTextField: UITextField!
var viewWasMoved: Bool = false


override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PrintViewController.keyboardWillShow(_:)), name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(PrintViewController.keyboardWillHide(_:)), name: UIKeyboardWillHideNotification, object: nil)
}

override func viewDidDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

func textFieldDidBeginEditing(textField: UITextField) {
    self.activeTextField = textField
}

func textFieldDidEndEditing(textField: UITextField) {
    self.activeTextField = nil
}

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


func keyboardWillShow(notification: NSNotification) {

    let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue()

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

    let activeTextFieldRect: CGRect? = activeTextField?.frame
    let activeTextFieldOrigin: CGPoint? = activeTextFieldRect?.origin

    if (!CGRectContainsPoint(aRect, activeTextFieldOrigin!)) {
        self.viewWasMoved = true
        self.view.frame.origin.y -= keyboardSize!.height
    } else {
        self.viewWasMoved = false
    }
}

func keyboardWillHide(notification: NSNotification) {
    if (self.viewWasMoved) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            self.view.frame.origin.y += keyboardSize.height
        }
    }
}

ডেলিগেটটি টেক্সটফিল্ডগুলিতে সেট করতে ভুলবেন না
সুইঞ্জারডিংগার

কীবোর্ড উইলশোতে শর্তটি এমনভাবে পরিবর্তন করুন, যদি (! সিজিআরেক্ট কনটেনসপয়েন্ট) (আরেক্ট, নিউআরগিন!) এবং & সেল্ফ.ভিউওয়াসমোভড)
কিংফফ্লিস

ফ্রেমটি পুনরায় সেট করার সময় স্ব.ভিউওয়াসমোভেড = মিথ্যা যুক্ত করুন
কিংফফ্লিস

1

সুইফট 3 এর জন্য আপডেট করা হয়েছে ...

অন্যরা যেমন বলেছে, আপনাকে আপনার নিয়ামকের ভিউডিডলড () পদ্ধতিতে বিজ্ঞপ্তি পর্যবেক্ষক যুক্ত করতে হবে:

NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil)
    { notification in
    self.keyboardWillShow(notification)
    }

NotificationCenter.default.addObserver(forName: .UIKeyboardWillHide, object: nil, queue: nil)
    { notification in
    self.keyboardWillHide(notification)
    }

NotificationCenter.default.addObserver(forName: .UIKeyboardDidShow, object: nil, queue: nil)
    { _ in
    self.enableUserInteraction()
    }

NotificationCenter.default.addObserver(forName: .UIKeyboardDidHide, object: nil, queue: nil)
    { _ in
    self.enableUserInteraction()
    }

আপনার পর্যবেক্ষকদের যেখানে উপযুক্ত হবে সেগুলি সরিয়ে ফেলতে ভুলবেন না (আমি এটি ভিউউইলডিস্পিয়ার () পদ্ধতিতে করি)

NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillShow, object: nil)
NotificationCenter.default.removeObserver(self, name: .UIKeyboardWillHide, object: nil)
NotificationCenter.default.removeObserver(self, name: .UIKeyboardDidShow, object: nil)
NotificationCenter.default.removeObserver(self, name: .UIKeyboardDidHide, object: nil)

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

func keyboardWillShow(notification: Notification)
    {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
        {
        UIApplication.shared.beginIgnoringInteractionEvents()
        self.view.frame.origin.y -= keyboardSize.height
        // add this line if you are shifting a scrollView, as in a chat application
        self.timelineCollectionView.contentInset.top += keyboardSize.height
        }
    }

func keyboardWillHide(notification: Notification)
    {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
        {
        UIApplication.shared.beginIgnoringInteractionEvents()
        self.view.frame.origin.y += keyboardSize.height
        // add this line if you are shifting a scrollView, as in a chat application
        self.timelineCollectionView.contentInset.top -= keyboardSize.height
        }
    }

শেষ অবধি, ব্যবহারকারীর মিথস্ক্রিয়াগুলি পুনরায় সক্ষম করুন (মনে রাখবেন, এই পদ্ধতিটি কীবোর্ড ডডশো বা ডিহাইড লুকানোর পরে ফায়ার করে):

func enableUserInteraction()
    {
    UIApplication.shared.endIgnoringInteractionEvents()
    }

1

সুইফট 3 কোড

var activeField: UITextField?

override func viewDidLoad() {
    super.viewDidLoad()

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

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

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

func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        if (self.activeField?.frame.origin.y)! >= keyboardSize.height {
            self.view.frame.origin.y = keyboardSize.height - (self.activeField?.frame.origin.y)!
        } else {
            self.view.frame.origin.y = 0
        }
    }
}

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

1

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

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(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        self.view.frame.origin.y -= keyboardSize.height
    }
}

func keyboardWillHide(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        self.view.frame.origin.y += keyboardSize.height
    }
}

এটি সমাধানের জন্য, "কী-বোর্ড উইল শো / লুকান" দুটি ফাংশন এগুলি প্রতিস্থাপন করুন:

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

func keyboardWillHide(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        if view.frame.origin.y != 0 {
            self.view.frame.origin.y += keyboardSize.height
        }
    }
}

আমার টেক্সটফিল্ড যদি শীর্ষে থাকে তবে ..? আমি বলতে চাইছি যদি এখানে ওয়াই = 0 দিয়ে পাঠ্যক্ষেত্র থাকে .. ?? তারপরে পাঠ্য ফিল্ড উপরে যাচ্ছে এবং আমি এটি দেখতে পাচ্ছি না
সাইফান নাদফ

1

@ বরিসের সমাধান খুব ভাল তবে ভিউটি কখনও কখনও দূষিত হতে পারে।

নিখুঁত সারিবদ্ধকরণের জন্য, নীচের কোডটি ব্যবহার করুন

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

কার্যাবলী:

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

এবং,

@objc func keyboardWillHide(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
    if self.view.frame.origin.y != 0{
        self.view.frame.origin.y = 0 
    }
} }

0

এই ভিডিও টিউটোরিয়াল সেরা। 7 মিনিট দীর্ঘ এবং এটি কেবল এতটা অর্থবোধ করবে। যখন আপনার একাধিক পাঠ্য ক্ষেত্র থাকে এবং সুনির্দিষ্ট পাঠ্যক্ষেত্রটি ট্যাপ করা হয় তখন স্ক্রোল ভিউটি "x" পরিমাণ পিক্সেল সরিয়ে নিতে চায় for

https://youtu.be/VuiPGJOEBH4

কেবল এই পদক্ষেপগুলি:

- আপনার সমস্ত পাঠ্যক্ষেত্রটি স্ক্রোলভিউয়ের মধ্যে রাখুন যা দেখার প্রান্তে সীমাবদ্ধ lace

সমস্ত পাঠ্যক্ষেত্র সংযোগ করুন এবং দর্শন নিয়ন্ত্রকের প্রতিনিধি হিসাবে স্ক্রোল দেখুন।

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

class ViewController: UIViewController, UITextFieldDelegate {

আপনার ক্লাসে ইউআইটিেক্সটফিল্ডডেলিগেট প্রোটোকল যুক্ত করুন

@IBOutlet var stateAddress: UITextField!
@IBOutlet var zipAddress: UITextField!
@IBOutlet var phoneNumber: UITextField!
@IBOutlet var vetEmailAddress: UITextField!    
@IBOutlet weak var scrollView: UIScrollView!

আপনার সুইফট ফাইলটিতে ইউআইটিেক্সটফিল্ডডেলিগেট পদ্ধতি যুক্ত করুন:

func textFieldShouldReturn(textField: UITextField) -> Bool {

    textField.resignFirstResponder()
    return true
}


func textFieldDidBeginEditing(textField: UITextField) {

    if (textField == self.stateAddress) {
        scrollView.setContentOffset(CGPointMake(0, 25), animated: true)
    }
    else if (textField == self.zipAddress) {
        scrollView.setContentOffset(CGPointMake(0, 57), animated: true)
    }
    else if (textField == self.phoneNumber) {
        scrollView.setContentOffset(CGPointMake(0, 112), animated: true)
    }
    else if (textField == self.vetEmailAddress) {
        scrollView.setContentOffset(CGPointMake(0, 142), animated: true)
    }
}

func textFieldDidEndEditing(textField: UITextField) {

    scrollView.setContentOffset(CGPointMake(0, 0), animated: true)
}

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

আমি আমার ভিউ পিক্সেলকে এইভাবে পারফেক্ট বানিয়েছি!


0

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

import UIKit

class NamVcc: UIViewController, UITextFieldDelegate
{
    @IBOutlet weak var NamTxtBoxVid: UITextField!

    var VydTxtBoxVar: UITextField!
    var ChkKeyPadDspVar: Bool = false
    var KeyPadHytVal: CGFloat!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        NamTxtBoxVid.delegate = self
    }

    override func viewWillAppear(animated: Bool)
    {
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: #selector(TdoWenKeyPadVyd(_:)),
            name:UIKeyboardWillShowNotification,
            object: nil);
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: #selector(TdoWenKeyPadHyd(_:)),
            name:UIKeyboardWillHideNotification,
            object: nil);
    }

    func textFieldDidBeginEditing(TxtBoxPsgVar: UITextField)
    {
        self.VydTxtBoxVar = TxtBoxPsgVar
    }

    func textFieldDidEndEditing(TxtBoxPsgVar: UITextField)
    {
        self.VydTxtBoxVar = nil
    }

    func textFieldShouldReturn(TxtBoxPsgVar: UITextField) -> Bool
    {
        self.VydTxtBoxVar.resignFirstResponder()
        return true
    }

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

    func TdoWenKeyPadVyd(NfnPsgVar: NSNotification)
    {
        if(!self.ChkKeyPadDspVar)
        {
            self.KeyPadHytVal = (NfnPsgVar.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().height

            var NonKeyPadAraVar: CGRect = self.view.frame
            NonKeyPadAraVar.size.height -= self.KeyPadHytVal

            let VydTxtBoxCenVal: CGPoint? = VydTxtBoxVar?.frame.origin

            if (!CGRectContainsPoint(NonKeyPadAraVar, VydTxtBoxCenVal!))
            {
                self.ChkKeyPadDspVar = true
                UIView.animateWithDuration(1.0,
                    animations:
                    { self.view.frame.origin.y -= (self.KeyPadHytVal)},
                    completion: nil)
            }
            else
            {
                self.ChkKeyPadDspVar = false
            }
        }

    }

    func TdoWenKeyPadHyd(NfnPsgVar: NSNotification)
    {
        if (self.ChkKeyPadDspVar)
        {
            self.ChkKeyPadDspVar = false
            UIView.animateWithDuration(1.0,
                animations:
                { self.view.frame.origin.y += (self.KeyPadHytVal)},
                completion: nil)
        }
    }

    override func viewDidDisappear(animated: Bool)
    {
        super.viewWillDisappear(animated)
        NSNotificationCenter.defaultCenter().removeObserver(self)
        view.endEditing(true)
        ChkKeyPadDspVar = false
    }
}

| :: | কখনও কখনও দেখুন নীচে থাকবেন, সেক্ষেত্রে উচ্চতা +/- 150 ব্যবহার করুন:

    NonKeyPadAraVar.size.height -= self.KeyPadHytVal + 150

    { self.view.frame.origin.y -= self.KeyPadHytVal  - 150},
                    completion: nil)

    { self.view.frame.origin.y += self.KeyPadHytVal  - 150},
                completion: nil)

0
func keyboardWillShow(notification: NSNotification) {

    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        self.view.frame.origin.y = self.view.frame.height - (self.view.frame.height + keyboardSize.height)
    }

}

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

এটি আরও স্থিতিশীল হতে হবে


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

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

 }

 // MARK: - keyboard
 func keyboardWillShow(notification: NSNotification) 
{

if let userInfo = notification.userInfo {
if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
let contentInsets = self.tblView.contentInset as UIEdgeInsets
self.tblView.contentInset = UIEdgeInsets(top: contentInsets.top, left: contentInsets.left, bottom: keyboardSize.height, right:contentInsets.right)
                    // ...
                } else {
                    // no UIKeyboardFrameBeginUserInfoKey entry in userInfo
                }
            } else {
                // no userInfo dictionary in notification
            }
        }

func keyboardWillHide(notification: NSNotification) 
{
let contentInsets = self.tblView.contentInset as UIEdgeInsets
self.tblView.contentInset = UIEdgeInsets(top: contentInsets.top, left: contentInsets.left, bottom: 0, right:contentInsets.right)
 }

0

ক্লিক করে ইউআইটিেক্সটফিল্ডে দেখার জন্য নিম্নলিখিত কোডটি ব্যবহার করুন

func textFieldDidBeginEditing(textField: UITextField) {
    ViewUpanimateMoving(true, upValue: 100)
}
func textFieldDidEndEditing(textField: UITextField) {
    ViewUpanimateMoving(false, upValue: 100)
}
func ViewUpanimateMoving (up:Bool, upValue :CGFloat){
    var durationMovement:NSTimeInterval = 0.3
    var movement:CGFloat = ( up ? -upValue : upValue)
    UIView.beginAnimations( "animateView", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(durationMovement)
    self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
    UIView.commitAnimations()
}

0

বিষয়টি সহজ করার জন্য আমি একটি কোকোপড তৈরি করেছি:

https://github.com/xtrinch/KeyboardLayoutHelper

এটি কিভাবে ব্যবহার করতে:

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

নীচের বিন্যাসের সীমাবদ্ধতা ধারক দৃশ্যের হতে পারে, টেক্সটফিল্ড নিজেই, আপনি যে কোনও নাম দিন।

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