আইওএস 8-এ ওরিয়েন্টেশন পরিবর্তনগুলি পরিচালনা করার "সঠিক" উপায় কী?


104

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

উদাহরণস্বরূপ, আমার ভিউ কন্ট্রোলারে, আমি কীভাবে নীচের সিউডোকোড প্রয়োগ করব?

if we are rotating from portrait to landscape then
  do portrait things
else if we are rotating from landscape to portrait then
  do landscape things

3
এর জন্য দস্তাবেজগুলি পড়ুন UIViewController। "হ্যান্ডলিং ভিউ
রোটেশনগুলি

যে তারা অবহেলিত হয় তা একটি সূত্র is আপনি অন্য কিছু ব্যবহার করতে হবে .... যে অন্য কিছু অটোলআউট এবং আকারের শ্রেণি হওয়া উচিত :-)
অ্যারন

উত্তর:


262

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

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

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    // Code here will execute before the rotation begins.
    // Equivalent to placing it in the deprecated method -[willRotateToInterfaceOrientation:duration:]

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {

        // Place code here to perform animations during the rotation.
        // You can pass nil or leave this block empty if not necessary.

    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {

        // Code here will execute after the rotation has finished.
        // Equivalent to placing it in the deprecated method -[didRotateFromInterfaceOrientation:]

    }];
}

গ্রেট! ঘোরানো শুরু হওয়ার ঠিক আগে এবং এটি শেষ হওয়ার পরে আপনি কলব্যাক পাচ্ছেন। তবে ঘূর্ণনটি প্রতিকৃতিতে বা ল্যান্ডস্কেপের পক্ষে আসলে কী হবে?

অ্যাপল প্যারেন্ট ভিউয়ের আকারের পরিবর্তন হিসাবে আবর্তনের বিষয়ে চিন্তাভাবনা করার পরামর্শ দেয়। অন্য কথায়, প্রতিকৃতি থেকে প্রতিকৃতিতে আইপ্যাড ঘোরার সময়, আপনি এটিকে মূল-স্তরের ভিউ হিসাবে সহজেই এর bounds.sizeথেকে পরিবর্তন করে ভাবতে {768, 1024}পারেন {1024, 768}। এটি জানার পরে, আপনি প্রতিকৃতি বা ল্যান্ডস্কেপে ঘুরছেন কিনা তা নির্ধারণ করার জন্য আপনার উপরের পদ্ধতিতে sizeপাস ব্যবহার করা উচিত viewWillTransitionToSize:withTransitionCoordinator:

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

পুনরুদ্ধার করতে:

  1. মৌলিকভাবে আলাদা UI গুলি কখন প্রদর্শিত হবে তা নির্ধারণ করতে আপনার আকারের ক্লাসগুলি ব্যবহার করা উচিত (যেমন একটি "আইফোন-জাতীয়" ইউআই বনাম একটি "আইপ্যাডের মতো" ইউআই)
  2. যদি আকারের ক্লাসগুলি পরিবর্তন না হয় তবে আপনার ধারক (প্যারেন্ট ভিউ) আকারটি যখন আপনার আইআইএতে আরও ছোট সামঞ্জস্য করা দরকার যেমন আইপ্যাড ঘোরার সময়, viewWillTransitionToSize:withTransitionCoordinator:ইউআইভিউকন্ট্রোলারে কলব্যাক ব্যবহার করুন ।
  3. আপনার অ্যাপ্লিকেশানের প্রতিটি দৃশ্যে কেবলমাত্র স্থানটি লেআউটটিতে দেওয়া হয়েছে তার ভিত্তিতে বিন্যাসের সিদ্ধান্ত নেওয়া উচিত views মতামতের প্রাকৃতিক শ্রেণিবিন্যাস এই তথ্যটিকে তছনছ করে দেয়।
  4. একইভাবে, statusBarOrientation"প্রতিকৃতি" বনাম "ল্যান্ডস্কেপ" এর জন্য কোনও ভিউ বিন্যাস করতে হবে কিনা তা নির্ধারণ করতে - যা মূলত একটি ডিভাইস-স্তরের সম্পত্তি - এটি ব্যবহার করবেন না । স্ট্যাটাস বারের ওরিয়েন্টেশনটি কেবলমাত্র UIWindowএমন অ্যাপ্লিকেশনের খুব মূল স্তরে বাস করে এমন জিনিসগুলির সাথে কোড ব্যবহার করে কোড ব্যবহার করা উচিত ।

