ios - আইওএস 7: UITableView স্ট্যাটাস বারের অধীনে দেখায়




ios7 uistatusbar (18)

XIB এর সাথে কাজ করার সময় chappjc এর উত্তরটি দুর্দান্ত কাজ করে।

টেবিলভিউ কন্ট্রোলারগুলিকে প্রোগ্রাম্যাটিকভাবে তৈরি করার সময় আমি পরিষ্কার সমাধান খুঁজে পেয়েছি UITableViewController ইনস্ট্যান্সটি অন্য UIViewController এ এবং সেই অনুযায়ী সেটিংস সীমাবদ্ধতাগুলিতে মোড়ানো করে।

এটা এখানে:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

চিয়ার্স, বেন

আমার অ্যাপ্লিকেশনের প্রথম পর্দাটি কোনও ন্যাভিগেশন বার ছাড়া একটি UITableViewController , যার অর্থ হচ্ছে স্ট্যাটাস বারের অধীনে সামগ্রী প্রবাহিত হয় যাতে অনেকগুলি টেক্সট সংঘর্ষ হয়। আমি Under top bars Adjust scroll view insets জন্য উভয় বৈশিষ্ট্য সমন্বয় করেছি এবং Adjust scroll view insets যা আসলে স্ক্রোলিংয়ের অধীনে এটি বন্ধ করে দিচ্ছে, তবে টেবিলে দৃশ্যের শীর্ষে Adjust scroll view insets । আমি 20 পিক্সেল দ্বারা অফসেট করার জন্য UITableView ফ্রেম সেট করার চেষ্টা করেছি, তবে এটি কার্যকর হতে দেখায় না এবং বর্তমানে iOS এর সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য অ্যাপ্লিকেশানটির প্রয়োজন হিসাবে আমি iOS 7 এ লাফ দিতে পারি না স্টোরিবোর্ডগুলিকে অটলআউট আউট করতে বাধ্য করতে শীর্ষ উচ্চতা গাইড ব্যবহার করুন। যে কেউ একটি সমাধান উভয় সংস্করণ জন্য কাজ পাওয়া যায়?

যে জিনিসগুলি আমি চেষ্টা করেছি: edgesForExtendedLayout সেট করার জন্য, edgesForExtendedLayout , স্টোরিবোর্ডের মধ্যে সেটিংস পরিবর্তন করে edgesForExtendedLayout জন্য এবং Adjust scroll view , ফ্রেমটি একটি নতুন এলাকাতে বাধ্য করা।

একটি ছবি হাজার শব্দের সমান:


আপনার স্টোরিবোর্ডে UIViewController নির্বাচন করুন একটি আনচেক বিকল্প শীর্ষ বারের অধীনে এজগুলি প্রসারিত করুন। আমার জন্য কাজ। :)


আমার মত যারা তাদের UITableViewController এম্বেড করবেন না তাদের জন্য UIViewController চেষ্টা করুন:

একটি কাস্টম UITableViewController উপশ্রেণীটি UITableViewController একটি মাস্ক ভিউ যুক্ত করতে পারে। ViewDidAppear এ মুখোশ যোগ করুন, এবং দৃশ্যের উপর মাস্ক সরান WillDisappear।

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}

আমি UITableViewController ব্যবহার করার পদ্ধতিটি আপনি আগে কি কি একটু ভিন্ন হতে পারে মনে হয়। এটা আমার জন্য কাজ করেছে, কিন্তু আপনি এটি একটি ফ্যান হতে পারে না। আমি যা করেছি তার একটি কন্টেইনার ভিউ সহ দৃশ্য নিয়ামক রয়েছে যা আমার UItableViewController এর দিকে নির্দেশ করে। এইভাবে আমি আমার স্টলবোর্ডে দেওয়া TopLayoutGuide ব্যবহার করতে সক্ষম। কনটেইনার ভিউতে সীমাবদ্ধতা যুক্ত করুন এবং আপনার iOS7 এবং iOS6 উভয়ের জন্য যত্ন নেওয়া উচিত।


আমি আমার UITableView শীর্ষে একটি UISearchBar ছিল এবং নিম্নলিখিত কাজ;

