নিরাপদ অঞ্চল ইনসেট শীর্ষ এবং নীচের উচ্চতা পান


178

নতুন আইফোন এক্স-তে, অনিরাপদ অঞ্চলগুলির জন্য শীর্ষ এবং নীচের উভয় উচ্চতা পাওয়ার সবচেয়ে উপযুক্ত উপায় কী হবে?

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

উত্তর:


365

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

ইন উদ্দেশ্য সি

if (@available(iOS 11.0, *)) {
    UIWindow *window = UIApplication.sharedApplication.keyWindow;
    CGFloat topPadding = window.safeAreaInsets.top;
    CGFloat bottomPadding = window.safeAreaInsets.bottom;
}

ইন সুইফট

if #available(iOS 11.0, *) {
    let window = UIApplication.shared.keyWindow
    let topPadding = window?.safeAreaInsets.top
    let bottomPadding = window?.safeAreaInsets.bottom
}

1
@ কৃষিকাসোনওয়ালা নীচে পেডিং +10 (আপনার মান)
ব্যবহারকারী 6788419

12
এটি আমার পক্ষে কাজ করে না বলে মনে হচ্ছে - UIApplication.shared.keyWindow এর মান মুদ্রণ করে?? SAFAreaInsets সমস্ত 0 গুলি ফেরত দেয়। কোন ধারনা?
হাই

2
আমি করেছি, আমি যে কোনও দৃশ্যের SafeAreaLayoutGuides এর বিরুদ্ধে বাধা দিতে পারি তবে কী উইন্ডোটির SafeAreaInsets এর মানটি সরাসরি মুদ্রণ করে কেবল একটি শূন্য রেক্ট দেয়। এটি সমস্যাযুক্ত কারণ আমাকে কী উইন্ডোতে যুক্ত করা হয়েছে তবে মূল ভিউ নিয়ন্ত্রকের দর্শন শ্রেণিবদ্ধ নয় এমন একটি দৃশ্য নিজেই সীমাবদ্ধ করতে হবে।
হাই

6
আমার জন্য, keyWindowসর্বদা nilতাই আমি এটিকে পরিবর্তন করে theচ্ছিক শৃঙ্খলা থেকে windows[0]বাদ দিয়েছিলাম ?, তারপরে এটি কার্যকর হয়েছিল।
জর্জি_ ই

2
এটি তখনই কাজ করছে যখন কোনও নিয়ামকের দৃষ্টিভঙ্গি ইতিমধ্যে উপস্থিত হয়।
ভানিয়া

84

লেআউট গাইডের মধ্যে উচ্চতা পেতে আপনি কেবল করেন

let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height

সুতরাং full frame height = 812.0,safe area height = 734.0

নীচে সবুজ দৃশ্যের ফ্রেমের উদাহরণ রয়েছে is guide.layoutFrame

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


ধন্যবাদ যে নেতৃত্ব আমি সম্পর্কেও ভাবছিলাম। আমি মনে করি না এর চেয়ে আরও নির্ভরযোগ্য সমাধান আছে। তবে এর সাথে আমি কেবল সম্পূর্ণ অনিরাপদ উচ্চতা পাচ্ছি, তাই না? প্রতিটি অঞ্চলের জন্য দুটি উচ্চতা না?
Tulleb

2
একবার মতামতগুলি স্থির হয়ে গেলে এটি আপনাকে সঠিক উত্তর দেবে
লাদিস্লাভ

2
প্রকৃতপক্ষে @ ব্যবহারকারী6788419 এর উত্তর খুব সুন্দর এবং উপায় সংক্ষিপ্ত দেখাচ্ছে।
Tulleb

একটি নিয়ামকের ভিউ ব্যবহার করে আমি সেই কোডটি দিয়ে 812.0 এর উচ্চতা পাচ্ছি। সুতরাং আমি ব্যবহার করছি UIApplication.sharedApplication.keyWindow.safeAreaLayoutGuide.layoutFrame, যা নিরাপদ ফ্রেম আছে।
ফেরান মেলিনচ

