কীভাবে প্রোগ্রামে আইওএস স্ট্যাটাস বারের উচ্চতা পাবেন


277

আমি জানি যে বর্তমানে আইফোন / আইপ্যাডের শীর্ষে স্ট্যাটাস বারটি (সময়, ব্যাটারি এবং নেটওয়ার্ক সংযোগ সহ) নন-রেটিনা স্ক্রিনের জন্য 20 পিক্সেল এবং রেটিনা স্ক্রিনের জন্য 40 পিক্সেল, তবে ভবিষ্যতের প্রমাণের জন্য আমার অ্যাপ্লিকেশনটি আমি চাই হার্ড কোডিং মান ব্যতীত এটি নির্ধারণ করতে সক্ষম হবেন। প্রোগ্রাম্যাটিকভাবে স্ট্যাটাস বারের উচ্চতা নির্ধারণ করা কি সম্ভব?

উত্তর:


506

[UIApplication sharedApplication].statusBarFrame.size.height। তবে যেহেতু সমস্ত মাপ পয়েন্টগুলিতে নয়, পিক্সেলে নয়, স্ট্যাটাস বারের উচ্চতা সর্বদা 20 এর সমান।

হালনাগাদ. এই উত্তরটি সহায়ক হিসাবে বিবেচিত হচ্ছে দেখে আমার আরও বিস্তৃত হওয়া উচিত।

স্থিতি দণ্ডের উচ্চতা, প্রকৃতপক্ষে, নিম্নলিখিত কেসগুলি ব্যতীত 20.0f পয়েন্টের সমান :

  • স্ট্যাটাস বারটি setStatusBarHidden:withAnimation:মেথডের সাথে লুকানো হয়েছে এবং এর উচ্চতা 0.0f পয়েন্টের সমান;
  • যেমন অ্যান্টন এখানে উল্লেখ করেছে, ফোন অ্যাপ্লিকেশনের বাইরের ইনকামিং কলের সময় বা সাউন্ড রেকর্ডিং সেশন স্ট্যাটাস বারের উচ্চতা 40.0f পয়েন্ট সমান।

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

আপডেট 2. ব্যবহারকারী ইন্টারফেস ওরিয়েন্টেশনের ক্ষেত্রেও রয়েছে case স্থিতি দণ্ড ওরিয়েন্টেশন মানকে সম্মান করে না, সুতরাং প্রতিকৃতি মোডের জন্য স্থিতি দণ্ডের উচ্চতার মান হ'ল [UIApplication sharedApplication].statusBarFrame.size.height(হ্যাঁ, ডিফল্ট ওরিয়েন্টেশন সর্বদা প্রতিকৃতি হয়, আপনার অ্যাপ্লিকেশন তথ্য.প্লেস্ট যাই বলুক না কেন), ল্যান্ডস্কেপের জন্য - [UIApplication sharedApplication].statusBarFrame.size.width। বাইরের বাইরে UIViewControllerএবং self.interfaceOrientationউপলভ্য না হলে ইউআই এর বর্তমান ওরিয়েন্টেশন নির্ধারণ করতে , ব্যবহার করুন [UIApplication sharedApplication].statusBarOrientation

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

নেভিগেশন বার টাইল ব্যাকগ্রাউন্ডও স্ট্যাটাস বারে টাইলসযুক্ত


6
এই পদ্ধতিটি 1024 (আইওএস 7) দেয়
মার্ক

1
@ মার্কমসবি, আমার আপডেট দেখুন। এই সমস্যাটি মনে রেখেছিল - আপনাকে ধন্যবাদ।
কিআর ডুনেনকফ