self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0);
self.tableView.contentOffset = CGPointMake(0, -20);

শেয়ার করুন এবং উপভোগ করুন ...


আমি একটি নেভিস কন্ট্রোলার এবং একটি টেবিলভিউ কন্ট্রোলার সহ একটি UISplitViewController ব্যবহার করছি। এখানে অনেক সমাধান চেষ্টা করার পরে মাস্টার ভিউতে আমার জন্য এটি কাজ করেছে:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

এটি হট লিকসের সমাধানের মতো তবে নেভিগেশান কন্ট্রোলারের সাবউইউও প্রয়োগ করে।


আমি পছন্দসই পটভূমির সাথে একটি অতিরিক্ত দৃশ্য ব্যবহার করে শেষ করেছি, টেবিলভিউ পরে যোগ করা হয়েছে এবং স্ট্যাটাস বারের অধীনে স্থাপন করা হয়েছে:

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

এটি খুব সুন্দর নয়, তবে এটি সহজ সমাধান, যদি আপনি xib- কম মতামতগুলির সাথে কাজ করতে চান, এবং উভয় IOS6 এবং IOS7


আমি ফ্রিফর্ম আকার সেট করে কাজ পেয়েছিলাম


এই প্রতিলিপি আগ্রহী কেউ জন্য, কেবল এই পদক্ষেপ অনুসরণ করুন:

  1. একটি নতুন iOS প্রকল্প তৈরি করুন
  2. প্রধান স্টোরিবোর্ড খুলুন এবং ডিফল্ট / প্রাথমিক UIViewController মুছে দিন
  3. বস্তু লাইব্রেরি থেকে একটি নতুন UITableViewController টেনে আনুন
  4. প্রাথমিক ভিউ কন্ট্রোলার হিসাবে সেট করুন
  5. টেবিল কিছু পরীক্ষা তথ্য ফিড

যদি আপনি উপরের পদক্ষেপগুলি অনুসরণ করেন, যখন আপনি অ্যাপ্লিকেশনটি চালান, তখন আপনি যে কোনও কিছুই দেখতে পাবেন না, যার মধ্যে Xcode এর চেকবক্সগুলিকে "উপরে, নীচে, অপাক্কুল} বারের অধীনে প্রসারিত করুন", স্ট্যাটাস দণ্ডের অধীনে প্রথম সারিটি দেখাতে বাধা দেয়, না আপনি এই প্রোগ্রামগতভাবে ঠিকানা করতে পারেন।

উদাহরণস্বরূপ উপরের পরিস্থিতিতে, নিম্নলিখিতগুলির কোন প্রভাব থাকবে না :

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

এই সমস্যাটি খুব হতাশাজনক হতে পারে এবং আমি বিশ্বাস করি অ্যাপলটির শেষের দিকে এটি একটি বাগ, বিশেষত কারণ এটি বস্তুর লাইব্রেরির নিজস্ব UITableViewController হয়।

আমি যেকোন ধরণের "যাদু নাম্বার" ব্যবহার করে এটি সমাধান করার চেষ্টা করছি এমন প্রত্যেকের সাথে একমত নই। উদাহরণস্বরূপ "২0px এর একটি ডেল্টা ব্যবহার করুন"। শক্তভাবে মিলিত প্রোগ্রামিং এই ধরনের স্পষ্টভাবে অ্যাপল আমাদের এখানে করতে চায় না।