1
@ ফেরানমেলিনচ আপনি নিশ্চিত করেছেন যে আপনি উচ্চতাটি কোথায় পরীক্ষা করছেন, তবে আমার কাছেও 812 ছিল, যা ভিউটি দৃশ্যমান হওয়ার আগে মানটি পরীক্ষা করার কারণে দেখা গেছে। সেক্ষেত্রে উচ্চতাগুলি একই হবে "যদি ভিউটি বর্তমানে কোনও ভিউয়ের ক্রমবিন্যাসে ইনস্টল না করা থাকে বা এখনও অনস্ক্রিনে দৃশ্যমান না হয় তবে লেআউট গাইডের किनারাগুলি" বিকাশকারী /
নিকোলাস

81

সুইফট 4, 5

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

এই কোনও ভিউ নিয়ন্ত্রকের মধ্যে প্লাগ ইন:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let topSafeArea: CGFloat
    let bottomSafeArea: CGFloat

    if #available(iOS 11.0, *) {
        topSafeArea = view.safeAreaInsets.top
        bottomSafeArea = view.safeAreaInsets.bottom
    } else {
        topSafeArea = topLayoutGuide.length
        bottomSafeArea = bottomLayoutGuide.length
    }

    // safe area values are now available to use
}

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

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

anyLifecycleMethod()
    guard let root = UIApplication.shared.keyWindow?.rootViewController else {
        return
    }
    let topSafeArea: CGFloat
    let bottomSafeArea: CGFloat

    if #available(iOS 11.0, *) {
        topSafeArea = root.view.safeAreaInsets.top
        bottomSafeArea = root.view.safeAreaInsets.bottom
    } else {
        topSafeArea = root.topLayoutGuide.length
        bottomSafeArea = root.bottomLayoutGuide.length
    }

    // safe area values are now available to use
}

3
দয়া করে টপ সেফিয়ারিয়া ব্যবহার করে ঘোষণা করুন: পরিবর্তে সিজিফ্লোট!
গুসুতাফু

ব্যবহার এড়িয়ে viewDidLayoutSubviews(একাধিক বার বলা যেতে পারে), এখানে সমাধান যা এমনকি কাজ করবে viewDidLoad: stackoverflow.com/a/53864017/7767664
user924

@ ব্যবহারকারী924 এরপরে মানগুলি আপডেট করা হবে না যখন নিরাপদ অঞ্চলগুলি পরিবর্তিত হবে (যেমন ডাবল-উচ্চতার স্থিতি দণ্ড)
বিসড

@bsod তারপর এই ভাল হবে stackoverflow.com/a/3420550/7767664 (কারণ এটি শুধুমাত্র স্ট্যাটাস বার এবং অন্যান্য দর্শনে জন্য)
user924

অথবা অ্যাপের প্রতিনিধিটির মধ্য দিয়ে যাবার পরিবর্তে আপনি কেবলমাত্র ভিউ কন্ট্রোলারে অন্তর্নির্মিত নিরাপদ অঞ্চল API অ্যাপল ব্যবহার করতে পারেন।
বিসড

21

এখানে অন্য কোনও উত্তর আমার পক্ষে কাজ করেনি, তবে এটি করেছে।

var topSafeAreaHeight: CGFloat = 0
var bottomSafeAreaHeight: CGFloat = 0

  if #available(iOS 11.0, *) {
    let window = UIApplication.shared.windows[0]
    let safeFrame = window.safeAreaLayoutGuide.layoutFrame
    topSafeAreaHeight = safeFrame.minY
    bottomSafeAreaHeight = window.frame.maxY - safeFrame.maxY
  }

1
আপনার কোড দর্শন নিয়ন্ত্রক জীবনচক্রের যে কোনও অংশে কাজ করবে। আপনি যদি view.safeAreaInsets.top ব্যবহার করতে চান, তবে আপনাকে অবশ্যই ভিডডিয়ার পরে বা তার পরে ফোন করেছে তা নিশ্চিত করতে হবে। ভিউডিডলয়েডে, আপনি সঠিক মান সহ ভিউ.সেজএফেরিয়াআইনসেটস.টপ পাবেন না কারণ এটি এখনও আরম্ভ করা হয়নি।
ব্যবহারকারী3204765

1
এখনও
অবধি

17

এখানে সমস্ত উত্তর সহায়ক, যারা সহায়তা দিয়েছেন তাদের প্রত্যেককে ধন্যবাদ।

