IOS11 এ অদ্ভুত ইউটিবেলভিউ আচরণ। ঘরগুলি নেভিগেশন পুশ অ্যানিমেশন সহ স্ক্রোল করে


116

আমি সম্প্রতি কিছু কোড নতুন আইওএস 11 বিটা 5 এসডিকে স্থানান্তরিত করেছি।

আমি এখন ইউআইটিএবলভিউ থেকে খুব বিভ্রান্তিকর আচরণ পেয়েছি। টেবিলভিউটি নিজেই অভিনব নয়। আমার কাস্টম সেল রয়েছে তবে বেশিরভাগ অংশে এটি কেবল তাদের উচ্চতার জন্য।

আমি যখন আমার ভিউ কন্ট্রোলটিকে টেবিলভিউয়ের সাথে চাপ দিই তখন আমি একটি অতিরিক্ত অ্যানিমেশন পাই যেখানে কোষগুলি "স্ক্রোল আপ" (বা সম্ভবত পুরো টেবিলভিউ ফ্রেমটি পরিবর্তিত হয়) এবং নীচে পুশ / পপ নেভিগেশন অ্যানিমেশন সহ। জিআইএফ দেখুন:

avyেউয়ের টেবিলভিউ

আমি নিজে তৈরি tableviewমধ্যে loadViewপদ্ধতি এবং সেটআপ স্বয়ংক্রিয় বিন্যাস সীমাবদ্ধতার নেতৃস্থানীয়, trailing, শীর্ষ, tableview এর superview নীচে সমান হতে হবে। সুপারভিউ হ'ল ভিউ কন্ট্রোলারের মূল ভিউ।

কন্ট্রোলার পুশিং কোডটি দেখুন খুব মানক: self.navigationController?.pushViewController(notifVC, animated: true)

আইওএস 10 এ একই কোডটি স্বাভাবিক আচরণ সরবরাহ করে।

আপনি দয়া করে আমাকে ভুল কি দিক নির্দেশ করতে পারেন?

সম্পাদনা: আমি একটি খুব সাধারণ টেবিলভিউ নিয়ামক তৈরি করেছি এবং আমি সেখানে একই আচরণ পুনরুত্পাদন করতে পারি। কোড:

class VerySimpleTableViewController : UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    }


    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

        cell.textLabel?.text = String(indexPath.row)
        cell.accessoryType = .disclosureIndicator

        return cell
    }


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)

        let vc = VerySimpleTableViewController.init(style: .grouped)

        self.navigationController?.pushViewController(vc, animated: true)
    }
}

সম্পাদনা 2: আমি আমার ইউআইএনএভিগেশনবারের কাস্টমাইজেশনের বিষয়টি কমিয়ে দিতে সক্ষম হয়েছি। আমার এই মত একটি কাস্টমাইজেশন আছে:

rootNavController.navigationBar.setBackgroundImage(createFilledImage(withColor: .white, size: 1), for: .default)

যেখানে createFilledImageপ্রদত্ত আকার এবং রঙের সাথে বর্গক্ষেত্রের চিত্র তৈরি করে।

আমি যদি এই লাইনে মন্তব্য করি তবে আমি স্বাভাবিক আচরণ ফিরে পাই।

আমি এই বিষয়ে কোন চিন্তা প্রশংসা করব।


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

2
আমি সেট navigationBar.isTranslucentকরার falseসময়ই এই আচরণটি দেখছি , অন্যথায় এটি ঠিকঠাক কাজ করে।
b_ray

5
এটি আইওএস 11 জিএম-তে একটি বাগ বলে মনে হচ্ছে, দয়া করে সেই বাগের প্রতিবেদনটি তৈরি করুন যাতে অ্যাপল থেকে এই সমস্যাটির কিছুটা নজর পড়ে: ওপেনারডার.অ্যাপস্পট
বি_রে

1
এই সমস্যাটি iOS 11.2 বিটাতে স্থির হয়েছে বলে মনে হচ্ছে। আমি কখনই কন্টেন্টসেন্টসেটজেটমেন্ট বিহাইভার সেট করব না কারণ এটি স্ক্রিনের নীচে প্যাডিং না দিয়ে আইফোন এক্স স্ক্রোলভিউ ভঙ্গ করে। আপনার সামগ্রী দেখার নীচে আইফোন এক্স এর হোম "বোতাম" এর নীচে থাকে under
বাটু

উত্তর:


150

এটি UIScrollView's (ইউআইটিএবলভিউ ইউআইএসক্রোলভিউয়ের একটি সাবক্লাস) নতুন contentInsetAdjustmentBehaviorসম্পত্তিটির কারণে, যা .automaticডিফল্টরূপে সেট করা আছে ।

