আইপ্যাড প্রতিকৃতি এবং ল্যান্ডস্কেপ মোডের জন্য সাইজিং ক্লাস


97

এক্সকোড ode-এ প্রবর্তিত সাইজিং ক্লাস ব্যবহার করে আইপ্যাডের (পোর্ট্রেট বা ল্যান্ডস্কেপ) ওরিয়েন্টেশনের উপর নির্ভর করে আমি আমার সংক্ষিপ্তসারগুলি আলাদাভাবে রাখতে চাই t তবে আইবিতে আইপ্যাডের জন্য স্বতন্ত্র ল্যান্ডস্কেপ বা প্রতিকৃতি মোডের কোনওটিই .েকে নেই বলে মনে হচ্ছে। কেউ সাহায্য করতে পারেন?


কোনও অ-প্রোগ্রামিমেটিক সমাধান নেই বলে মনে হচ্ছে, যা ডিফল্ট স্ক্রিনের জন্য প্রয়োজন হবে
SwiftArchitect

উত্তর:


174

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

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

একটি মার্জিত সমাধান নয়।

কোনও অ্যাপলিকেশন ইতিমধ্যে আইবি এবং ইউআইকিট তৈরি করে এমন জাদুটি উপার্জনের কোনও উপায় নেই যা প্রদত্ত দিকনির্দেশনার জন্য আমাদের নির্বাচনের আকারের শ্রেণিটি ব্যবহার করার জন্য?

~

সমস্যাটি আরও উদারভাবে চিন্তা করতে গিয়ে আমি বুঝতে পেরেছিলাম যে 'সাইজের ক্লাসগুলি' কেবল আইবিতে সঞ্চিত একাধিক লেআউটকে সম্বোধন করার উপায়, যাতে রানটাইমের সময় তাদের প্রয়োজন মতো ডেকে আনা যায়।

আসলে, 'আকারের শ্রেণি' আসলে এনাম মানগুলির একটি জুড়ি a UIInterface.h থেকে:

typedef NS_ENUM(NSInteger, UIUserInterfaceSizeClass) {
    UIUserInterfaceSizeClassUnspecified = 0,
    UIUserInterfaceSizeClassCompact     = 1,
    UIUserInterfaceSizeClassRegular     = 2,
} NS_ENUM_AVAILABLE_IOS(8_0);

মৌলিকভাবে অ্যাপল এই বিভিন্ন প্রকারের নামকরণের সিদ্ধান্ত নিয়েছে তা বিবেচনা না করেই , আইবিতে সঞ্চিত একটি বিন্যাসকে অন্যের থেকে আলাদা করার জন্য এরা কেবল একজোড়া পূর্ণসংখ্যার অনন্য পরিচয়কারী হিসাবে ব্যবহৃত হয়।

এখন, ধরুন যে আমরা আইবিতে একটি বিকল্প লেআউট (অব্যবহৃত আকারের ক্লাস ব্যবহার করে) তৈরি করি - বলুন, আইপ্যাড পোর্ট্রেটের জন্য ... রানটাইমের সময় ডিভাইসটি আমাদের পছন্দমতো আকারের শ্রেণি (ইউআই লেআউট) ব্যবহার করার উপায় আছে কি? ?

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

// Call to modify the trait collection for child view controllers.
- (void)setOverrideTraitCollection:(UITraitCollection *)collection forChildViewController:(UIViewController *)childViewController NS_AVAILABLE_IOS(8_0);
- (UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController NS_AVAILABLE_IOS(8_0);

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

এখানে একটি নমুনা বাস্তবায়ন যা এটি করে, 'পিতামাতার' দর্শন নিয়ামকটিতে:

@interface RDTraitCollectionOverrideViewController : UIViewController {
    BOOL _willTransitionToPortrait;
    UITraitCollection *_traitCollection_CompactRegular;
    UITraitCollection *_traitCollection_AnyAny;
}
@end

@implementation RDTraitCollectionOverrideViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setUpReferenceSizeClasses];
}

