আমি কীভাবে নিরাপদ অঞ্চল লেআউটটিকে প্রোগ্রামটি ব্যবহার করব?


104

যেহেতু আমি আমার মতামত তৈরি করতে স্টোরিবোর্ড ব্যবহার করি না, তাই আমি ভাবছিলাম যে প্রোগ্রামটিমেটিকভাবে "সেফ এরিয়া গাইড ব্যবহার করুন" বিকল্পটি আছে বা এর মতো কিছু আছে কিনা I

আমি আমার মতামত নোঙ্গর করার চেষ্টা করেছি

view.safeAreaLayoutGuide

তবে তারা আইফোন এক্স সিমুলেটারে শীর্ষ খাঁজকে ওভারল্যাপ করে চলেছে।


4
এ অনুযায়ী কোনও ডকুমেন্টেড
বুল

কীভাবে view.safeAreaInsets? আপনি কি এই চেষ্টা করেছেন?
কার্তিকেইকন বোস

@ কার্তিকেইয়ান বোস হ্যাঁ আমি দুর্ভাগ্যক্রমে ভাগ্য নিয়েছিলাম না।
ফিলিপ

আমার জন্য কাজ কর. কোডটি দেখতে কেমন লাগে
ড্যানিয়েল স্প্রিঞ্জার

উত্তর:


160

এখানে নমুনা কোড রয়েছে (এর থেকে রেফার করুন : নিরাপদ অঞ্চল লেআউট গাইড ):
আপনি যদি কোডটিতে নিজের সীমাবদ্ধতা তৈরি করেন তবে প্রাসঙ্গিক লেআউট অ্যাঙ্কারগুলি পেতে ইউআইভিউ-র নিরাপদআরএলআউটআউটগাইড ব্যবহার করুন use কোডটি উপরের ইন্টারফেস বিল্ডারের উদাহরণটি আবার কেমন তা দেখতে এটি আবার তৈরি করুন:

ধরে নিচ্ছি আমাদের ভিউ কন্ট্রোলারে একটি সম্পত্তি হিসাবে আমাদের সবুজ ভিউ রয়েছে:

private let greenView = UIView()

ভিউডিডলড থেকে কল করা মতামত এবং সীমাবদ্ধতাগুলি সেট করার জন্য আমাদের একটি ফাংশন থাকতে পারে:

private func setupView() {
  greenView.translatesAutoresizingMaskIntoConstraints = false
  greenView.backgroundColor = .green
  view.addSubview(greenView)
}

মূল দর্শনটির লেআউটমার্জিনস গুইড ব্যবহার করে সর্বদা অগ্রণী এবং পিছনের মার্জিন সীমাবদ্ধতা তৈরি করুন:

 let margins = view.layoutMarginsGuide
 NSLayoutConstraint.activate([
    greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
    greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
 ])

এখন, আপনি যদি আইওএস 11 এবং তারপরে টার্গেট না করেন তবে আপনার # টি উপলভ্য নিরাপদ অঞ্চল বিন্যাস গাইড সীমাবদ্ধ করতে হবে এবং পূর্ববর্তী আইওএস সংস্করণগুলির জন্য শীর্ষ এবং নীচে বিন্যাস গাইডগুলিতে ফিরে যেতে হবে:

if #available(iOS 11, *) {
  let guide = view.safeAreaLayoutGuide
  NSLayoutConstraint.activate([
   greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
   guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
   ])
} else {
   let standardSpacing: CGFloat = 8.0
   NSLayoutConstraint.activate([
   greenView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing),
   bottomLayoutGuide.topAnchor.constraint(equalTo: greenView.bottomAnchor, constant: standardSpacing)
   ])
}

ফলাফল:

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

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


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


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


4
উদ্দেশ্য-সিতেও এটি দেওয়া সম্ভব হবে? আমার যা প্রয়োজন ঠিক তা দেখে মনে হচ্ছে
টম হ্যামন্ড

6
@TomHammond এখানে উদ্দেশ্য সি রয়েছে তোমার জন্য stackoverflow.com/a/47076040/5638630
Krunal

4
@ জোনিলিজেম এখন আপনার জিজ্ঞাসা সম্পর্কে - স্যাফেরিয়াআলআউট হ'ল আইওএস নির্দিষ্ট কাঠামো (ডিভাইস আইফোনএক্স নির্দিষ্ট নয়), এটি আইওএস ১১-এ টপ-বটম লেআউট গাইডটি প্রতিস্থাপন করছে সুতরাং ডিভাইসের জন্য নয় আইওএসের জন্য আমাদের অবশ্যই শর্ত ব্যবহার / সেট করতে হবে। SafeAreaLayout সমস্ত ধরণের ডিভাইসের (আইফোন-এক্স এবং অন্যান্য) জন্য ডিজাইনের যত্ন নেয়। আপনার যদি এখনও কোনও প্রশ্ন / বিভ্রান্তি থাকে তবে আপনি আমাকে আরও বিশদ জানতে চাইতে পারেন।
ক্রুনাল