আপনি কোনও প্রভাবিত নিয়ন্ত্রণকারীদের ভিডডিডলডে নিম্নলিখিত স্নিপেটের সাথে এই আচরণটি ওভাররাইড করতে পারেন:

    tableView.contentInsetAdjustmentBehavior = .never

https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior


2
ইউআইএসক্রোলভিউ কনটেন্টইনসেটসেটমেন্টমেন্ট বিহ্যাভিয়ার.আউটমেটিক সংজ্ঞা সম্পর্কে এই মন্তব্য বলেছেন: "... পশ্চাদপদ সামঞ্জস্যের জন্য শীর্ষ এবং নীচের বিষয়বস্তুও সমন্বয় করা হবে যখন স্ক্রোল ভিউটি স্বয়ংক্রিয়ভাবে অ্যাডজাস্টসক্রোলভিউআইনসেটস = হ্যাঁ একটি নেভিগেশন নিয়ামকের অভ্যন্তরের সাথে একটি ভিউ কন্ট্রোলারের মালিকানাধীন, স্ক্রোল কিনা তা নির্বিশেষে set দেখুন স্ক্রোলযোগ্য "। আমার তত্ত্বটি হ'ল নেভিগেশন বারের সামগ্রীর ইনসেটটি ব্যাকগ্রাউন্ড চিত্রটি সেট করে প্রভাবিত হয় যা গতিশীলভাবে সামঞ্জস্য হয়।
ম্যাগি হিলেন

8
আপনি স্টোরিবোর্ডের সাহায্যে এটিও করতে পারেন। আকার পরিদর্শক -> সামগ্রী কীট -> 'কখনই নয়' সেট করুন।
ওওঙ্গবি কিম

4
যদি আপনার বিষয়বস্তুটি ট্যাব বারের পিছনে প্রসারিত হয় tableView.contentInsetAdjustmentBehaviorতা অক্ষম করলে কীটপতঙ্গগুলি ভেঙে যায়।
কিয়ান

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

8
এই সমস্যাটি আইওএস 11-তে একটি বাগের কারণে হয়েছিল যেখানে নেভিগেশন স্থানান্তরকালে ভিউ কন্ট্রোলারের দৃশ্যের নিরাপদআরআইএনসেটগুলি ভুলভাবে সেট করা হয়েছিল, যা আইওএস 11.2 এ স্থির করা উচিত। সেট contentInsetAdjustmentBehaviorথেকে .neverএকটি দুর্দান্ত কার্যসংক্রান্ত কারণ এটি সম্ভবত অন্যান্য অবাঞ্ছিত পার্শ্বপ্রতিক্রিয়া থাকবে নয়। আপনি যদি কোনও কাজের লক্ষণ ব্যবহার করেন তবে আপনার এটি আইওএস সংস্করণ> = 11.2 এর জন্য সরিয়ে ফেলা নিশ্চিত করা উচিত।
স্মাইলিবার্গ

23

ম্যাগির উত্তর ছাড়াও

উদ্দেশ্য গ

if (@available(iOS 11.0, *)) {
    scrollViewForView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}

এই সমস্যাটি আইওএস 11-তে একটি বাগের কারণে হয়েছিল যেখানে safeAreaInsetsনেভিগেশন স্থানান্তরের সময় দর্শন নিয়ন্ত্রকের দর্শনটি ভুলভাবে সেট করা হয়েছিল, যা আইওএস 11.2 এ স্থির করা উচিত। সেট contentInsetAdjustmentBehaviorথেকে .neverএকটি দুর্দান্ত কার্যসংক্রান্ত কারণ এটি সম্ভবত অন্যান্য অবাঞ্ছিত পার্শ্বপ্রতিক্রিয়া থাকবে নয়। আপনি যদি কোনও কাজের লক্ষণ ব্যবহার করেন তবে আপনার এটি আইওএস সংস্করণ> = 11.2 এর জন্য সরিয়ে ফেলা নিশ্চিত করা উচিত

স্মাইলিবার্গ দ্বারা উল্লেখ করা (অ্যাপল এ সফটওয়্যার ইঞ্জিনিয়ার)


6

আপনি NSProxy ব্যবহার করে অ্যাপ্লিকেশন জুড়ে একবারে এই আচরণটি সম্পাদনা করতে পারেন উদাহরণস্বরূপ ফিনিশলঞ্চিং উইথঅপশনগুলি:

if (@available(iOS 11.0, *)) {
      [UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} 

1
এই সিস্টেমের ভঙ্গ করবে নিয়ামক, UIImagePickerController মত
গালওয়ে

6

আইওএস 11 কে স্বয়ংক্রিয়ভাবে ইনসেটগুলি সেট করার অনুমতি দেওয়ার সময় আমি কীভাবে এই সমস্যাটি ঠিক করতে পেরেছি তা এখানে । আমি ব্যবহার করছি UITableViewController

  • স্টোরিবোর্ডে (বা প্রোগ্রামমেটিকভাবে ) আপনার ভিউ কন্ট্রোলারে "শীর্ষ বারগুলির নীচে প্রান্তগুলি প্রসারিত করুন" এবং "অস্বচ্ছ বারগুলির নীচে প্রান্তগুলি প্রসারিত করুন" নির্বাচন করুন । নিরাপদ অঞ্চল পোকামাকড় আপনার দর্শনটি উপরের বারের নীচে যেতে বাধা দেবে।
  • আপনার স্টোরিবোর্ডে আপনার টেবিল ভিউতে "ইনসেটস টু সেফ এরিয়া" বোতামটি পরীক্ষা করুন। (বা tableView.insetsContentViewsToSafeArea = true) - এটি প্রয়োজনীয় নাও হতে পারে তবে এটি আমি করেছিলাম।
  • কন্টেন্ট ইনসেট সামঞ্জস্য আচরণ "স্ক্রোলযোগ্য অক্ষ" (বা tableView.contentInsetAdjustmentBehavior = .scrollableAxes) এ সেট করুন - এটি .alwaysহয়ত কাজ করতে পারে তবে আমি পরীক্ষা করিনি।

অন্য সব কিছু ব্যর্থ হলে আরও একটি বিষয় চেষ্টা করুন:

viewSafeAreaInsetsDidChange UIViewControllerনিরাপদ অঞ্চল ইনসেটগুলিতে স্ক্রোল ভিউ ইনসেটগুলি জোর করে সারণী প্রদর্শনের জন্য টেবিল ভিউ পেতে ওভাররাইড পদ্ধতি। এটি ম্যাগির উত্তরে 'কখনই নয়' সেটিংয়ের সাথে মিলে যায়।

- (void)viewSafeAreaInsetsDidChange {
    [super viewSafeAreaInsetsDidChange];
    self.tableView.contentInset = self.view.safeAreaInsets;
}

দ্রষ্টব্য: self.tableViewএবং self.viewএকই জিনিস হওয়া উচিতUITableViewController


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

3

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

আপনি যদি কেবল কনটেন্টইসেটসেটমেন্টমেন্ট বিহাইভায়ার সেট করে থাকেন তবে আইফোন এক্সে কনটেন্ট ইনসেটগুলি সঠিকভাবে সেট করা হবে না, যেমন সামগ্রীগুলি স্ক্রোলবারের নীচে নীচের অঞ্চলে যাবে।

এটি দুটি কাজ করা প্রয়োজন:
১. পুশ / পপতে অ্যানিমেট করা স্ক্রোলভিউ রোধ করুন
2 এ 2 .আউটমেটিক আচরণ কারণ এটি আইফোন এক্স এর জন্য প্রয়োজনীয়। এটি প্রতিকৃতি হিসাবে না করে, সামগ্রী নীচের স্ক্রোলবারের নীচে চলে যাবে।

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

পুরানো সমাধান:

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

দ্রষ্টব্য 2: নীচের সমাধানটিতেও সমস্যা রয়েছে যে টেবিলভিউটি নীচে স্ক্রল করা থাকলে এবং আপনি নিয়ামক এবং পপ পিছনে চাপ দিন, এটি আর নীচে থাকবে না।

override func viewDidLoad()
{
    super.viewDidLoad()

    // This parts gets rid of animation when pushing
    if #available(iOS 11, *)
    {
        self.tableView.contentInsetAdjustmentBehavior = .never
    }
}

override func viewDidDisappear(_ animated: Bool)
{
    super.viewDidDisappear(animated)
    // This parts gets rid of animation when popping
    if #available(iOS 11, *)
    {
        self.tableView.contentInsetAdjustmentBehavior = .never
    }
}

override func viewDidAppear(_ animated: Bool)
{
    super.viewDidAppear(animated)
    // This parts sets correct behaviour(insets are correct on iPhone X)
    if #available(iOS 11, *)
    {
        self.tableView.contentInsetAdjustmentBehavior = .automatic
    }
}

প্যারেন্টভিউ কী?
PhoneyDeveloper

আপনার ভিউ কন্ট্রোলারের মূল দৃশ্য, আমি উত্তরটি আপডেট করেছি। ধন্যবাদ.
এল ভয়াবহ

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

আপনার ক্ষেত্রে যেহেতু ইউআইটিএবলভিউ নিয়ন্ত্রণকারীর দৃষ্টিভঙ্গি, এতে SafeAreaInsets.bottom = 34 (প্রতিকৃতি) থাকা উচিত, সুতরাং আপনি কেবল টেবিল ভিউ.কন্টেন্টইনসেট = টেবিলভিউ.সেসএফআরএইনেসেটস সেট করতে পারেন।
এল ভয়াবহ

এটি আমার পক্ষে কাজ করে না। ভিউডিডলডে সমস্ত ইনসেট শূন্য। আমি যদি ভিউলইলআউটসুবউভিউগুলিতে সেই কোডটি ব্যবহার করার চেষ্টা করি তবে স্ক্রোল সূচকটি ইনসেট পায় না তবে টেবিলভিউ নিজেই অনুভূমিকভাবে স্ক্রোল করতে সক্ষম হয়। আমি যদি সামঞ্জস্য অক্ষম না করে শুধুমাত্র ভিউলিলআউটসুভিউগুলিতে ভিউগুলিতে কীটগুলি দেখি তবে নীচের অ্যাডজাস্টেড কনটেন্টইনসেটটি 21 হয়ে যায় এবং এগুলিই বদলে যাচ্ছে বলে মনে হচ্ছে।
PhoneyDeveloper


2

উপরের কোড সহ নিশ্চিত হয়ে নিন, নিম্নলিখিত হিসাবে অতিরিক্ত কোড যুক্ত করুন। এটি সমস্যার সমাধান করেছে

override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) // print(thisUISBTV.adjustedContentInset) 
}