- (void)setUpReferenceSizeClasses {
    UITraitCollection *traitCollection_hCompact = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
    UITraitCollection *traitCollection_vRegular = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassRegular];
    _traitCollection_CompactRegular = [UITraitCollection traitCollectionWithTraitsFromCollections:@[traitCollection_hCompact, traitCollection_vRegular]];

    UITraitCollection *traitCollection_hAny = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassUnspecified];
    UITraitCollection *traitCollection_vAny = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassUnspecified];
    _traitCollection_AnyAny = [UITraitCollection traitCollectionWithTraitsFromCollections:@[traitCollection_hAny, traitCollection_vAny]];
}

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    _willTransitionToPortrait = self.view.frame.size.height > self.view.frame.size.width;
}

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]
    _willTransitionToPortrait = size.height > size.width;
}

-(UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController {
    UITraitCollection *traitCollectionForOverride = _willTransitionToPortrait ? _traitCollection_CompactRegular : _traitCollection_AnyAny;
    return traitCollectionForOverride;
}
@end

এটি কাজ করে কিনা তা দেখার জন্য একটি দ্রুত ডেমো হিসাবে, আমি আইবিতে শিশু নিয়ন্ত্রক বিন্যাসের 'নিয়মিত / নিয়মিত' এবং 'কমপ্যাক্ট / নিয়মিত' সংস্করণগুলিতে বিশেষ করে কাস্টম লেবেল যুক্ত করেছি:

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

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

ভয়েলা! রানটাইম কাস্টম আকার শ্রেণীর কনফিগারেশন।

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

~

সম্পাদনা (6/4/15): দয়া করে মনে রাখবেন যে উপরের নমুনা কোডটি কৌশলটি প্রদর্শনের জন্য মূলত ধারণার প্রমাণ। আপনার নিজস্ব নির্দিষ্ট অ্যাপ্লিকেশনটির জন্য প্রয়োজনীয় হিসাবে খাপ খাইয়ে নিচ্ছেন।

~

সম্পাদনা (7/24/15): এটি সন্তোষজনক যে উপরোক্ত ব্যাখ্যাটি সমস্যাটিকে ক্ষুন্ন করতে সহায়তা করেছে। যদিও আমি এটি পরীক্ষা করে নিই না, mohamede1945 [নীচে] কোডটি ব্যবহারিক উদ্দেশ্যে কার্যকর অপ্টিমাইজেশানের মতো দেখায়। এটি নির্দ্বিধায় পরীক্ষা করে দেখুন এবং আপনার কি ধারণা তা আমাদের জানান। (সম্পূর্ণতার স্বার্থে, আমি নমুনা কোডটি যেমন রয়েছে ঠিক তেমন রেখে দেব)


4
দুর্দান্ত পোস্ট @ রোনডায়ামন্ড!
আমেরগিন

4
অ্যাপল সাফারি প্রস্থের আকারের শ্রেণি পুনরায় সংজ্ঞায়িত করার জন্য অনুরূপ পন্থা গ্রহণ করে, তাই আপনি আশ্বস্ত থাকতে পারেন যে এটি একটি কম বা কম সমর্থিত পদ্ধতি। আপনার অতিরিক্ত আইভারগুলির সত্যিই প্রয়োজন হবে না; UITraitCollectionযথেষ্ট অপ্টিমাইজড এবং overrideTraitCollectionForChildViewControllerএটিকে খুব কমই বলা হয় যে প্রস্থের চেকটি করার পরে এটি তৈরি করার কোনও সমস্যা হওয়া উচিত নয়।
zwaldowski

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

4
@ রশ্মি: যেমনটি আমি ব্যাখ্যায় ইঙ্গিত করেছি, শেষ পর্যন্ত আপনি কোনটি বেছে নিন তা বিবেচ্য নয় - আপনি কেবলমাত্র এক জোড়া এনাম মানগুলিতে লেআউট (গুলি) ম্যাপিং করছেন। সুতরাং আপনি যে কোনও "আকারের শ্রেণি" আপনার পক্ষে উপলব্ধি করে তা সত্যই ব্যবহার করতে পারেন। আমি কেবলমাত্র এটি নিশ্চিত করেছিলাম যে এটি ডিফল্ট হিসাবে কোথাও উত্তরাধিকার সূত্রে প্রাপ্ত কিছু অন্যান্য (বৈধ) আকারের শ্রেণীর সাথে বিরোধ নয়।
রনডায়ামন্ড

4
শিশু দেখার নিয়ামক হিসাবে, আমি মনে করি না যে এটি গুরুত্বপূর্ণ matters আপনি নিয়মিতভাবে নিয়ামক হিসাবে শিশু নিয়ামক হিসাবে যুক্ত হওয়া অবধি প্রোগ্রামিয়ালি বা কোনও নিব থেকে এটি ইনস্ট্যান্ট করতে সক্ষম হওয়া উচিত।
রনডায়ামন্ড

41

রনডায়ামন্ডের খুব দীর্ঘ উত্তরের সংক্ষিপ্তসার হিসাবে। আপনাকে যা করতে হবে তা হ'ল আপনার রুট ভিউ নিয়ন্ত্রণকারী in

উদ্দেশ্য গ

- (UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController
{
    if (CGRectGetWidth(self.view.bounds) < CGRectGetHeight(self.view.bounds)) {
        return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
    } else {
        return [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
    }
}

দ্রুত:

override func overrideTraitCollectionForChildViewController(childViewController: UIViewController) -> UITraitCollection! {
        if view.bounds.width < view.bounds.height {
            return UITraitCollection(horizontalSizeClass: .Compact)
        } else {
            return UITraitCollection(horizontalSizeClass: .Regular)
        }
    }

তারপরে স্টোরিবোর্ডে ল্যান্ডস্কেপের জন্য প্রতিকৃতি এবং নিয়মিত প্রস্থের জন্য কমপ্যাক্ট প্রস্থ ব্যবহার করুন।


আমি ভাবছি কীভাবে এটি নতুন বিভক্ত স্ক্রিন মোডগুলি নিয়ে কাজ করবে ... এটির একটি উপায় খুঁজে বের করুন!
mm2001

ইউআইটিআরএটকল্যাণটি শুধুমাত্র আইওএস 8.0+
mohamede1945

আমার জন্য কাজ করে না আমার দুটি কন্টেইনারভিউ সহ একটি দৃষ্টিভঙ্গি রয়েছে যা এটিকে ওরিয়েন্টেশনের উপর নির্ভর করে ভিন্ন স্থানে দেখানো দরকার। আমি সমস্ত প্রয়োজনীয় আকারের ক্লাস তৈরি করেছি যা আইফোনের জন্য কাজ করে। আমি আপনার কোডটি চেষ্টা করে আইপ্যাডের ওরিয়েন্টেশনটি পৃথক করার জন্যও করেছি। তবে এটি কেবল মতামতের উপর অদ্ভুত অভিনয় করবে। এটি এটি যেমন অনুমিত হয় তেমন পরিবর্তন করে না। কোন সূত্র কি হতে পারে?
NoSixties

4
আমি - (UITraitCollection *)traitCollectionপরিবর্তে ওভাররড করার সময় এটি আমার পক্ষে কাজ করেছিল overrideTraitCollectionForChildViewController। এছাড়াও সীমাবদ্ধতাগুলি ট্র্যাফিকোলকেশনের সাথে মেলে, তাই ডাব্লুসি (হাই)
এইচ। ডি জঞ্জো

4
@ এপোলো আমি চাই তবে এটি আসল প্রশ্নের উত্তর দেবে না। অ্যাপল এর কীভাবে সেট ওভাররাইড
ম্যালাল

5

প্রতিকৃতি এবং ল্যান্ডস্কেপের মধ্যে কোনও পার্থক্য না করে, আইপ্যাডে অনুভূমিক এবং উল্লম্ব উভয় মাত্রার জন্য 'নিয়মিত' আকারের বৈশিষ্ট্য রয়েছে।

এই আকারের বৈশিষ্ট্যগুলি আপনার কাস্টম UIViewControllerসাবক্লাস কোডে পদ্ধতির মাধ্যমে ওভাররাইড করা যেতে পারে traitCollection, উদাহরণস্বরূপ:

- (UITraitCollection *)traitCollection {
    // Distinguish portrait and landscape size traits for iPad, similar to iPhone 7 Plus.
    // Be aware that `traitCollection` documentation advises against overriding it.
    UITraitCollection *superTraits = [super traitCollection];
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UITraitCollection *horizontalRegular = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
        UITraitCollection *verticalRegular = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassRegular];
        UITraitCollection *regular = [UITraitCollection traitCollectionWithTraitsFromCollections:@[horizontalRegular, verticalRegular]];

        if ([superTraits containsTraitsInCollection:regular]) {
            if (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])) {
                // iPad in portrait orientation
                UITraitCollection *horizontalCompact = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];
                return [UITraitCollection traitCollectionWithTraitsFromCollections:@[superTraits, horizontalCompact, verticalRegular]];
            } else {
                // iPad in landscape orientation
                UITraitCollection *verticalCompact = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassCompact];
                return [UITraitCollection traitCollectionWithTraitsFromCollections:@[superTraits, horizontalRegular, verticalCompact]];
            }
        }
    }
    return superTraits;
}