5
দুর্দান্ত উত্তর! বিটিডাব্লু, আপনার ইউটিউব ভিডিও আলিতে অবিশ্বাস্যভাবে তথ্যবহুল ছিল। ভাগ করে নেওয়ার জন্য ধন্যবাদ। এটা দেখ! youtube.com/watch?v=taWaW2GzfCI
হাসিবোট

2
আমি খুঁজে পেলাম কেবলমাত্র সমস্যাটি হ'ল কখনও কখনও আপনি ডিভাইস ওরিয়েন্টেশন জানতে চান এবং এটি আপনাকে এটি জানতে দেয় না। আইপ্যাডে এটি স্ট্যাটাস বার বা ডিভাইস ওরিয়েন্টেশন মান পরিবর্তনের আগে ডাকা হয়। আপনি যদি বলতে পারবেন না যে ব্যবহারকারী প্রতিকৃতিতে প্রতিকৃতিতে বা প্রতিকৃতিতে উল্টে ডাউন ডিভাইস রাখে holds এটি পরীক্ষা করাও অসম্ভব, কারণ বিদ্রূপ UIViewControllerTransitionCoordinatorকরা দুঃস্বপ্ন :-(
দারারস্কি

@ দারারস্কি আপনি কি এই সমস্যাগুলি মোকাবেলার জন্য একটি দুর্দান্ত সমাধান খুঁজে পেয়েছেন?
এক্সভলস

তাহলে কোথায় viewdidlayoutsubviews? আমি ভেবেছিলাম viewdidlayoutsubviewsআবর্তনের কারণে আবদ্ধ পরিবর্তনগুলি ক্যাপচার করতে ব্যবহৃত হয়। আপনি এই সম্পর্কে বিস্তারিত বলতে পারেন?
মধু

1
যদি আমরা স্থিতিদর্শনটি ব্যবহার না করি তবে ল্যান্ডস্কেপ বাম বনাম ল্যান্ডস্কেপের মধ্যে কীভাবে পার্থক্য করা যায়? আমার সেই পার্থক্য দরকার। এছাড়াও এখানে বর্ণিত হিসাবে অন্যান্য সমস্যা রয়েছে - স্ট্যাকওভারফ্লো.com
দীপক শর্মা

17

স্মাইলিবার্গের খুব ভাল বিস্তৃত (এবং স্বীকৃত) উত্তরের ভিত্তিতে, এখানে সুইফট 3 ব্যবহার করে একটি অভিযোজন দেওয়া হয়েছে:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil, completion: {
        _ in
        self.collectionView.collectionViewLayout.invalidateLayout()
    })        
}

এবং UICollectionViewDelegateFlowLayoutবাস্তবায়নে,

public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    // retrieve the updated bounds
    let itemWidth = collectionView.bounds.width
    let itemHeight = collectionView.bounds.height
    // do whatever you need to do to adapt to the new size
}

11

আমি কেবল বিজ্ঞপ্তি কেন্দ্র ব্যবহার করি:

একটি ওরিয়েন্টেশন ভেরিয়েবল যুক্ত করুন (শেষে ব্যাখ্যা করবে)

//Above viewdidload
var orientations:UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation

ভিউ উপস্থিত হলে বিজ্ঞপ্তি যুক্ত করুন

override func viewDidAppear(animated: Bool) {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "orientationChanged:", name: UIDeviceOrientationDidChangeNotification, object: nil)
}