4
অসাধারণ. আপনাকে ধন্যবাদ :)
রাজামোহন এস

4
কেন এটি সঠিক উত্তর হিসাবে গ্রহণ করা হয়? আমি একটি কংক্রিট অবস্থান সেটআপ করার চেষ্টা করেছি - ফলাফলটি সম্পূর্ণ এলোমেলো - নিয়ন্ত্রণটি অবিশ্বাস্য অবস্থানে স্থাপন করা হয়!
ব্যচাস্লাভ গের্চিকভ

86

আমি আসলে এটির জন্য একটি এক্সটেনশন ব্যবহার করছি এবং এটি যদি আইওএস 11 হয় বা না হয় তবে তা নিয়ন্ত্রণ করে।

extension UIView {

  var safeTopAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.topAnchor
    }
    return self.topAnchor
  }

  var safeLeftAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *){
      return self.safeAreaLayoutGuide.leftAnchor
    }
    return self.leftAnchor
  }

  var safeRightAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *){
      return self.safeAreaLayoutGuide.rightAnchor
    }
    return self.rightAnchor
  }

  var safeBottomAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.bottomAnchor
    }
    return self.bottomAnchor
  }
}

এটি যাওয়ার সহজ উপায় এবং কৌশলটি করে। ধারণার জন্য ধন্যবাদ।
আল্পার_কে

4
এটি এটি করার একটি সহজ কিন্তু দুর্দান্ত উপায়! self.safeAreaLayoutGuideপরিবর্তে এর ব্যবহারটি নোট করুন self.layoutMarginsGuide। এই উত্তরে ব্যবহৃত নিরাপদটি আমার পক্ষে নিরাপদ অঞ্চলে থাকতে সঠিকভাবে কাজ করেছিল! আমি কেবল একটা বিষয় পরিবর্তন সুপারিশ করবে ব্যবহার করতে হবে leadingAnchorএবং trailingAnchorপরিবর্তে leftAnchorএবং rightAnchor। ব্রাভো!
প্রণয় সি

22

SafeAreaLayoutGuideহয় UIViewসম্পত্তি,

SafeAreaLayoutGuide শীর্ষে এই দৃশ্যের অরক্ষিত শীর্ষ প্রান্ত নির্দেশ করে (উদাহরণস্বরূপ, যদি উপস্থিত থাকে তবে স্ট্যাটাস বার বা নেভিগেশন বারের পিছনে নয়)। একইভাবে অন্যান্য প্রান্তের জন্য।

safeAreaLayoutGuideবৃত্তাকার কোণ, নেভিগেশন বার, ট্যাব বার, টুলবার এবং অন্যান্য পূর্বপুরুষের দর্শন থেকে আমাদের অবজেক্টগুলি ক্লিপিং / ওভারল্যাপিং এড়ানোর জন্য ব্যবহার করুন ।

আমরা safeAreaLayoutGuideযথাক্রমে অবজেক্ট এবং সেট অবজেক্ট সীমাবদ্ধতা তৈরি করতে পারি ।

প্রতিকৃতি + ল্যান্ডস্কেপ জন্য সীমাবদ্ধতা হ'ল -

প্রতিকৃতি চিত্র

ল্যান্ডস্কেপ চিত্র

        self.edgesForExtendedLayout = []//Optional our as per your view ladder

        let newView = UIView()
        newView.backgroundColor = .red
        self.view.addSubview(newView)
        newView.translatesAutoresizingMaskIntoConstraints = false
        if #available(iOS 11.0, *) {
            let guide = self.view.safeAreaLayoutGuide
            newView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
            newView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
            newView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
            newView.heightAnchor.constraint(equalToConstant: 100).isActive = true

        }
        else {
            NSLayoutConstraint(item: newView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: newView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: newView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true

            newView.heightAnchor.constraint(equalToConstant: 100).isActive = true
        }

ইউআইএলআউটগুইড

SafeAreaLayoutGuide


4
viewDidAppearআপনি কখনই জানেন না যে আপনি কখনই করছেন সেটআপ সীমাবদ্ধতাগুলি । viewDidAppearএকাধিকবার বলা হয় এবং তাই, প্রতিবার যখনই এটি বলা হয় তখন আপনার সীমাবদ্ধতাগুলি সদৃশ হবে।
ইয়েভেন ডাবিনিন

হ্যাঁ! , সম্পাদিত উত্তর, আপনি আপনার ব্যবহারের কেস হিসাবে ব্যবহার করতে পারেন।
জ্যাক

14

আপনার মতো যারা স্ন্যাপকিট ব্যবহার করেন , কেবল আমার মতোই সমাধানটি আপনার পছন্দগুলি সীমাবদ্ধতাগুলি নোঙ্গর করছে view.safeAreaLayoutGuide:

yourView.snp.makeConstraints { (make) in
    if #available(iOS 11.0, *) {
        //Bottom guide
        make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottomMargin)
        //Top guide
        make.top.equalTo(view.safeAreaLayoutGuide.snp.topMargin)
        //Leading guide
        make.leading.equalTo(view.safeAreaLayoutGuide.snp.leadingMargin)
        //Trailing guide
        make.trailing.equalTo(view.safeAreaLayoutGuide.snp.trailingMargin)

     } else {
        make.edges.equalToSuperview()
     }
}

