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.