আমি এই সমস্যার দুটি সমাধান আবিষ্কার করেছি:

  • UITableViewController এর দৃশ্য সংরক্ষণ করা :
    যদি আপনি স্টোরিবোর্ডে UITableViewController ভিউ কন্ট্রোলারটিকে অন্য ভিউতে না রেখে ম্যানুয়াল ভিউ UITableViewController রাখতে চান তবে আপনি UINavigationController (সম্পাদক> এম্বেড ইন> ন্যাভিগেশন কন্ট্রোলার) এ UITableViewController এম্বেড করতে পারেন এবং ইন্সপেক্টরটিতে "ন্যাভিগেশন বার দেখান" আনচেক করতে পারেন। এটি কোনও অতিরিক্ত UITableViewController প্রয়োজন ছাড়াই সমস্যাটি সমাধান করে এবং এটি স্টোরিবোর্ডে আপনার UITableViewController এর দৃশ্যটিকেও সংরক্ষণ করে।

  • UITableView ব্যবহার করে এবং অন্য ভিউতে UITableView এম্বেড করা (আমি মনে করি অ্যাপল আমাদের এই কাজটি করতে চায় তা হল:)
    একটি খালি UIViewController তৈরি করুন এবং এতে আপনার UITableView টেনে আনুন। তারপর, আপনার UITableView থেকে স্ট্যাটাস বারের দিকে Ctrl-drag। মাউসটি স্ট্যাটাস বারের নীচে চলে গেলে, আপনি একটি অটলআউট বুদ্বুদ দেখতে পাবেন যা "শীর্ষ লেআউট গাইড" বলে। মাউস ছেড়ে এবং "উল্লম্ব স্পেসিং" নির্বাচন করুন। এটি লেআউট সিস্টেমটিকে স্ট্যাটাস বারের ঠিক নীচে স্থাপন করতে বলবে।

আমি একটি খালি আবেদন উভয় উপায়ে পরীক্ষা করেছি এবং তারা উভয় কাজ। আপনি আপনার প্রকল্পের জন্য তাদের কাজ করতে কিছু অতিরিক্ত tweaking করতে হবে।


এক্সকোড 7 এর জন্য, ন্যাভিগেশন বারের জন্য 'স্বচ্ছ' চেক চিহ্নটি টিক চিহ্নহীন করে আমার জন্য কাজ করে।


এটি "সুইফ্ট" এ লিখতে কেমন হয় @ লিপকার উত্তরের সমন্বয়:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)

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

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}

নিম্নরূপঃ আব্রাহামচেজ এর সমাধান https://developer.apple.com/library/ios/qa/qa1797/_index.html আমার জন্য কাজ করেছে। আমি আমার প্রাথমিক ভিউ হিসাবে একটি একক UITableview কন্ট্রোলার ছিল। আমি অফসেট কোড এবং একটি নেভিকন এম্বেড করার চেষ্টা করেছি কিন্তু স্ট্যাটাসবারের স্বচ্ছতা সমাধান করে নি।

একটি কন্ট্রোলার যোগ করুন এবং এটি প্রাথমিক ভিউ করুন। এটি আপনাকে সমালোচনামূলক শীর্ষ এবং নিচের লেআউট গাইডগুলি দেখাবে।

নতুন কন্ট্রোলারের মধ্যে পুরাতন টেবিলভিউটি ভিউতে টেনে আনুন।

নতুন নিয়ামক মধ্যে টেবিল retrofit সমস্ত উপাদান করুন:

UITiewViewController এর পরিবর্তে UIViewController থেকে উত্তরাধিকার / উপশ্রেণীতে আপনার পুরানো দৃশ্য নিয়ামক। এইচ। ফাইলটি পরিবর্তন করুন।

ভিউ কন্ট্রোলার এর সাথে UITableViewDataSource এবং UITableViewDelegate যোগ করুন .h।

স্টোরিবোর্ডের মতো প্রয়োজনীয় কিছু পুনঃ-সংযোগ করুন, যেমন অনুসন্ধানবার।

বড় জিনিসটি হ'ল সীমাবদ্ধতাগুলি সেট আপ করা, যেমন অ্যাপল Q & A তে। আমি একটি টুলবার ঢোকা বিরক্ত না। নির্দিষ্ট ক্রম নির্দিষ্ট না। কিন্তু যখন আমি তৈরি করেছি তখন লেআউট গাইডগুলিতে একটি লাল আইকন উপস্থিত হয়েছিল। আমি এটি ক্লিক এবং Xcode ইনস্টল / সীমাবদ্ধতা পরিষ্কার করা যাক।

তারপর আমি সর্বত্র ক্লিক করেছি যতক্ষণ না আমি উল্লম্ব স্পেস সীমাবদ্ধতা খুঁজে পেয়েছি এবং তার শীর্ষ মানটি -20 থেকে 0 পর্যন্ত পরিবর্তন করেছি এবং এটি পুরোপুরি কাজ করেছে।


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

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}

