iOS8 এ কীবোর্ডের উচ্চতার সঠিক মান পেতে পারে না


83

কীবোর্ডের আকার কী তা নির্ধারণ করতে আমি এই কোডটি ব্যবহার করছিলাম:

- (void)keyboardWillChange:(NSNotification *)notification {
    NSDictionary* keyboardInfo = [notification userInfo];
    NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
    CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];

}

আমি এটি সিমুলেটারে চালাচ্ছি।

সমস্যাটি হ'ল আইওএস 8 এর পরে এটি সঠিক মানটি দেবে না, কীবোর্ডের পরামর্শগুলি যদি আপ থাকে বা আমি তাদের নীচে নামিয়ে দিই তবে আমি আলাদা (সঠিক নয়) মান পাই।

কী-বোর্ডের পরামর্শ সহ আমি কী-বোর্ডের সঠিক আকার পেতে পারি?


আপনি যদি keyboardFrameBeginRectস্থানীয় স্থানাঙ্কে রূপান্তর করেন তবে এটির সহায়তা হতে পারে ।
— rmaddy

@ আরমড্ডি এটি সত্যিই গুরুত্বপূর্ণ নয়, আমার কেবল উচ্চতা প্রয়োজন।
— এলি ব্রাগিনস্কি

যা ওরিয়েন্টেশনের উপর নির্ভর করে ভুল হতে পারে। যদিও এটি এখন আর আইওএস 8 এর অধীনে কোনও সমস্যা নাও হতে পারে 8 তবে এটি চেষ্টা করে দেখুন এবং এটি কোনও পার্থক্য করে কিনা।
— rmaddy

@ আরমড্ডি আমি এটি চেষ্টা করেছিলাম তবে দুঃখের বিষয় এটি কোনও
— উপকারে আসেনি

উত্তর:


98

ব্যবহার

NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameEndUserInfoKey];

দুর্দান্ত উত্তর। ধন্যবাদ কীভাবে আপনি পেয়েছেন যে আপনার কীটি ব্যবহার করা উচিত? @ সৌভিক্সেস
— জুলিয়ান ওসোরিও

6
সিজিআরেক্ট কীবোর্ডফ্রেম = [কীবোর্ডফ্রেমবেগিন সিজিআরেক্টভ্যালু];
— বিস্ময়তাকে

12
আমার পক্ষে কাজ করেনি, কীবোর্ডটি এখনও 258 ছিল, খুব বেশি
— মার্চিন্রাম

আপনাকে @rycatchfinally ধন্যবাদ
— souvickcse

4
আজ একটি পাঠ শিখেছি। UIKeyboardFrameEndUserInfoKey এবং UIKeyboardFrameBeginUserInfoKey এ বড় পার্থক্য রয়েছে। আপনাকে ধন্যবাদ @ সৌভিক্সেস
— jejernig

120

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

সংক্ষেপে, কাস্টম কীবোর্ড বাস্তবায়ন দ্বারা UIKeyboardWillShowNotifications একাধিকবার কল করা যেতে পারে:

  1. যখন অ্যাপল সিস্টেম কীবোর্ডটি খোলা হবে (প্রতিকৃতিতে)
    • UIKeyboardWillShowNotifications 224 কীবোর্ড উচ্চতা সহ প্রেরণ করা হয়
  2. যখন Swype কীবোর্ড খোলা হয় (পোর্ট্রেট):
    • UIKeyboardWillSowowNotifications 0 এর কীবোর্ড উচ্চতা সহ প্রেরণ করা হয়
    • UIKeyboardWillSowowNotifications 216 এর কীবোর্ড উচ্চতা সহ প্রেরণ করা হয়
    • UIKeyboardWillSowowNotifications 256 এর কীবোর্ড উচ্চতা সহ প্রেরণ করা হয়
  3. যখন সুইফটকে কী - বোর্ডটি খোলা হবে (প্রতিকৃতিতে):
    • UIKeyboardWillSowowNotifications 0 এর কীবোর্ড উচ্চতা সহ প্রেরণ করা হয়
    • UIKeyboardWillSowowNotifications 216 এর কীবোর্ড উচ্চতা সহ প্রেরণ করা হয়
    • UIKeyboardWillSowowNotifications 259 এর কীবোর্ড উচ্চতা সহ প্রেরণ করা হয়

এই পরিস্থিতিতে একটি কোড-লাইনে সঠিকভাবে পরিচালনা করার জন্য আপনার প্রয়োজন:

UIKeyboardWillShowNotifications এবং UIKeyboardWillHideNotifications বিজ্ঞপ্তিগুলির বিরুদ্ধে পর্যবেক্ষকদের নিবন্ধ করুন :

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

বর্তমান কীবোর্ডের উচ্চতা ট্র্যাক করতে একটি বৈশ্বিক পরিবর্তনশীল তৈরি করুন:

CGFloat _currentKeyboardHeight = 0.0f;

বাস্তবায়ন keyboardWillShow কীবোর্ডের উচ্চতা বর্তমান পরিবর্তনের প্রতিক্রিয়া:

- (void)keyboardWillShow:(NSNotification*)notification {
   NSDictionary *info = [notification userInfo];
   CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
   CGFloat deltaHeight = kbSize.height - _currentKeyboardHeight; 
   // Write code to adjust views accordingly using deltaHeight
   _currentKeyboardHeight = kbSize.height;
}

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

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

- (void)keyboardWillHide:(NSNotification*)notification {
   NSDictionary *info = [notification userInfo];
   CGSize kbSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
   // Write code to adjust views accordingly using kbSize.height
   _currentKeyboardHeight = 0.0f;
}

কিন্তু, আপনার গবেষণা আকর্ষণীয়, কিন্তু প্রশ্ন থেকে সমস্যা কেবল ফ্রেমইন্ড বৈশিষ্ট্য পরিবর্তে ফ্রেমবেগিন প্রাপ্তি সম্পর্কে। আপনার উত্তর অনুসারে, আপনি ডেল্টাসের পরিবর্তে ইউআইভিউএনিমেশনওশনবেশনফ্রমনকারেন্ট স্টেট পতাকাটি অ্যানিমেশন পদ্ধতিতে ব্যবহার করার বিষয়টি বিবেচনা করেছেন?
— মাইকআর

সুইফটকে (বনাম 1.2.3) উচ্চতার 259 পরিবর্তে আইওএস 8.1.3 দিয়ে আইফোন 6 + এ আমি 271 পেয়েছি।
— হেমাং

4
এটি এখনও একটি কার্যকরী সমাধান? সুইফটকি ব্যবহার করার সময় আমি 259 এর পরিবর্তে 44 এর উচ্চতা
— পেয়েছি

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

আমার মতো ল্যান্ডস্কেপ মোডে আইফোন নিয়ে যদি আপনার সমস্যা হয় তবে এটি ফ্রেম এন্ড কীটির ভুল উত্স রয়েছে (কমপক্ষে স্বাভাবিক আইওএস 10 কীবোর্ডের জন্য)। KEYBOARD BEGIN RECT: (0.0, 375.0, 667.0, 162.0) ... KEYBOARD END RECT: (0.0, 213.0, 667.0, 162.0)
— xaphod

18

আমি স্ট্যাক ওভারফ্লো প্রবন্ধটি না আসা পর্যন্ত আমারও এই সমস্যা ছিল :

UIKeyboardFrameEndUserInfoKey রূপান্তর করুন

convertRectকী-বোর্ডের আকারকে ব্যবহারযোগ্য কিছুতে রূপান্তর করতে, তবে স্ক্রিন ওরিয়েন্টেশনে এটি কীভাবে ফাংশনটি ব্যবহার করবেন তা আপনাকে দেখায় ।

NSDictionary* d = [notification userInfo];
CGRect r = [d[UIKeyboardFrameEndUserInfoKey] CGRectValue];
r = [myView convertRect:r fromView:nil];

পূর্বে, আমি যা ব্যবহৃত একটি আইপ্যাড অ্যাপ ছিল UIKeyboardFrameEndUserInfoKeyকিন্তু করা হয়নি ব্যবহার convertRect, এবং এটি জরিমানা করেন।

তবে আইওএস 8 এর সাথে এটি আর সঠিকভাবে কাজ করে না। হঠাৎ, সে বিষয়ে রিপোর্ট যে আমার কীবোর্ড, আড়াআড়ি মোডে একটি আইপ্যাড চালু রাখার জন্য, ছিল 1024 পিক্সেল উচ্চতা পর্যন্ত ।

সুতরাং এখন, আইওএস 8 এর সাথে আপনি এই convertRectফাংশনটি ব্যবহার করা জরুরী ।


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

7

সুইং ২.০ তে লিখিত ডিগাংস্তার সমাধানের অনুরূপ :

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

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

func keyboardWillShow(notification: NSNotification) {
    guard let kbSizeValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
    guard let kbDurationNumber = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber else { return }
    animateToKeyboardHeight(kbSizeValue.CGRectValue().height, duration: kbDurationNumber.doubleValue)
}

func keyboardWillHide(notification: NSNotification) {
    guard let kbDurationNumber = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber else { return }
    animateToKeyboardHeight(0, duration: kbDurationNumber.doubleValue)
}

func animateToKeyboardHeight(kbHeight: CGFloat, duration: Double) {
    // your custom code here
}

আপনি যখন কুইকটাইপটি দেখান / লুকিয়ে রাখুন এবং স্মাইলিও সমস্যা
— user3722523

