উত্তর:
এটা চেষ্টা কর :
ইন উদ্দেশ্য সি
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
}
keyWindow
সর্বদা nil
তাই আমি এটিকে পরিবর্তন করে theচ্ছিক শৃঙ্খলা থেকে windows[0]
বাদ দিয়েছিলাম ?
, তারপরে এটি কার্যকর হয়েছিল।
লেআউট গাইডের মধ্যে উচ্চতা পেতে আপনি কেবল করেন
let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height
সুতরাং full frame height = 812.0
,safe area height = 734.0
নীচে সবুজ দৃশ্যের ফ্রেমের উদাহরণ রয়েছে is guide.layoutFrame
UIApplication.sharedApplication.keyWindow.safeAreaLayoutGuide.layoutFrame
, যা নিরাপদ ফ্রেম আছে।
সুইফট 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
}
viewDidLayoutSubviews
(একাধিক বার বলা যেতে পারে), এখানে সমাধান যা এমনকি কাজ করবে viewDidLoad
: stackoverflow.com/a/53864017/7767664
এখানে অন্য কোনও উত্তর আমার পক্ষে কাজ করেনি, তবে এটি করেছে।
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
}
এখানে সমস্ত উত্তর সহায়ক, যারা সহায়তা দিয়েছেন তাদের প্রত্যেককে ধন্যবাদ।
তবে আমি যেমন দেখতে পেয়েছি যে নিরাপদ অঞ্চল বিষয়টি কিছুটা বিভ্রান্ত হয়েছে যা ভালভাবে নথিভুক্ত হবে না বলে মনে হয়।
সুতরাং আমি এখানে এটি যতটা সম্ভব মুশির সংক্ষিপ্তসার করব যাতে এটি সহজেই বোঝা যায় 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
প্রথমটি আপনি দেখছেন কীটপতঙ্গ গ্রহণ করছেন, সুতরাং যদি কোনও নেভিগেশন বার থাকে তবে এটি বিবেচনা করা হবে, তবে দ্বিতীয়টি আপনি উইন্ডোর নিরাপদআরআইএনসেটগুলিতে অ্যাক্সেস করছেন তাই নেভিগেশন বার বিবেচনা করা হবে না
SafeAreaLayoutGuide দৃশ্যটি অনস্ক্রিনে দৃশ্যমান হলে, এই গাইড দর্শনটির সেই অংশটি প্রতিবিম্বিত করে যা নেভিগেশন বার, ট্যাব বার, টুলবার এবং অন্যান্য পূর্বপুরুষের দর্শন দ্বারা আবৃত নয়। (টিভিএস-এ, সুরক্ষিত অঞ্চলটি সেই চিত্রটি প্রতিফলিত করে যা স্ক্রিনের বেজেলকে আচ্ছাদন করে না)) যদি দৃশ্যটি বর্তমানে কোনও ভিউ হায়ারার্কিতে ইনস্টল না করা থাকে বা এখনও অনস্ক্রিনে দৃশ্যমান না হয় তবে বিন্যাসের গাইড প্রান্তটি ভিউটির প্রান্তের সমান।
তারপরে স্ক্রিনশটে লাল তীরের উচ্চতা পেতে এটি:
self.safeAreaLayoutGuide.layoutFrame.size.height
সুইফ্ট 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 })
}
}
উদ্দেশ্য-সি কী উইন্ডো শূন্যের সমান হলে সমস্যা ছিল । উপরের কোডটি কেবলমাত্র ভিডিডি অ্যাপায়ারে রাখুন ( ভিউডিডলডে নয়)
সুইফট 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চ্ছিক, ইউআইভিউ বা যা পছন্দসই পছন্দসই একটি এক্সটেনশন হতে পারে, বা সম্ভবত আরও ভাল কোনও বিশ্বব্যাপী ফাংশন।
আরও বৃত্তাকার পদ্ধতির
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
}
}