4
দুর্দান্ত উত্তর। এটিকে কিছুটা আরও কমপ্যাক্ট করতে আপনি বলতে পারেন: # উপলভ্য থাকলে (আইওএস 11.0, *) {make.edges.equalTo (দেখুন.safeAreaLayoutGuide.snp.margins)}
ডন মিগুয়েল

7

আমি লেআউটমার্গিনসগাইডে শীর্ষস্থানীয় এবং চলমান মার্জিন সীমাবদ্ধতার পরিবর্তে এটি ব্যবহার করছি:

UILayoutGuide *safe = self.view.safeAreaLayoutGuide;
yourView.translatesAutoresizingMaskIntoConstraints = NO;
[NSLayoutConstraint activateConstraints:@[
                                           [safe.trailingAnchor constraintEqualToAnchor:yourView.trailingAnchor],
                                           [yourView.leadingAnchor constraintEqualToAnchor:safe.leadingAnchor],
                                           [yourView.topAnchor constraintEqualToAnchor:safe.topAnchor],
                                           [safe.bottomAnchor constraintEqualToAnchor:yourView.bottomAnchor]
                                          ]];

দয়া করে ক্রুনালের উত্তর থেকে আইওএস 11 এর নিম্ন সংস্করণের বিকল্পটিও দেখুন।


আপনি ইতিমধ্যে আপনার ভিউকে সুপারভিউতে যুক্ত করেছেন তা নিশ্চিত করুন। এটি একটি সহজ উদাহরণ হিসাবে আমার কোড এ স্ব। ভিউ।
টনি TRAN

6

ব্যবহারের UIWindowবা UIViewএরsafeAreaInsets .bottom .top .left .right

// #available(iOS 11.0, *)
// height - UIApplication.shared.keyWindow!.safeAreaInsets.bottom

// On iPhoneX
// UIApplication.shared.keyWindow!.safeAreaInsets.top =  44
// UIApplication.shared.keyWindow!.safeAreaInsets.bottom = 34

// Other devices
// UIApplication.shared.keyWindow!.safeAreaInsets.top =  0
// UIApplication.shared.keyWindow!.safeAreaInsets.bottom = 0

// example
let window = UIApplication.shared.keyWindow!
let viewWidth = window.frame.size.width
let viewHeight = window.frame.size.height - window.safeAreaInsets.bottom
let viewFrame = CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight)
let aView = UIView(frame: viewFrame)
aView.backgroundColor = .red
view.addSubview(aView)
aView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

4
যদি আপনার ভিউ অটোলাউট ব্যবহার না করে তবে এটি যাওয়ার উপায়।
জোনাথন ক্যাবেরা

4

ভিজ্যুয়াল ফর্ম্যাট সহ সীমাবদ্ধতাগুলি ব্যবহার করুন এবং আপনি বিনামূল্যে নিরাপদ অঞ্চলের প্রতি সম্মান পাবেন।

class ViewController: UIViewController {

    var greenView = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        greenView.backgroundColor = .green
        view.addSubview(greenView)
    }
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()

        greenView.translatesAutoresizingMaskIntoConstraints = false
        let views : [String:Any] = ["greenView":greenView]
        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[greenView]-|", options: [], metrics: nil, views: views))
        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[greenView]-|", options: [], metrics: nil, views: views))
    }
}

ফলাফল


4
ডাউন-ভোটিংয়ের সময় দয়া করে একটি মন্তব্য দিন, যাতে এই কৌশলটি প্রয়োগ না হয় এমন কোনও কেস আছে কিনা তা আমরা সকলেই শিখতে পারি। ধন্যবাদ!
অ্যাটমিকবুলিয়ান