- (BOOL)prefersStatusBarHidden {
    // Override to negate this documented special case, and avoid erratic hiding of status bar in conjunction with `traitCollection` override:
    // For apps linked against iOS 8 or later, this method returns true if the view controller is in a vertically compact environment.
    return NO;
}

এটি আইপ্যাডকে আইফোন 7 প্লাসের মতো একই আকারের বৈশিষ্ট্য দেয়। নোট করুন যে অন্যান্য আইফোন মডেলগুলিতে অরিয়েন্টেশন নির্বিশেষে সাধারণত 'কমপ্যাক্ট প্রস্থ' বৈশিষ্ট্য (নিয়মিত প্রস্থের চেয়ে) থাকে।

আইফোন Plus প্লাসটিকে এইভাবে অনুকরণ করা সেই মডেলটিকে Xcode এর ইন্টারফেস বিল্ডারে আইপ্যাডের জন্য স্ট্যান্ড-ইন হিসাবে ব্যবহার করার অনুমতি দেয় যা কোডটিতে কাস্টমাইজেশন সম্পর্কে অবগত নয়।

সচেতন থাকুন আইপ্যাডে স্প্লিট ভিউ স্বাভাবিক পূর্ণ স্ক্রিন অপারেশন থেকে বিভিন্ন আকারের বৈশিষ্ট্য ব্যবহার করতে পারে।