2
হ্যাঁ, মার্ক আইওএস 7-তে নির্দেশিত হিসাবে এটি কখনও কখনও 1024 এবং কখনও কখনও 20 টি হয়। সুতরাং এটি আর উচ্চতা নির্ধারণের বোকা প্রমাণ উপায় way আমি সন্দেহ করি এটি আইওএস on এ স্ট্যাটাস বারের স্বচ্ছ প্রকৃতির কারণে It এটি এমনটি হতে পারে যে এটি প্রথমে পুরো পর্দায় যায় এবং তারপরে নিজেকে পুনরায় আকার দেয়। সুতরাং আপনি যদি এই স্থানান্তরের সময় অ্যাপ্লিকেশন অনুসন্ধান করে তবে আপনি ভুল মান পেতে পারেন। বিলম্বের সাথে এই পদ্ধতিটি কল করা আইওএস 7-এ সহায়তা করতে পারে
দীপক জিএম

1
এমন একটি ক্ষেত্রে রয়েছে যেখানে স্ট্যাটাস বারের উচ্চতা শূন্য হতে পারে। যদি সমর্থিতআইন্টারফেস ওরিয়েন্টেশন () ইউআইআইএনটারফেস ওরিয়েন্টেশনমাস্কের পরিবর্তে ইউআইআইন্টারফেস ওরিয়েন্টেশন (ভুল ফলাফল তবে সংকলক ত্রুটি নেই) প্রদান করে এবং একটি ভিউকন্ট্রোলার উপস্থাপন ও বরখাস্ত করা হয়, তবে স্ট্যাটাস বারের উচ্চতা শূন্য হয়ে যাবে।
সিম্রিক

5
এছাড়াও আইফোন এক্স-এ স্ট্যাটাস বারটি বেশি হবে।
প্রাক

98

প্রশ্নটিতে মার্টিনের পরামর্শ নিয়ে যান : আইফোন স্ট্যাটাস বার উচ্চতা পান

CGFloat AACStatusBarHeight()
{
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
    return MIN(statusBarSize.width, statusBarSize.height);
}

এবং সুইফটে

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}

এটি হ্যাকের মতো মনে হচ্ছে তবে এটি আসলে বেশ শক্ত। যাইহোক, এটিই একমাত্র কার্যকরী সমাধান।

পুরানো উত্তর

নিম্নলিখিত কোডটি, যা আপনার কাস্টম সাবক্লাসে যাবে UIViewController, প্রায় ল্যান্ডস্কেপ সমর্থন করার জন্য কাজ করেছিল। তবে, আমি একটি কোণার কেসটি লক্ষ্য করেছি (যখন ডান> অসমর্থিত উল্টে-ডাউন> বাম দিকে ঘোরার সময়) যার জন্য এটি কাজ করে না (উচ্চতা এবং প্রস্থ স্যুইচ করা হয়েছে)।

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);

এটি সঠিক নয়। আপনি যখন ডিভাইসটি ঘোরান তখন স্থিতি বারের উচ্চতা পরিবর্তন হয় না। প্রস্থটি হবে, তবে উপরের কোডটি এটি প্রদর্শন করে না, এটিই মূল প্রশ্ন ছিল না।
lehn0058

1
আপনি ঠিক বলেছেন যে "আপনি যখন ডিভাইসটি ঘোরান তখন স্ট্যাটাস বারের উচ্চতা পরিবর্তন হয় না।" তবে, যেমন অ্যাশ উত্তর দিয়েছে , "ল্যান্ডস্কেপ মোডে, আপনি দেখতে পাবেন যে প্রস্থ এবং উচ্চতা অদলবদল হয়েছে" " উপরের কোডটি অ্যাকাউন্টে গ্রহণ করে।
ma11 শেই 28

এটি একটি আকর্ষণীয় বিষয় যা আমি এখনও দেখছি। এটি অ্যাপলের পক্ষে আমার কাছে একটি বাগের মতো দেখাচ্ছে তবে এখনও তার জন্য অ্যাকাউন্টিং করা দরকার।
lehn0058

