এটি উভয়ই আইপ্যাড ওরিয়েন্টেশনকে একইরকম আচরণ করার জন্য অ্যাপলের অভিপ্রায় হিসাবে উপস্থিত বলে মনে হয় - তবে আমাদের বেশিরভাগ লোক সন্ধান করছে, আইপ্যাড পোর্ট্রেট বনাম আইপ্যাড ল্যান্ডস্কেপের জন্য ইউআই লেআউটের পরিবর্তনের জন্য খুব বৈধ নকশার কারণ রয়েছে।
দুর্ভাগ্যক্রমে, বর্তমান ওএস এই পার্থক্যের জন্য সমর্থন সরবরাহ করে বলে মনে হচ্ছে না ... এর অর্থ আমরা অ্যাডাপটিভ ইউআই ব্যবহার করে আদর্শভাবে কী অর্জন করতে সক্ষম হব তা অর্জনের জন্য কোড বা অনুরূপ কাজের ক্ষেত্রগুলিতে স্বয়ংক্রিয় বিন্যাসের সীমাবদ্ধতাগুলি ম্যানিপুলেট করতে ফিরে এসেছি meaning ।
একটি মার্জিত সমাধান নয়।
কোনও অ্যাপলিকেশন ইতিমধ্যে আইবি এবং ইউআইকিট তৈরি করে এমন জাদুটি উপার্জনের কোনও উপায় নেই যা প্রদত্ত দিকনির্দেশনার জন্য আমাদের নির্বাচনের আকারের শ্রেণিটি ব্যবহার করার জন্য?
~
সমস্যাটি আরও উদারভাবে চিন্তা করতে গিয়ে আমি বুঝতে পেরেছিলাম যে 'সাইজের ক্লাসগুলি' কেবল আইবিতে সঞ্চিত একাধিক লেআউটকে সম্বোধন করার উপায়, যাতে রানটাইমের সময় তাদের প্রয়োজন মতো ডেকে আনা যায়।
আসলে, 'আকারের শ্রেণি' আসলে এনাম মানগুলির একটি জুড়ি a UIInterface.h থেকে:
typedef NS_ENUM(NSInteger, UIUserInterfaceSizeClass) {
UIUserInterfaceSizeClassUnspecified = 0,
UIUserInterfaceSizeClassCompact = 1,
UIUserInterfaceSizeClassRegular = 2,
} NS_ENUM_AVAILABLE_IOS(8_0);
মৌলিকভাবে অ্যাপল এই বিভিন্ন প্রকারের নামকরণের সিদ্ধান্ত নিয়েছে তা বিবেচনা না করেই , আইবিতে সঞ্চিত একটি বিন্যাসকে অন্যের থেকে আলাদা করার জন্য এরা কেবল একজোড়া পূর্ণসংখ্যার অনন্য পরিচয়কারী হিসাবে ব্যবহৃত হয়।
এখন, ধরুন যে আমরা আইবিতে একটি বিকল্প লেআউট (অব্যবহৃত আকারের ক্লাস ব্যবহার করে) তৈরি করি - বলুন, আইপ্যাড পোর্ট্রেটের জন্য ... রানটাইমের সময় ডিভাইসটি আমাদের পছন্দমতো আকারের শ্রেণি (ইউআই লেআউট) ব্যবহার করার উপায় আছে কি? ?
সমস্যার দিকে বিভিন্ন (কম মার্জিত) পদ্ধতির চেষ্টা করার পরে, আমি সন্দেহ করেছি যে প্রোগ্রামটিমে ডিফল্ট আকারের ক্লাসটি ওভাররাইড করার কোনও উপায় থাকতে পারে। এবং রয়েছে (ইউআইভিউউকন্ট্রোলআরএইচ):
- (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 [নীচে] কোডটি ব্যবহারিক উদ্দেশ্যে কার্যকর অপ্টিমাইজেশানের মতো দেখায়। এটি নির্দ্বিধায় পরীক্ষা করে দেখুন এবং আপনার কি ধারণা তা আমাদের জানান। (সম্পূর্ণতার স্বার্থে, আমি নমুনা কোডটি যেমন রয়েছে ঠিক তেমন রেখে দেব)