এই উত্তরটি এই ব্লগ পোস্টে গৃহীত পদ্ধতির উপর ভিত্তি করে কিছু উন্নতি সহ ।

আপডেট 2019-01-02: আইপ্যাড ল্যান্ডস্কেপে অন্তর্বর্তী লুকানো স্ট্যাটাস বার, এবং (আরও নতুন) বৈশিষ্ট্যগুলি ট্রাম্পলিংয়ের জন্য আপডেট করা হয়েছে UITraitCollection। আরও উল্লেখ করা হয়েছে যে অ্যাপল ডকুমেন্টেশনগুলি আসলে ওভাররাইডের বিরুদ্ধে প্রস্তাব দেয় traitCollection, তাই ভবিষ্যতে এই কৌশলটি নিয়ে সমস্যা হতে পারে।


অ্যাপল উল্লেখ করেছে যে traitCollectionসম্পত্তি কেবল পঠনযোগ্য: বিকাশকারী
অ্যাপ্লিকেশন

4

রনডায়ামন্ডের দীর্ঘ এবং সহায়ক উত্তরটি নীতিগুলি বোঝার জন্য একটি ভাল শুরু, তবে আমার পক্ষে যে কোডটি (আইওএস 8+) কাজ করেছিল সেটি ওভাররাইডিং পদ্ধতির উপর ভিত্তি করে (UITraitCollection *)traitCollection

সুতরাং, প্রস্থ - কমপ্যাক্টের পরিবর্তনের সাথে ইন্টারফেসবিল্ডারে সীমাবদ্ধতা যুক্ত করুন, উদাহরণস্বরূপ সীমাবদ্ধতার সম্পত্তি ইনস্টল করা হয়েছে। সুতরাং প্রস্থ - যে কোনও ল্যান্ডস্কেপ, প্রস্থ - প্রতিকৃতির জন্য প্রতিকৃতির জন্য বৈধ হবে।

বর্তমান দেখুন নিয়ামক আকারের উপর ভিত্তি করে কোডে সীমাবদ্ধতাগুলি স্যুইচ করতে, কেবলমাত্র আপনার ইউআইভিউউকন্ট্রোলার শ্রেণিতে নিম্নলিখিতটি যুক্ত করুন:

- (UITraitCollection *)traitCollection
{
    UITraitCollection *verticalRegular = [UITraitCollection traitCollectionWithVerticalSizeClass:UIUserInterfaceSizeClassRegular];

    if (self.view.bounds.size.width < self.view.bounds.size.height) {
        // wCompact, hRegular
        return [UITraitCollection traitCollectionWithTraitsFromCollections:
                @[[UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact],
                  verticalRegular]];
    } else {
        // wRegular, hRegular
        return [UITraitCollection traitCollectionWithTraitsFromCollections:
                @[[UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular],
                  verticalRegular]];
    }
}