এই সস ছিল। সুইফট ২.৩-এ সামান্য পার্থক্য তবে এটি সংকলকটির থেকে একটি স্ব-সম্পূর্ণরূপে পরামর্শ তাই কোনও সমস্যা নেই।
— ইথান পার্কার 21

5

আমি extensionজন্যUIViewController

extension UIViewController {
    func keyboardWillChangeFrameNotification(notification: NSNotification, scrollBottomConstant: NSLayoutConstraint) {
        let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
        let curve = notification.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber
        let keyboardBeginFrame = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue()
        let keyboardEndFrame = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()

        let screenHeight = UIScreen.mainScreen().bounds.height
        let isBeginOrEnd = keyboardBeginFrame.origin.y == screenHeight || keyboardEndFrame.origin.y == screenHeight
        let heightOffset = keyboardBeginFrame.origin.y - keyboardEndFrame.origin.y - (isBeginOrEnd ? bottomLayoutGuide.length : 0)

        UIView.animateWithDuration(duration.doubleValue,
            delay: 0,
            options: UIViewAnimationOptions(rawValue: UInt(curve.integerValue << 16)),
            animations: { () in
                scrollBottomConstant.constant = scrollBottomConstant.constant + heightOffset
                self.view.layoutIfNeeded()
            },
            completion: nil
        )
    }
}

আপনি এটির মতো ব্যবহার করতে পারেন:

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillChangeFrameNotification:", name: UIKeyboardWillChangeFrameNotification, object: nil)
}

...

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

func keyboardWillChangeFrameNotification(notification: NSNotification) {
    self.keyboardWillChangeFrameNotification(notification, scrollBottomConstant: inputContainerBottom)
    // Write more to here if you want.
}

ভ্যানবোক চই, কোন মতামত ব্যবহার করা হচ্ছে inputContainerBottom?
— নাথানিয়েল ব্লুমার

@ নাথানিয়েল ইউআইটিেক্সটফিল্ড বা ইউআইটিেক্সটভিউয়ের নীচের স্থান থেকে সীমাবদ্ধতা নিচে থেকে ay ;) আমি এটি আমার প্রকল্পে সম্পাদনা করেছি। আমি এটি পুনরায় পোস্ট করব
— Wanbok Choi

5

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

যদি এটি হয় তবে এখানে একটি অন্তর্ভুক্ত বৈশিষ্ট্য রয়েছে:

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

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

এটি পরীক্ষা করতে আমি ব্যবহৃত সুইফট 3 বিজ্ঞপ্তি সেটআপটি এখানে রয়েছে, কারও যদি এটির প্রয়োজন হয়:

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

func keyboardWillShow(notification: NSNotification) {
    guard let keyboardSize = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
    print("\(keyboardSize)")
}

1

দ্রুততার জন্য কেবল একটি স্ট্রিং:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue().size

UIKeyboardFrameEndUserInfoKeyসর্বদা সঞ্চয় করে NSValue, তাই এটি পরীক্ষা করার দরকার নেই।


0

আমি ডিফল্ট কীবোর্ড এবং একটি কাস্টমের মধ্যে স্যুইচ করার সময় একটি সমস্যা দেখলাম (UIPickerView ) কীবোর্ডের - কাস্টম কীবোর্ডটি ডিফল্ট কীবোর্ড থেকে স্যুইচ করার পরে 162 এর পরিবর্তে 253 উচ্চতা প্রদর্শন করবে।

এক্ষেত্রে কী কাজ করেছে সেটি সেট করে দেওয়া হয়েছিল autocorrectionType = UITextAutocorrectionTypeNo; করেছে তা কাস্টম কীবোর্ডের সাথে ইনপুট ক্ষেত্রের জন্য ।

ইস্যুটি কেবল আইওএস 8-এ এসেছিল (কেবলমাত্র সিমুলেটারে পরীক্ষা করা হয়েছে)। এটি আইওএস 9 (সিমুলেটর বা ডিভাইস) এ ঘটে না।


0

সুইফটে, এক লাইনে নয় ...

self.keyboardDidShowObserver = NSNotificationCenter.defaultCenter().addObserverForName(UIKeyboardDidShowNotification, object: nil, queue: NSOperationQueue.mainQueue(), usingBlock: { (notification) in
        if let userInfo = notification.userInfo, let keyboardFrameValue = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue {
            let keyboardRect = keyboardFrameValue.CGRectValue()
            // keyboardRect.height gives the height of the keyboard
            // your additional code here...
        }
    })

0
[notificationCenter addObserverForName:UIKeyboardWillChangeFrameNotification object:nil queue:[NSOperationQueue currentQueue] usingBlock:^(NSNotification * _Nonnull note) {

    float keyboardHeight = [[note.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;

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