আমার অ্যাপ্লিকেশনটি থেকে কীবোর্ড প্রদর্শিত এবং লুকানো থাকলে কীভাবে সনাক্ত করব?
আমার অ্যাপ্লিকেশনটি থেকে কীবোর্ড প্রদর্শিত এবং লুকানো থাকলে কীভাবে সনাক্ত করব?
উত্তর:
কীবোর্ড সম্পর্কে বার্তা শোনার জন্য আপনার শ্রেণীর ভিউডিডলড পদ্ধতিতে সেট আপ করুন:
// Listen for keyboard appearances and disappearances
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHide:)
name:UIKeyboardDidHideNotification
object:nil];
তারপরে আপনি নির্দিষ্ট পদ্ধতিগুলিতে (এই ক্ষেত্রে keyboardDidShow
এবং keyboardDidHide
) আপনি এটি সম্পর্কে কিছু করতে পারেন:
- (void)keyboardDidShow: (NSNotification *) notif{
// Do something here
}
- (void)keyboardDidHide: (NSNotification *) notif{
// Do something here
}
UITextFieldDelegat
ই করুন, তারপরে textFieldShouldReturn:
পদ্ধতিটি কার্যকর করুন । আপনি textField
যুক্তি হিসাবে সবেমাত্র প্রবেশ করবেন, যা আপনি নিজের টেক্সটফিল্ডগুলির সাথে তুলনা করতে এবং scrollView
উপযুক্ত টেক্সটফিল্ডটি প্রদর্শিত হচ্ছে যাতে স্ক্রোল করতে পারেন।
আপনি শুধু প্রয়োজন হতে পারে addObserver
মধ্যে viewDidLoad
। কিন্তু থাকার addObserver
মধ্যে viewWillAppear
এবং removeObserver
মধ্যে viewWillDisappear
বাধা বিরল বিপর্যস্ত যা ঘটে যখন আপনি আপনার ভিউ পরিবর্তন হচ্ছে।
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear), name: UIResponder.keyboardWillHideNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear), name: UIResponder.keyboardWillShowNotification, object: nil)
}
@objc func keyboardWillAppear() {
//Do something here
}
@objc func keyboardWillDisappear() {
//Do something here
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear), name: Notification.Name.UIKeyboardWillHide, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear), name: Notification.Name.UIKeyboardWillShow, object: nil)
}
@objc func keyboardWillAppear() {
//Do something here
}
@objc func keyboardWillDisappear() {
//Do something here
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillAppear:", name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillDisappear:", name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillAppear(notification: NSNotification){
// Do something here
}
func keyboardWillDisappear(notification: NSNotification){
// Do something here
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
NSNotificationCenter.defaultCenter().removeObserver(self)
}
deinit
:deinit { NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) }
deinit { NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil) }
সুইফট 3:
NotificationCenter.default.addObserver(self, selector: #selector(viewController.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(viewController.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
func keyboardWillShow(_ notification: NSNotification){
// Do something here
}
func keyboardWillHide(_ notification: NSNotification){
// Do something here
}
সুইফট 4:
NotificationCenter.default.addObserver( self, selector: #selector(ControllerClassName.keyboardWillShow(_:)),
name: Notification.Name.UIKeyboardWillShow,
object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(ControllerClassName.keyboardWillHide(_:)),
name: Notification.Name.UIKeyboardWillHide,
object: nil)
এরপরে, অবজেক্টের জীবন শেষ হয়ে গেলে বিজ্ঞপ্তিগুলি শোনা বন্ধ করার পদ্ধতি যুক্ত করা: -
Then add the promised methods from above to the view controller:
deinit {
NotificationCenter.default.removeObserver(self)
}
func adjustKeyboardShow(_ open: Bool, notification: Notification) {
let userInfo = notification.userInfo ?? [:]
let keyboardFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
let height = (keyboardFrame.height + 20) * (open ? 1 : -1)
scrollView.contentInset.bottom += height
scrollView.scrollIndicatorInsets.bottom += height
}
@objc func keyboardWillShow(_ notification: Notification) {
adjustKeyboardShow(true, notification: notification)
}
@objc func keyboardWillHide(_ notification: Notification) {
adjustKeyboardShow(false, notification: notification)
}
+=
পোকামাকড়গুলি আরও বড় এবং বৃহত করে তোলে appears
UIResponder.keyboardWillShowNotification
এবং UIResponder.keyboardWillHideNotification
, এবং কীবোর্ড তথ্য কী UIResponder.keyboardFrameBeginUserInfoKey
।
উপরের উত্তরগুলি সঠিক। যদিও আমি গুটিয়ে রাখতে সহায়ক তৈরি করতে পছন্দ করব notification's observers
।
extension KeyboardHelper {
enum Animation {
case keyboardWillShow
case keyboardWillHide
}
typealias HandleBlock = (_ animation: Animation, _ keyboardFrame: CGRect, _ duration: TimeInterval) -> Void
}
final class KeyboardHelper {
private let handleBlock: HandleBlock
init(handleBlock: @escaping HandleBlock) {
self.handleBlock = handleBlock
setupNotification()
}
deinit {
NotificationCenter.default.removeObserver(self)
}
private func setupNotification() {
_ = NotificationCenter.default
.addObserver(forName: UIResponder.keyboardWillShowNotification, object: nil, queue: .main) { [weak self] notification in
self?.handle(animation: .keyboardWillShow, notification: notification)
}
_ = NotificationCenter.default
.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: .main) { [weak self] notification in
self?.handle(animation: .keyboardWillHide, notification: notification)
}
}
private func handle(animation: Animation, notification: Notification) {
guard let userInfo = notification.userInfo,
let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue,
let duration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double
else { return }
handleBlock(animation, keyboardFrame, duration)
}
}
private var keyboardHelper: KeyboardHelper?
...
override func viewDidLoad() {
...
keyboardHelper = KeyboardHelper { [unowned self] animation, keyboardFrame, duration in
switch animation {
case .keyboardWillShow:
print("keyboard will show")
case .keyboardWillHide:
print("keyboard will hide")
}
}
}
সুইফট - 4
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
addKeyBoardListener()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self) //remove observer
}
func addKeyBoardListener() {
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);
}
@objc func keyboardWillShow(_ notification: Notification) {
}
@objc func keyboardWillHide(_ notification: Notification) {
}
সুইফ্ট ৪.২-এ বিজ্ঞপ্তিগুলির নামগুলি একটি পৃথক নেমস্পেসে চলে গেছে। সুতরাং এখন এটি
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
addKeyboardListeners()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
func addKeyboardListeners() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
}
@objc private extension WhateverTheClassNameIs {
func keyboardWillShow(_ notification: Notification) {
// Do something here.
}
func keyboardWillHide(_ notification: Notification) {
// Do something here.
}
}
পরীক্ষা করে দেখুন কীবোর্ড ম্যানেজিং বিভাগে "টেক্সট, ওয়েব, এবং গাইড প্রোগ্রামিং সম্পাদনা" কীবোর্ড ট্র্যাকিং তথ্যের জন্য দেখানো হয় অথবা গোপন থাকবে না, এবং কিভাবে প্রদর্শন / নিজে খারিজ করতে।
আপনি 2 টি কীবোর্ড বিজ্ঞপ্তির জন্য নিজেকে নিবন্ধিত করতে চাইবেন:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name: UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector (keyboardDidHide:) name: UIKeyboardDidHideNotification object:nil];
কীভাবে কীভাবে আপনার টেক্সটফিল্ডকে সমন্বয় করা যায় সে সম্পর্কে দুর্দান্ত পোস্ট - http://iosdevelopertips.com/user-interface/adjust-textfield-hided-by-keyboard.html
সুইফট 4 -dd 20 october 2017
override func viewDidLoad() {
[..]
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillDisappear(_:)), name: Notification.Name.UIKeyboardWillHide, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillAppear(_:)), name: Notification.Name.UIKeyboardWillShow, object: nil)
}
@objc func keyboardWillAppear(_ notification: NSNotification) {
if let userInfo = notification.userInfo,
let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue).cgRectValue {
let inset = keyboardFrame.height // if scrollView is not aligned to bottom of screen, subtract offset
scrollView.contentInset.bottom = inset
scrollView.scrollIndicatorInsets.bottom = inset
}
}
@objc func keyboardWillDisappear(_ notification: NSNotification) {
scrollView.contentInset.bottom = 0
scrollView.scrollIndicatorInsets.bottom = 0
}
deinit {
NotificationCenter.default.removeObserver(self)
}
আপনার যদি আরও একটি থাকে UITextField
এবং আপনার (বা তার আগে) কীবোর্ড প্রদর্শিত হবে বা অদৃশ্য হয়ে গেলে কিছু করা দরকার, আপনি এই পদ্ধতির প্রয়োগ করতে পারেন।
যোগ UITextFieldDelegate
আপনার বর্গ করা। পূর্ণসংখ্যার কাউন্টার নির্ধারণ করুন, আসুন বলুন:
NSInteger editCounter;
এই কাউন্টারটি কোথাও শূন্যে সেট করুন viewDidLoad
। তারপরে, পদ্ধতিগুলি বাস্তবায়ন textFieldShouldBeginEditing
এবং textFieldShouldEndEditing
প্রতিনিধিত্ব করুন।
প্রথমটিতে সম্পাদনা কাউন্টারে 1 যুক্ত করুন। এডিটকাউন্টারটির মান যদি 1 হয়ে যায় - এর অর্থ হ'ল কীবোর্ড প্রদর্শিত হবে (আপনি যদি YES ফেরত দেন তবে)। যদি সম্পাদনা কাউন্টার> 1 - এর অর্থ হ'ল কীবোর্ডটি ইতিমধ্যে দৃশ্যমান এবং অন্য একটি ইউআইটিেক্সটফিল্ড ফোকাসটি ধারণ করে।
সম্পাদনা textFieldShouldEndEditing
কাউন্টার থেকে বিয়োগ 1 তে। আপনি যদি শূন্য পান - কীবোর্ড খারিজ করা হবে, অন্যথায় এটি স্ক্রিনে থাকবে।
আপনি KBKeyboardObserver লাইব্রেরি ব্যবহার করতে পারেন । এটিতে কয়েকটি উদাহরণ রয়েছে এবং এটি সহজ ইন্টারফেস সরবরাহ করে।
NSNotificationCentr
কীবোর্ডের দৃশ্যমানতার জন্য পর্যবেক্ষণের সুবিধার্থে একটি কোকোপড রয়েছে : https://github.com/levantAJ/Keyhi
pod 'Keyhi'
সুতরাং আহ, এটি এখন আসল উত্তর।
import Combine
class MrEnvironmentObject {
/// Bind into yr SwiftUI views
@Published public var isKeyboardShowing: Bool = false
/// Keep 'em from deallocatin'
var subscribers: [AnyCancellable]? = nil
/// Adds certain Combine subscribers that will handle updating the
/// `isKeyboardShowing` property
///
/// - Parameter host: the UIHostingController of your views.
func setupSubscribers<V: View>(
host: inout UIHostingController<V>
) {
subscribers = [
NotificationCenter
.default
.publisher(for: UIResponder.keyboardWillShowNotification)
.sink { [weak self] _ in
self?.isKeyboardShowing = true
},
NotificationCenter
.default
.publisher(for: UIResponder.keyboardWillHideNotification)
.sink { [weak self, weak host] _ in
self?.isKeyboardShowing = false
// Hidden gem, ask me how I know:
UIAccessibility.post(
notification: .layoutChanged,
argument: host
)
},
// ...
Profit
.sink { [weak self] profit in profit() },
]
}
}