ভিউটি চলে গেলে বিজ্ঞপ্তি সরান

override func viewWillDisappear(animated: Bool) {
        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIDeviceOrientationDidChangeNotification, object: nil) 
}

বিজ্ঞপ্তি ট্রিগার করা হয় যখন বর্তমান ওরিয়েন্টেশন

func orientationChanged (notification: NSNotification) {
    adjustViewsForOrientation(UIApplication.sharedApplication().statusBarOrientation)
}

ওরিয়েন্টেশন (প্রতিকৃতি / ল্যান্ডস্কেপ) পরীক্ষা করে এবং ইভেন্টগুলি পরিচালনা করে

func adjustViewsForOrientation(orientation: UIInterfaceOrientation) {
    if (orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown)
    {
        if(orientation != orientations) {
            println("Portrait")
            //Do Rotation stuff here
            orientations = orientation
        }
    }
    else if (orientation == UIInterfaceOrientation.LandscapeLeft || orientation == UIInterfaceOrientation.LandscapeRight)
    {
       if(orientation != orientations) {
            println("Landscape")
            //Do Rotation stuff here
            orientations = orientation
        }
    }
}

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


11
এটি অ্যাপলের প্রস্তাবিত পদ্ধতির নয় কারণ এর অর্থ হল আপনার অ্যাপ্লিকেশনটির প্রতিটি দর্শন স্থানটি বিবেচনা না করে ডিভাইসের অভিযোজনের ভিত্তিতে কীভাবে প্রদর্শন করবেন তা সিদ্ধান্ত নিচ্ছে।
স্মাইলিবার্গ

2
অ্যাপল 8.0 এর সাথে হার্ডওয়্যারও বিবেচনায় নিচ্ছে না। একটি এভিপ্রিভিউ স্তরটি বলুন যদি এটি কোনও দৃশ্যের নিয়ামকের উপরে উপস্থাপন করা হয় তবে এটি ওরিয়েন্টেশন সম্পর্কে চিন্তা করার দরকার নেই। কাজ করে না, তবে এটি 8.2
নিক টার্নার

superএর viewDidAppearএবং viewWillDisappearডাকা উচিত
অ্যান্ড্রু বোগাভস্কিই

দ্রষ্টব্য: ইউআইডিভাইস ওরিয়েন্টেশন! = ইউআইআইন্টারফেস ওরিয়েন্টেশন। আমার পরীক্ষায় স্ট্যাটাস বারোরিয়েন্টেশন নির্ভরযোগ্য নয়।
nnrales

2

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

বিভাগটি দেখুন: বৈশিষ্ট্যগুলি এখানে একটি ইন্টারফেসের আকারের বর্গ এবং স্কেল বর্ণনা করে : https://developer.apple.com/library/ios/releasenotes/ জেনারাল / হোয়াটসনিউইওএনএস / আর্টিকেলস / আইওএস 8.html

"আইওএস 8 নতুন বৈশিষ্ট্য যুক্ত করে যা স্ক্রিনের আকার এবং ওরিয়েন্টেশনকে আরও বহুমুখী করে তোলে" "

এটিও একটি ভাল নিবন্ধ: https://carpeaqua.com/th سوچ-in-terms- of- ios-8-size-classes/

সম্পাদনা লিংক: https://carpeaqua.com/2014/06/14/thinking-in-terms-of-ios-8-size-classes/ (ক্রেডিট: কোইন)


হ্যাঁ, মনে হচ্ছে এই মুহূর্তে তার পুরো সাইটটি ডাউন রয়েছে।
হারুন

নিবন্ধটি সত্যই পঠনযোগ্য এবং এখানে সঠিক ঠিকানা: carpeaqua.com/th
سوچ-

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

ওপি এটি সম্পর্কে জিজ্ঞাসা / কথা বলছিল না।
অ্যারন

1
Updated লিঙ্ক: carpeaqua.com/2014/06/14/...
Koen
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.