এই একা আমার সমস্যা সমাধান !! ধন্যবাদ. এই ইস্যুতে অনেক ঘন্টা নষ্ট!
মুরাত ইয়াসার

2

এছাড়াও আপনি যদি ট্যাব বার ব্যবহার করেন তবে সংগ্রহের ভিউয়ের নীচের অংশের সামগ্রীটি শূন্য হবে। এর জন্য, ভিডিডিয়ার এ কোডের নীচে রাখুন:

if #available(iOS 11, *) {
    tableView.contentInset = self.collectionView.safeAreaInsets
}

2

আমার ক্ষেত্রে এটি কাজ করেছে (এটি দেখুনডিডলোডে রাখুন):

self.navigationController.navigationBar.translucent = YES;

1

এর উপরে collectionViewবা উপরে অতিরিক্ত স্থান সরানোtableView

    if #available(iOS 11.0, *) {
        collectionView.contentInsetAdjustmentBehavior  = .never
        //tableView.contentInsetAdjustmentBehavior  = .never
    } else {
        automaticallyAdjustsScrollViewInsets = false
    }

কোডের উপরে collectionViewবা tableViewনেভিগেশন বারের অধীনে।
নীচের কোডগুলিতে নেভিগেশনের অধীনে সংগ্রহের ভিউকে বাধা দেয়

    self.edgesForExtendedLayout = UIRectEdge.bottom

তবে আমি ইউআইকোলিকেশনভিউয়ের জন্য নীচে যুক্তি এবং কোড ব্যবহার করতে পছন্দ করি

প্রান্ত ইনসেট মানগুলি আয়তক্ষেত্র দ্বারা উপস্থাপিত অঞ্চল সঙ্কুচিত বা প্রসারিত করতে একটি আয়তক্ষেত্রায় প্রয়োগ করা হয়। সাধারণত, প্রান্তের ইনসেটগুলি ভিউর ফ্রেমটি সংশোধন করতে দর্শন বিন্যাসের সময় ব্যবহৃত হয়। ধনাত্মক মানগুলি নির্দিষ্ট পরিমাণ দ্বারা ফ্রেমটিকে ইনসেট (বা সঙ্কুচিত) করে। Gণাত্মক মানগুলি নির্দিষ্ট পরিমাণ দ্বারা ফ্রেমটিকে প্রসারিত (বা প্রসারিত) করে cause

collectionView.contentInset = UIEdgeInsets(top: -30, left: 0, bottom: 0, right: 0)
//tableView.contentInset = UIEdgeInsets(top: -30, left: 0, bottom: 0, right: 0)

ইউআইকোলিকেশনভিউয়ের জন্য সেরা উপায়

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: -30, left: 0, bottom: 0, right: 0)
}

0

এই কোডটি আমার জন্য কাজ করে মুছুন

self.edgesForExtendedLayout = UIRectEdgeNone

0
  if #available(iOS 11, *) {
        self.edgesForExtendedLayout = UIRectEdge.bottom
  }

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

উপরে তালিকাভুক্ত কোডটি সম্পূর্ণরূপে সমস্যার সমাধান করেছে

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