এটি কাজ করে, আমি ভিজ্যুয়াল ফর্ম্যাট সমাধানগুলিও পছন্দ করি! ধন্যবাদ! তবে এটি কি সমস্ত আইওএস সংস্করণে কাজ করে?
PaFi

4

উদ্দেশ্য-সি এর জন্য নিরাপদ অঞ্চল সম্প্রসারণ

@implementation UIView (SafeArea)

- (NSLayoutAnchor *)safeTopAnchor{

    if (@available(iOS 11.0, *)){
        return self.safeAreaLayoutGuide.topAnchor;
    } else {
        return self.topAnchor;
    }

}


- (NSLayoutAnchor *)safeBottomAnchor{

    if (@available(iOS 11.0, *)) {
        return self.safeAreaLayoutGuide.bottomAnchor;
    } else {
        return self.bottomAnchor;
    }

}

@end

এটি কাজ করে না (সুইফট 4.2, আইওএস 12) ফলাফল স্থিতি
দণ্ডকে

2

সুইফট 4.2 এবং 5.0। মনে করুন আপনি ভিউবিজেতে শীর্ষস্থানীয়, ট্রেলিং, শীর্ষ এবং নীচে সীমাবদ্ধতা যুক্ত করতে চান। সুতরাং, আপনি নীচের কোড ব্যবহার করতে পারেন।

let guide = self.view.safeAreaLayoutGuide
viewBg.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
viewBg.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
viewBg.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
viewBg.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true

1

এই এক্সটেনশানটি আপনাকে একটি ইউআইভিউর নতুনত্বের তত্ত্বাবধানে এবং সুপারভাইউতে + নিরাপদে সীমাবদ্ধ রাখতে সহায়তা করে:

extension UIView {

    ///Constraints a view to its superview
    func constraintToSuperView() {
        guard let superview = superview else { return }
        translatesAutoresizingMaskIntoConstraints = false

        topAnchor.constraint(equalTo: superview.topAnchor).isActive = true
        leftAnchor.constraint(equalTo: superview.leftAnchor).isActive = true
        bottomAnchor.constraint(equalTo: superview.bottomAnchor).isActive = true
        rightAnchor.constraint(equalTo: superview.rightAnchor).isActive = true
    }

    ///Constraints a view to its superview safe area
    func constraintToSafeArea() {
        guard let superview = superview else { return }
        translatesAutoresizingMaskIntoConstraints = false

        topAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.topAnchor).isActive = true
        leftAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.leftAnchor).isActive = true
        bottomAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.bottomAnchor).isActive = true
        rightAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.rightAnchor).isActive = true
    }

}

0

এখানে বর্ণিত হিসাবে আপনি view.safeAreaInsets ব্যবহার করতে পারেন https://www.raywenderlich.com/174078/auto-layout-visual-format-language-tutorial-2

কোড নমুনা (রেভেন্ডারলিচ ডটকম থেকে নেওয়া):

override func viewSafeAreaInsetsDidChange() {
  super.viewSafeAreaInsetsDidChange()

  if !allConstraints.isEmpty {
    NSLayoutConstraint.deactivate(allConstraints)
    allConstraints.removeAll()
  }

  let newInsets = view.safeAreaInsets
  let leftMargin = newInsets.left > 0 ? newInsets.left : Metrics.padding
  let rightMargin = newInsets.right > 0 ? newInsets.right : Metrics.padding
  let topMargin = newInsets.top > 0 ? newInsets.top : Metrics.padding
  let bottomMargin = newInsets.bottom > 0 ? newInsets.bottom : Metrics.padding

  let metrics = [
    "horizontalPadding": Metrics.padding,
    "iconImageViewWidth": Metrics.iconImageViewWidth,
    "topMargin": topMargin,
    "bottomMargin": bottomMargin,
    "leftMargin": leftMargin,
    "rightMargin": rightMargin]
}


let views: [String: Any] = [
  "iconImageView": iconImageView,
  "appNameLabel": appNameLabel,
  "skipButton": skipButton,
  "appImageView": appImageView,
  "welcomeLabel": welcomeLabel,
  "summaryLabel": summaryLabel,
  "pageControl": pageControl]

let iconVerticalConstraints = NSLayoutConstraint.constraints(
  withVisualFormat: "V:|-topMargin-[iconImageView(30)]",
  metrics: metrics,
  views: views)
allConstraints += iconVerticalConstraints

let topRowHorizontalFormat = """
  H:|-leftMargin-[iconImageView(iconImageViewWidth)]-[appNameLabel]-[skipButton]-rightMargin-|
  """
...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.