2
@ lehn0058 এটি কোনও বাগ নয়, অ্যাপল কীভাবে অভ্যন্তরীণভাবে বারটি পরিচালনা করে। এটি একটি উইন্ডোতে সংযুক্ত এবং সেই উইন্ডোটি ট্রান্সফর্ম ব্যবহার করে ঘোরানো হয়। statusBarFrameরুপান্তর আগে মান হিসাবে ফিরিয়ে দেওয়া হয়।
লিও নাটান

1
এটি সম্পত্তি হিসাবে আরও ভাল দেখাচ্ছে: ডিvar statusBarHeight: CGFloat
পাবলো এ

23

এটা চেষ্টা কর:

CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

1
বিভিন্ন স্থানে ফিরে আসা উচ্চতা আলাদা different এটি আজব
tila gilaani

1
হ্যাঁ, যদি রোটেশন ল্যান্ডস্কেপ হয় - [[ইউআইএএপ্লিকেশন শেয়ারড অ্যাপ্লিকেশন] স্ট্যাটাস বারফ্রেম]। সাইজ.হাইট এবং [[ইউআইএপ্লিকেশন শেয়ারড অ্যাপ্লিকেশন] স্ট্যাটাসবারফ্রেম]। সাইজ.উইথ মানগুলি পরিবর্তন করা হয়।
গুন্টিস ট্রুলেন্ডস


10

স্থিতি দণ্ডটি সাধারণত 20pt লম্বা থাকে তবে কিছু পরিস্থিতিতে এটি দ্বিগুণ হতে পারে:

  • আপনি যখন কোনও ফোনের মধ্যবর্তী স্থানে থাকেন (এটি একটি দুর্দান্ত সাধারণ দৃশ্য);
  • যখন ভয়েস রেকর্ডার, বা স্কাইপ বা একটি অনুরূপ অ্যাপ্লিকেশন, পটভূমিতে মাইক্রোফোন ব্যবহার করছে;
  • যখন ব্যক্তিগত হটস্পট সক্রিয় করা হয়;

এটি চেষ্টা করুন, এবং আপনি নিজের জন্য দেখতে পাবেন। উচ্চতায় 20pt পর্যন্ত হার্ডকোডিং সাধারণত কাজ করবে, যতক্ষণ না এটি না হয়।

সুতরাং আমি দ্বিতীয় H2CO3 এর উত্তর:

statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

10

আপনার ভিউ সামগ্রীর শীর্ষস্থানটি কোথায় রাখবেন এই iOS 11 টি উপায় সম্পাদনা করুন হ'ল ইউআইভিউ'র safeAreaLayoutGuideদেখুন ইউআইভিউ ডকুমেন্টেশন

পূর্বনির্ধারিত উত্তর আপনি যদি আইওএস 7+ টার্গেট করে থাকেন তবে ইউআইভিউকন্ট্রোলারের জন্য ডকুমেন্টেশন পরামর্শ দেয় যে ভিউকন্ট্রোলারের topLayoutGuideসম্পত্তি আপনাকে স্থিতি বারের নীচে বা ন্যাভিগেশন বারের নীচেও যদি তা দৃশ্যমান হয় তবে তা দেয়। এটি কার্যকর হতে পারে এবং এটি অবশ্যই পূর্ববর্তী অনেকগুলি সমাধানের চেয়ে কম হ্যাক।


5

ভুলে যাবেন না যে স্ট্যাটাস বারের ফ্রেমটি স্ক্রিনের স্থানাঙ্ক স্থানে থাকবে! আপনি যদি ল্যান্ডস্কেপ মোডে চালু করেন তবে আপনি দেখতে পাবেন যে প্রস্থ এবং উচ্চতা অদলবদল হয়েছে। আমি দৃ strongly়ভাবে প্রস্তাব দিচ্ছি যে আপনি যদি ল্যান্ডস্কেপ অভিযোজন সমর্থন করেন তবে পরিবর্তে কোডের এই সংস্করণটি ব্যবহার করুন:

CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];

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