তবে আমি যেমন দেখতে পেয়েছি যে নিরাপদ অঞ্চল বিষয়টি কিছুটা বিভ্রান্ত হয়েছে যা ভালভাবে নথিভুক্ত হবে না বলে মনে হয়।

সুতরাং আমি এখানে এটি যতটা সম্ভব মুশির সংক্ষিপ্তসার করব যাতে এটি সহজেই বোঝা যায় safeAreaInsets, safeAreaLayoutGuideএবং LayoutGuide

আইওএস In-এ , অ্যাপল এতে topLayoutGuideএবং bottomLayoutGuideবৈশিষ্ট্যগুলি প্রবর্তন করেছিল UIViewController, তারা আপনাকে আপনার সামগ্রীগুলি স্ট্যাটাস, নেভিগেশন বা ট্যাব বারের মতো ইউআইকিট বার দ্বারা আড়াল করা থেকে দূরে রাখতে বাধা তৈরি করার অনুমতি দেয়, এই লেআউট গাইডগুলির বিষয়বস্তুতে সীমাবদ্ধতা নির্দিষ্ট করে দেওয়া সম্ভব ছিল, এড়িয়ে চলা শীর্ষ বা নীচের নেভিগেশন উপাদানগুলি (UIKit বার, স্ট্যাটাস বার, ন্যাভ বা ট্যাব বার…) দ্বারা আড়াল করা।

সুতরাং উদাহরণস্বরূপ, আপনি যদি কোনও টেবিলভিউ তৈরি করতে চান তবে শীর্ষ স্ক্রিন থেকে শুরু করে আপনি এরকম কিছু করেছেন:

self.tableView.contentInset = UIEdgeInsets(top: -self.topLayoutGuide.length, left: 0, bottom: 0, right: 0)

আইওএস 11-এ অ্যাপল এই বৈশিষ্ট্যগুলিকে একক নিরাপদ অঞ্চল বিন্যাস গাইডের সাথে প্রতিস্থাপন করে তাদের হ্রাস করেছে

অ্যাপল অনুসারে নিরাপদ অঞ্চল

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

নীচে, আইফোন 8 এবং আইফোন এক্স-সিরিজে হাইলাইট করা একটি নিরাপদ অঞ্চল:

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

এর safeAreaLayoutGuideএকটি সম্পত্তিUIView

উচ্চতা পেতে safeAreaLayoutGuide:

extension UIView {
   var safeAreaHeight: CGFloat {
       if #available(iOS 11, *) {
        return safeAreaLayoutGuide.layoutFrame.size.height
       }
       return bounds.height
  }
}

এটি আপনার ছবিতে তীরের উচ্চতা ফিরিয়ে দেবে।

এখন, শীর্ষ "খাঁজ" এবং নীচে হোম স্ক্রিন সূচক উচ্চতা সম্পর্কে কী হবে?

এখানে আমরা ব্যবহার করব safeAreaInsets

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

নিম্নলিখিতটি অনিরাপদ অঞ্চল এবং আইফোন 8 এবং আইফোন এক্স-সিরিজের একটিতে প্রান্তগুলি থেকে দুরত্ব প্রদর্শন করবে।

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

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

এখন, যদি নেভিগেশন বার যুক্ত হয়

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

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

সুতরাং, এখন কিভাবে নিরাপদ অঞ্চল উচ্চতা পেতে? আমরা ব্যবহার করবsafeAreaInset

সমাধানগুলির এখানে রয়েছে তবে তারা একটি গুরুত্বপূর্ণ বিষয়ে পৃথক,

প্রথমটি:

self.view.safeAreaInsets

এটি এজঞ্জিটগুলি ফিরিয়ে দেবে, আপনি এখন ইনসেটগুলি জানতে শীর্ষে এবং নীচে অ্যাক্সেস করতে পারবেন,

দ্বিতীয়টি:

UIApplication.shared.windows.first{$0.isKeyWindow }?.safeAreaInsets

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


5

আইওএস 11 এ একটি পদ্ধতি রয়েছে যা জানায় যে কখন নিরাপদআরিয়া পরিবর্তন হয়েছে।

override func viewSafeAreaInsetsDidChange() {
    super.viewSafeAreaInsetsDidChange()
    let top = view.safeAreaInsets.top
    let bottom = view.safeAreaInsets.bottom
}

2