শীর্ষ উত্তর যোগ করা হচ্ছে:

দ্বিতীয় পদ্ধতির পরে প্রাথমিকভাবে কাজ বলে মনে হয় না আমি কিছু অতিরিক্ত tinkering করেনি এবং সমাধান খুঁজে পেয়েছেন।

TLDR; উপরের উত্তরটির দ্বিতীয় সমাধানটি প্রায় কাজ করে, তবে xCode ctrl + এর কিছু সংস্করণগুলির জন্য "শীর্ষ লেআউট গাইড" এ টেনে আনতে এবং উল্লম্ব স্পেসিং নির্বাচন করা কিছুই না। তবে, প্রথমে টেবিল দৃশ্যটির আকারটি সামঞ্জস্য করে এবং তারপর "শীর্ষ স্থান থেকে শীর্ষ লেআউট গাইড" নির্বাচন করে কাজ করে

  1. স্টোরিবোর্ডে একটি ফাঁকা ভিউ কন্ট্রোলার টেনে আনুন।

  2. ভিউতে একটি UITableView বস্তু টেনে আনুন। (UITableViewController নয়)। নীল বিন্যাস গাইড ব্যবহার করে খুব কেন্দ্র এটি অবস্থান।

  1. TableView মধ্যে একটি UITableViewCell টেনে আনুন। এটি আপনার প্রোটোটাইপ পুনঃব্যবহারের ঘর হতে পারে, তাই বৈশিষ্ট্য ট্যাবের অধীনে এটি পুনরায় ব্যবহার সনাক্তকারী সেট করতে ভুলবেন না বা আপনি একটি ক্র্যাশ পাবেন।

  1. UIViewController এর আপনার কাস্টম সাবক্লাস তৈরি করুন এবং <UITableViewDataSource, UITableViewDelegate> প্রোটোকল যোগ করুন। আইডেন্টিটি ইন্সপেক্টারে এই স্টোরিবোর্ডের ভিউ কন্ট্রোলার সেট করতে ভুলবেন না।

  2. আপনার বাস্তবায়ন ফাইলটিতে আপনার টেবিলভিউয়ের জন্য একটি আউটলেট তৈরি করুন এবং এটি "tableView" নাম দিন।

  1. টেবিলভিউতে ডান ক্লিক করুন এবং আপনার ViewController এ ডেটাসোর্স এবং প্রতিনিধি উভয় টেনে আনুন।

এখন স্ট্যাটাস বারে ক্লিপিং না করার জন্য।

  1. আপনার সারণির দৃশ্যের শীর্ষ প্রান্তটি ধরুন এবং শীর্ষস্থানে থাকা ড্যাশযুক্ত নীল অটো-লেআউট গাইডগুলিতে এটি সরান

  1. এখন, আপনি টেবিল দৃশ্য থেকে টেনে টেনে আনতে পারেন এবং শীর্ষ স্থান থেকে উপরের লেআউট গাইড নির্বাচন করতে পারেন

  1. এটি আপনাকে TableView এর সাংঘাতিক বিন্যাস সম্পর্কে একটি ত্রুটি দেবে, কেবল অনুপস্থিত সীমাবদ্ধতা যোগ করুন এবং আপনার কাজ সম্পন্ন করুন।

এখন আপনি স্বাভাবিক মত আপনার টেবিলের দৃশ্য সেট আপ করতে পারেন, এবং এটি স্ট্যাটাস বার ক্লিপ করবে না!


সব সমাধান দেখুন: আমার প্রকল্পটি শুধু xib ব্যবহার করে, তাই স্টোরিবোর্ডের সমাধানটি আমার জন্য কাজ করে না। স্ব। এডিজেসসফোর এক্সটেন্ডেড লেআউট = UIRectEdgeNone; ন্যাভিগেশন বার দৃশ্যমান হলে শুধু কন্ট্রোলার জন্য কাজ করে। কিন্তু আপনার ভিউতে স্ট্যাটাস বার থাকলে এটি কাজ করবে না। তাই আমি দুটি conditons একত্রিত।

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

এই কাজ সাহায্য।


override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}

- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1





uistatusbar