ঘটনাচক্রে, ফোন কল করার সময় কেবলমাত্র স্ট্যাটাস বারটি লম্বা হতে পারে না, যদি স্থিতি বারটি ইচ্ছাকৃতভাবে লুকানো থাকে তবে এটি শূন্য হতে পারে।


এটি আমাকে সঠিক উচ্চতা দেয় নি। : কিন্তু, আমি অন্যভাবে যে আমার জন্য কাজ পাওয়া stackoverflow.com/a/16598350/242933
ma11hew28

হ্যাঁ এটি এখন বেশ পুরানো কোড তাই সম্ভবত কোনও বৈধ উত্তর নেই। স্বতঃ লেআউটকে ধন্যবাদ ব্যক্তিগতভাবে আমার আর স্ট্যাটাস বারের উচ্চতা যাচাই করার দরকার নেই।
অ্যাশ

2

স্ক্রিনের স্ট্যাটাস বারের উচ্চতা পাওয়ার জন্য একটি সুইফ্ট উপায়:

var screenStatusBarHeight: CGFloat {
    return UIApplication.sharedApplication().statusBarFrame.height
}

এগুলি আমার একটি প্রকল্পের একটি স্ট্যান্ডার্ড ফাংশন হিসাবে অন্তর্ভুক্ত করা হয়েছে: https://github.com/goktugyil/EZSwiftExtensions


2

আইওএস 13 এর জন্য আপনি ব্যবহার করতে পারেন:

UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height

1
    var statusHeight: CGFloat!
    if #available(iOS 13.0, *) {
         statusHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
    } else {
        // Fallback on earlier versions
        statusHeight = UIApplication.shared.statusBarFrame.height
    }


0

আমি সবেমাত্র একটি উপায় খুঁজে পেয়েছি যা আপনাকে সরাসরি স্ট্যাটাস বারের উচ্চতায় অ্যাক্সেস করতে দেয় না, তবে এটি গণনা করে।

নেভিগেশন বারের উচ্চতা - শীর্ষলয়েটগুইড দৈর্ঘ্য = স্থিতি বারের উচ্চতা

সুইফট:

let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height

self.topLayoutGuide.lengthহ'ল শীর্ষ অঞ্চল যা ট্রান্সলুসেন্ট বার দ্বারা আচ্ছাদিত এবং self.navigationController?.navigationBar.frame.heightএটি স্ট্যাটাস বার ব্যতীত ট্রান্সলসেন্ট বার যা সাধারণত ৪৪pt হয়। সুতরাং এই পদ্ধতিটি ব্যবহার করে আপনি ফোন কলগুলির কারণে স্থিতি বারের উচ্চতা পরিবর্তনের বিষয়ে চিন্তা না করেই সহজেই স্ট্যাটাস বারের উচ্চতা গণনা করতে পারেন।


এটি কাজ করে না, self.topLayoutGuide.length0 হয় ফলে ফলাফলটি -44 হয়ে যায়।
নাম্বাটি

@ নাম্বেটে আমি বিশ্বাস করি এটি আর কাজ করে না কারণ আমি আইওএস 11 অ্যাপল নিরাপদআরআইএনসেট ব্যবহার করে
হেনরি


-6

নিম্নলিখিত একক লাইন কোড ব্যবহার করে আপনি যে কোনও স্থিতিতে স্ট্যাটাস বারের উচ্চতা পেতে পারেন এবং তা দৃশ্যমান কিনা তাও নয়

#define STATUS_BAR_HIGHT (
    [UIApplicationsharedApplication].statusBarHidden ? 0 : (
        [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
            [UIApplicationsharedApplication].statusBarFrame.size.width :
            [UIApplicationsharedApplication].statusBarFrame.size.height
    )
)

এটি কেবল একটি সাধারণ তবে খুব দরকারী ম্যাক্রো কেবল এটি ব্যবহার করে আপনার কোনও অতিরিক্ত কোড লেখার দরকার নেই

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