আমি CocoaPods অবকাঠামো ও মামলা কাজ করছি UIApplication.sharedহয় অনুপলব্ধ তারপর আমি ব্যবহার safeAreaInsetsদৃশ্য এর window:

if #available(iOS 11.0, *) {
    let insets = view.window?.safeAreaInsets
    let top = insets.top
    let bottom = insets.bottom
}

2

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

তারপরে স্ক্রিনশটে লাল তীরের উচ্চতা পেতে এটি:

self.safeAreaLayoutGuide.layoutFrame.size.height

2

সুইফ্ট 5, এক্সকোড 11.4

`UIApplication.shared.keyWindow` 

এটি অবমূল্যায়নের সতর্কতা দেবে। আইওএস ১৩.০-তে '' কী উইন্ডো 'অবহেলা করা হয়েছিল: সংযুক্ত দৃশ্যের কারণে এটি সমস্ত সংযুক্ত দৃশ্যে একটি কী উইন্ডো ফেরত দেয়ায় একাধিক দৃশ্যের সমর্থনকারী অ্যাপ্লিকেশনগুলির জন্য ব্যবহার করা উচিত নয়। আমি এইভাবে ব্যবহার করি।

extension UIView {

    var safeAreaBottom: CGFloat {
         if #available(iOS 11, *) {
            if let window = UIApplication.shared.keyWindowInConnectedScenes {
                return window.safeAreaInsets.bottom
            }
         }
         return 0
    }

    var safeAreaTop: CGFloat {
         if #available(iOS 11, *) {
            if let window = UIApplication.shared.keyWindowInConnectedScenes {
                return window.safeAreaInsets.top
            }
         }
         return 0
    }
}

extension UIApplication {
    var keyWindowInConnectedScenes: UIWindow? {
        return windows.first(where: { $0.isKeyWindow })
    }
}

1

উদ্দেশ্য-সি কী উইন্ডো শূন্যের সমান হলে সমস্যা ছিল । উপরের কোডটি কেবলমাত্র ভিডিডি অ্যাপায়ারে রাখুন ( ভিউডিডলডে নয়)


1
UIWindow *window = [[[UIApplication sharedApplication] delegate] window]; 
CGFloat fBottomPadding = window.safeAreaInsets.bottom;

1

সুইফট 5 এক্সটেনশন

এটি এক্সটেনশন হিসাবে ব্যবহার করা যেতে পারে এবং এর সাথে কল করা যেতে পারে: UIApplication.topSafeAreaHeight

extension UIApplication {
    static var topSafeAreaHeight: CGFloat {
        var topSafeAreaHeight: CGFloat = 0
         if #available(iOS 11.0, *) {
               let window = UIApplication.shared.windows[0]
               let safeFrame = window.safeAreaLayoutGuide.layoutFrame
               topSafeAreaHeight = safeFrame.minY
             }
        return topSafeAreaHeight
    }
}

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


0

আরও বৃত্তাকার পদ্ধতির

  import SnapKit

  let containerView = UIView()
  containerView.backgroundColor = .red
  self.view.addSubview(containerView)
  containerView.snp.remakeConstraints { (make) -> Void in
        make.width.top.equalToSuperView()
        make.top.equalTo(self.view.safeArea.top)
        make.bottom.equalTo(self.view.safeArea.bottom)
  }




extension UIView {
    var safeArea: ConstraintBasicAttributesDSL {
        if #available(iOS 11.0, *) {
            return self.safeAreaLayoutGuide.snp
        }
        return self.snp
    }


    var isIphoneX: Bool {

        if #available(iOS 11.0, *) {
            if topSafeAreaInset > CGFloat(0) {
                return true
            } else {
                return false
            }
        } else {
            return false
        }

    }

    var topSafeAreaInset: CGFloat {
        let window = UIApplication.shared.keyWindow
        var topPadding: CGFloat = 0
        if #available(iOS 11.0, *) {
            topPadding = window?.safeAreaInsets.top ?? 0
        }

        return topPadding
    }

    var bottomSafeAreaInset: CGFloat {
        let window = UIApplication.shared.keyWindow
        var bottomPadding: CGFloat = 0
        if #available(iOS 11.0, *) {
            bottomPadding = window?.safeAreaInsets.bottom ?? 0
        }

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