0

আপনার ল্যান্ডস্কেপ মোড আপনার প্রতিকৃতি মোডের তুলনায় কতটা আলাদা হতে চলেছে? যদি এটির থেকে আলাদা হয় তবে ডিভাইস ল্যান্ডস্কেপ এ থাকা অবস্থায় এটি অন্য ভিউ কন্ট্রোলার তৈরি করা এবং লোড করা ভাল ধারণা হতে পারে

উদাহরণ স্বরূপ

    if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) 
    //load landscape view controller here

হ্যাঁ এটি একটি বিকল্প। তবে আমি এটিকে সর্বাধিক অনুকূল মনে করি না। আমার বক্তব্যটি যদি আইওএস 8-এ আইফোনের জন্য প্রতিকৃতি এবং ল্যান্ডস্কেপ মোডের জন্য বিভিন্ন আকারের শ্রেণি বৈশিষ্ট্যগুলি ব্যবহার করার বিকল্প থাকে তবে আইপ্যাডের জন্য কেন একই নয়?
নীলিআইপিপি

এক্সকোড 6 এর আগে, আমরা বিভিন্ন অরিয়েন্টেশনের জন্য বিভিন্ন স্টোরিবোর্ড ব্যবহার করতে পারি। যদি বেশিরভাগ ভিউ কন্ট্রোলার একই থাকে তবে এটি খুব দক্ষ নয়। তবে এটি বিভিন্ন লেআউটের জন্য খুব সুবিধাজনক। এক্সকোড 6-এ, এটি করার কোনও উপায় নেই। ভিন্ন ভিন্ন অভিযোজনের জন্য আলাদা ভিউ কন্ট্রোলার তৈরি করা একমাত্র সমাধান।
বাগসফ্লায়ার

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

0

সুইফট 5 সংস্করণ। এটা ভাল কাজ করে।

override func overrideTraitCollection(forChild childViewController: UIViewController) -> UITraitCollection? {
    if UIScreen.main.bounds.width > UIScreen.main.bounds.height {
        let collections = [UITraitCollection(horizontalSizeClass: .regular),
                           UITraitCollection(verticalSizeClass: .compact)]
        return UITraitCollection(traitsFrom: collections)
    }
    return super.overrideTraitCollection(forChild: childViewController)
}

-3

@ রনডায়ামন্ড সমাধানের জন্য সুইফট code.০ কোড

class Test : UIViewController {


var _willTransitionToPortrait: Bool?
var _traitCollection_CompactRegular: UITraitCollection?
var _traitCollection_AnyAny: UITraitCollection?

func viewDidLoad() {
    super.viewDidLoad()
    self.upReferenceSizeClasses = null
}

func setUpReferenceSizeClasses() {
    var traitCollection_hCompact: UITraitCollection = UITraitCollection(horizontalSizeClass: UIUserInterfaceSizeClassCompact)
    var traitCollection_vRegular: UITraitCollection = UITraitCollection(verticalSizeClass: UIUserInterfaceSizeClassRegular)
    _traitCollection_CompactRegular = UITraitCollection(traitsFromCollections: [traitCollection_hCompact,traitCollection_vRegular])
    var traitCollection_hAny: UITraitCollection = UITraitCollection(horizontalSizeClass: UIUserInterfaceSizeClassUnspecified)
    var traitCollection_vAny: UITraitCollection = UITraitCollection(verticalSizeClass: UIUserInterfaceSizeClassUnspecified)
    _traitCollection_AnyAny = UITraitCollection(traitsFromCollections: [traitCollection_hAny,traitCollection_vAny])
}

func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    _willTransitionToPortrait = self.view.frame.size.height > self.view.frame.size.width
}

func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    _willTransitionToPortrait = size.height > size.width
}

func overrideTraitCollectionForChildViewController(childViewController: UIViewController) -> UITraitCollection {
    var traitCollectionForOverride: UITraitCollection = _willTransitionToPortrait ? _traitCollection_CompactRegular : _traitCollection_AnyAny
    return traitCollectionForOverride
}}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.