আইওএস 6: আমি কীভাবে কিছু দৃশ্য প্রতিকৃতিতে সীমাবদ্ধ করব এবং অন্যকে ঘোরানোর অনুমতি দেব?


100

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

আইওএস 5-এ আমি অনুমোদিত shouldAutorotateToInterfaceOrientation:প্রতিটি দৃশ্যের জন্য হ্যাঁ ফিরিয়ে দেওয়ার জন্য আমার প্রতিটি দৃশ্যের নিয়ামককে কেবল সংজ্ঞায়িত করেছি। উপরের বর্ণনানুসারে সমস্ত কিছুই কাজ করেছিল, ভিউ কন্ট্রোলার # 4 থেকে # 3 এ ফিরে আসার পরেও ডিভাইসটি ল্যান্ডস্কেপ অভিযোজনে ধারণ করা থাকলেও প্রতিকৃতিতে ফিরে আসা সহ।

আইওএস 6-এ সমস্ত দর্শনীয় কন্ট্রোলার ল্যান্ডস্কেপে ঘোরান, যা বোঝায়নি সেগুলি ভেঙে। আইওএস release প্রকাশের নোট বলেছে

আরও দায়বদ্ধতা অ্যাপ্লিকেশন এবং অ্যাপ প্রতিনিধির দিকে চলেছে। এখন, আইওএস পাত্রে (যেমন UINavigationController) তাদের বাচ্চাদের অটোরিটেশন করা উচিত কিনা তা নির্ধারণের জন্য তাদের সাথে পরামর্শ করে না। [...] সিস্টেমটি তার সর্বোচ্চ সমর্থিত পূর্ণ-স্ক্রিন ভিউ কন্ট্রোলারকে (সাধারণত রুট ভিউ কন্ট্রোলার) তার সমর্থিত ইন্টারফেস ওরিয়েন্টেশনগুলির জন্য জিজ্ঞাসা করে যখনই ডিভাইসটি ঘোরানো হয় বা যখনই কোনও দৃশ্যের নিয়ামককে পূর্ণ-স্ক্রিন মডেল উপস্থাপনা শৈলীর সাথে উপস্থাপন করা হয়। তদতিরিক্ত, সমর্থিত ওরিয়েন্টেশনগুলি কেবল তখনই পুনরুদ্ধার করা হয় যদি এই দৃশ্যের নিয়ামকটি তার shouldAutorotateপদ্ধতি থেকে YES ফেরত দেয় । [...] শীর্ষস্থানীয় পূর্ণ-স্ক্রীন নিয়ামকের পদ্ধতিতে supportedInterfaceOrientationsForWindow:ফিরে আসা মান দিয়ে অ্যাপ্লিকেশনটির পদ্ধতিতে ফেরত মানকে ছেদ করে একটি ওরিয়েন্টেশন সমর্থিত কিনা তা সিস্টেমটি নির্ধারণ করে supportedInterfaceOrientations

সুতরাং আমি সাবক্লাস করেছি UINavigationController, আমার MainNavigationControllerবুলিয়ান সম্পত্তি দিয়েছি landscapeOKএবং এটি অনুমোদিত অনুমতিগুলি ফিরিয়ে দিতে ব্যবহার করেছি supportedInterfaceOrientations। তারপরে আমার প্রতিটি ভিউ কন্ট্রোলারের viewWillAppear:পদ্ধতিতে আমার এর মতো লাইন থাকে

    [(MainNavigationController*)[self navigationController] setLandscapeOK:YES];

আমার MainNavigationControllerকাঙ্ক্ষিত আচরণ বলতে ।

এখানে প্রশ্নটি আসে: আমি যদি এখন পোর্ট্রেট মোডে আমার চতুর্থ দর্শনে নেভিগেট করি এবং ফোনটিকে তার উপরে ঘুরিয়ে দেব তবে ল্যান্ডস্কেপে ঘুরছি। এখন আমি আমার তৃতীয় দৃশ্যে ফিরে আসতে বোতাম টিপুন যা কেবল প্রতিকৃতিতে কাজ করার কথা। কিন্তু এটি পিছনে ঘুরবে না। আমি কীভাবে এটি করতে পারি?

আমি চেষ্টা করেছিলাম

    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]

মধ্যে viewWillAppearআমার তৃতীয় দৃশ্য নিয়ামক পদ্ধতি, কিন্তু এটা কিছু না। এটি কল করার ভুল পদ্ধতি বা এটি কল করার জন্য ভুল জায়গা হতে পারে বা আমার পুরো জিনিসটি সম্পূর্ণ ভিন্ন উপায়ে বাস্তবায়ন করা উচিত?

উত্তর:


96

আমার একই সমস্যা ছিল এবং আমার কাছে কার্যকর এমন একটি সমাধান খুঁজে পেয়েছি। এটিকে কাজ করতে, আপনার ইউআইএনএভিগেশন কন্ট্রোলারটিতে এটি প্রয়োগ করা যথেষ্ট নয়- (NSUInteger)supportedInterfaceOrientations । আপনার নিয়ামক # 3 এও আপনাকে এই পদ্ধতিটি প্রয়োগ করতে হবে, যা নিয়ামক # 4 পপিংয়ের পরে কেবল পোর্ট্রেট হবে। সুতরাং, আমার ইউআইএনএভিগেশন নিয়ন্ত্রকটিতে আমার কাছে নিম্নলিখিত কোড রয়েছে:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if (self.isLandscapeOK) {
        // for iPhone, you could also return UIInterfaceOrientationMaskAllButUpsideDown
        return UIInterfaceOrientationMaskAll;
    }
    return UIInterfaceOrientationMaskPortrait;
}

নিয়ন্ত্রক # 3 এ দেখুন, নিম্নলিখিত যুক্ত করুন:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

আপনার ভিউ কন্ট্রোলারদের # 1, # 2, এবং # 4 এ কোনও যোগ করার দরকার নেই। এটি আমার পক্ষে কাজ করে, আমি আশা করি এটি আপনাকে সহায়তা করবে।


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

4
এসও-তে বিভিন্ন 100 টির উত্তরের মধ্যে, এটি হ'ল সত্যই কাজ করে। ধন্যবাদ :-)
ক্রিস্টার নর্ডভিক

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

4
কী যদি পছন্দসই ল্যান্ডস্কেপ ভিউ কন্ট্রোলারটি কোনও সিগ থেকে উপস্থাপন করা হয় এবং কোনও নেভিগেশন নিয়ামক নেই?
jesses.co.tt

4
রিটার্ন টাইপ হিসাবে সর্বশেষ এনএসইউইন্টার হিসাবে সম্পাদনা করুন।
আপত্তিজনক

69

একটি কাস্টমনাভিগেশন নিয়ন্ত্রণকারী যুক্ত করুন

এতে এই পদ্ধতিগুলি ওভাররাইড করুন:

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

এখন plist এ সমস্ত ওরিয়েন্টেশন যুক্ত করুন

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

ভিউ কন্ট্রোলারে কেবলমাত্র প্রয়োজনীয়গুলি যুক্ত করুন:

-(BOOL)shouldAutorotate
{
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

এই পদ্ধতিগুলি নেভিগেশন নিয়ন্ত্রক পদ্ধতিগুলিকে ওভাররাইড করে


5
আপনি সত্যিই এই উত্তর দিয়ে পেরেক! তোমাকে অনেক ধন্যবাদ. আপনি সত্যিই অনেক সাহায্য করেছেন। এটি কিছু সময়ের জন্য আমার জন্য একটি বড় সমস্যা হয়ে দাঁড়িয়েছে। দারূন কাজ.
কে

ধন্যবাদ! এটি আমাকে খুঁজে বের করতে এত সময় এবং শক্তি নিয়েছিল!
বিকেবিচ্ল্যাবস

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

কল্পনাপ্রসূত। ঠিক আমার যা প্রয়োজন ছিল। ধন্যবাদ.
এমসজারো

কী যদি পছন্দসই ল্যান্ডস্কেপ ভিউ কন্ট্রোলারটি কোনও সিগ থেকে উপস্থাপন করা হয় এবং কোনও নেভিগেশন নিয়ামক নেই?
jesses.co.tt

9

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

প্রথমে নিশ্চিত হয়ে নিন যে আপনার প্রকল্পের টার্গেটে আপনার সমর্থিত ইন্টারফেস ওরিয়েন্টেশনগুলিতে আপনার ঘোরানোর দৃশ্যের জন্য আপনি যে সমস্ত ওরিয়েন্টেশন চান তা রয়েছে।

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

এরপরে, একটি বিভাগ তৈরি করুন UINavigationController(যেহেতু অ্যাপল এটিকে সাবক্লাস না করে বলে):

@implementation UINavigationController (iOS6AutorotationFix)

-(BOOL)shouldAutorotate {
    return [self.topViewController shouldAutorotate];
}

@end

আপনার বিভাগের যে RotatingViewControllerশীর্ষস্থানীয় দর্শনীয় নিয়ামক থাকতে পারে সেই বিভাগটি এবং যে ভিউ কন্ট্রোলারটি আপনি ঘোরানোতে সক্ষম হতে চান (যা আমি কল করব ) তা আমদানি করুন । সেই দৃশ্যের নিয়ামকটিতে, shouldAutorotateনিম্নলিখিত হিসাবে প্রয়োগ করুন । দ্রষ্টব্য যে আপনি একই ঘূর্ণন করতে চান একই দেখতে নিয়ন্ত্রক হওয়া উচিত নয়।

-(BOOL)shouldAutorotate {

    BOOL shouldRotate = NO;

    if ([navigationController.topViewController isMemberOfClass:[RotatingViewController class]] ) {
        shouldRotate = [navigationController.topViewController shouldAutorotate];
    }

    return shouldRotate;
}

অবশেষে, আপনার মধ্যে RotatingViewController, প্রয়োগ করুন shouldAutorotateএবং নীচে supportedInterfaceOrientations:

-(BOOL)shouldAutorotate {
    // Preparations to rotate view go here
    return YES;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown; // or however you want to rotate
}

আপনার এটির কারণটি হ'ল কারণ আইওএস 6 শীর্ষ দর্শনীয় কন্ট্রোলারের পরিবর্তে রুট ভিউ নিয়ন্ত্রণকারীকে ঘূর্ণনের নিয়ন্ত্রণ দেয়। যদি আপনি স্ট্যাকের অন্যান্য দৃশ্যের তুলনায় পৃথক দৃশ্যের ঘূর্ণনটি আলাদাভাবে আচরণ করতে চান তবে আপনাকে এটির জন্য রুট ভিউ নিয়ামকটিতে একটি নির্দিষ্ট কেস লিখতে হবে।


4
এটি একটি দুর্দান্ত উত্তর যা আরও বেশি ভালবাসার দাবি রাখে। এখানে তথ্যের টুকরোটি এতে রয়েছে যে আমি অন্য কোথাও খুঁজে পাইনি এবং যা সমালোচনাযোগ্য: যদি আপনি কোনও পৃথক দৃশ্যের ঘূর্ণনটি স্ট্যাকের অন্যান্য দৃশ্যের তুলনায় আলাদা আচরণ করতে চান তবে আপনাকে এর জন্য মূলটিতে একটি নির্দিষ্ট কেস লিখতে হবে নিয়ামক দেখুন
shmim

আমি মনে করি এটির কাজ যদি আপনার অ্যাপের স্টোরিবোর্ডের প্রথম সদস্য হিসাবে প্রাথমিক নিয়ামক হিসাবে কোনও নেভিগেশন কন্ট্রোলার থাকে তবে প্রাথমিক নিয়ামক কেবল একটি ভিউকন্ট্রোলার হলে কী হবে?
হাঁস

4

@ ব্রায়ানের উত্তরে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই তাই আমি আমার নোটটি এখানে যুক্ত করব।

ব্রায়ান উল্লেখ করেছিলেন যে আইওএস রুটভিউ কনট্রোলারকে আবর্তন নিয়ন্ত্রণ দেয় - এটি কেবল উল্লিখিত হিসাবে একটি ইউআইএনএভিগেশন কন্ট্রোলার হতে পারে না তবে এটি একটি ইউআইটিববারকন্ট্রোলারও হতে পারে যা এটি আমার পক্ষে ছিল। আমার কাঠামোটি এমন দেখাচ্ছে:

  • ইউআইটিববারকন্ট্রোলার
    • ইউআইএনএভিগেশন কন্ট্রোলার
      • ইউআইভিউউকন্ট্রোলার ...
    • ইউআইএনএভিগেশন কন্ট্রোলার
      • ইউআইভিউউকন্ট্রোলার ...

সুতরাং আমি প্রথমে কাস্টম ইউআইটিববারকন্ট্রোলারে, তারপরে একটি কাস্টম ইউআইএনএভিগেশন কন্ট্রোলার এবং তারপরে শেষ পর্যন্ত নির্দিষ্ট ইউআইভিউকন্ট্রোলারের মধ্যে পদ্ধতিগুলি যুক্ত করেছি।

ইউআইটিববারকন্ট্রোলার এবং ইউআইএনএভিগেশন কন্ট্রোলার থেকে উদাহরণ:

- (BOOL)shouldAutorotate {
    return [self.viewControllers.lastObject shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.viewControllers.lastObject supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return [self.viewControllers.lastObject shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}

আমি আমার ইউট্যাববারকন্ট্রোলারটিকে আমার রুট ভিউ কন্ট্রোলারে একটি উদাহরণ ভেরিয়েবল হিসাবে ব্যবহার করেছি কারণ আপনি before.০ এর আগে আইওএস সংস্করণগুলিতে ইউআইটিববারকন্ট্রোলারকে সাবক্লাস করার কথা না এবং আইওএস ৫.০ এ ফিরে যেতে আমার সমর্থন প্রয়োজন।
ব্রায়ান

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

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

3

আমি আমার নিজের প্রশ্নের একটি আংশিক উত্তর দিতে চাই। আমি নিম্নলিখিত কোডের লাইনটি পেয়েছি, viewWillAppearআমার তৃতীয়টির পদ্ধতিতে ব্যবহৃত হয়েছিল UIViewController, কাজ করার জন্য:

[[UIDevice currentDevice] 
      performSelector:NSSelectorFromString(@"setOrientation:") 
           withObject:(id)UIInterfaceOrientationPortrait];

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

আমি এটি সহজেই কাজ করি বলে এটি আমার অ্যাপে ছেড়ে যেতে খুব প্রলুব্ধ simply তবে এটি ঠিক মনে হচ্ছে না তাই আমি একটি পরিষ্কার সমাধানের জন্য প্রশ্নটি উন্মুক্ত রাখতে চাই।


4
আপনার অ্যাপ্লিকেশনটি যদি আপনি এটি সেখানে রেখে দেন তবে সম্ভবত তা প্রত্যাখ্যান করা হবে। আমিও এর সমাধান খুঁজছি, তবে দেখে মনে হচ্ছে এটি সম্ভব নয়। আমি যা কিছু পাই তা এই প্রশ্নের উত্তর: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 19১630000০০ / sort এটি বিভিন্ন ধরণের কাজ করে তবে কোনও কারণে এটি আমার ভিউকন্ট্রোলারগুলির মধ্যে একটিতে বোতাম টাচ হ্যান্ডলিংটি ভেঙে দেয়
লপ

আমি আমার সম্ভাবনা নিয়েছি এবং অ্যাপলের কাছে জমা দিয়েছি। এখনও পর্যালোচনার জন্য অপেক্ষা করছি ... আমি আপনাকে পোস্ট রাখব।
হ্যারাল্ড ব্যাগহোলজ

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

4
@ হারাল্ডবেগেহোলজ গ্রাট সুগারেশন। আমি যখন এআরসি দিয়ে নতুন এক্সকোডে কাজ করছি তখন আমি উত্তরগুলি ব্যবহার করতে পারি না। আমি "NSInteger এর কাস্ট অব আইডি তে পেয়ে যাচ্ছি (এআরসি ইনট) এআরসি পারফর্মসিটেক্টরের সাথে অনুমোদিত নয় এটির ফাঁস হতে পারে কারণ এর নির্বাচকটি অজানা" আমি কীভাবে এটি সমাধান করতে পারি? আমরা যদি সমাধান পেয়ে যাই তবে আমি সত্যিই আপনার কাছে সন্তুষ্ট। যখন আমি কিছু ফাঁস হওয়া তথ্যের কারণে অ্যাপ ক্র্যাশের তুলনায় পার্টিকুলার ভিউয়ের জন্য যখন আরসি বন্ধ করি। অনুগ্রহ করে আমাকে প্রস্তাব দিন
হিতার্থ

4
একটি প্রাইভেট এপিআই ব্যবহার করা সমাধান এর আগে কখনও নয়।
জাভিয়ের সোটো

1

এটি আমি আইওএস 6.0 তে ওরিয়েন্টেশন সমর্থনের জন্য ব্যবহার করছি

-(BOOL)shouldAutorotate{
    return YES;
}  

 - (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskAll;
}


- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{  
  return UIInterfaceOrientationPortrait;
}

1

যেহেতু এটি একটি সর্বাধিক দেখা থ্রেড। আমি ভেবেছিলাম যে আমি যা বিশ্বাস করি তা যুক্ত করা সহজতম উত্তর। এটি ios8 এবং তার চেয়ে বেশি সময়ের জন্য কাজ করে

-(BOOL)shouldAutorotate
{
    return YES;
}

এবং

-(UIInterfaceOrientationMask)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

এটাই. উপভোগ করুন!

ওহ, এবং আমার ভিউকন্ট্রোলারগুলি একটি নেভিগেশন নিয়ামককে এম্বেড করা হয়েছে, যা আমার কোনও উপায়ে শ্রেণিবদ্ধ বা কনফিগার করার প্রয়োজন হয়নি।


0

এটি সবার জন্য নাও কার্যকর হতে পারে তবে এটি আমার পক্ষে দুর্দান্ত কাজ করে। প্রয়োগের পরিবর্তে ...

[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];

আমার সমস্ত কন্ট্রোলারের দৃষ্টিতে উইল অ্যাপে, আমি ইউআইএনএভিগেশন কন্ট্রোলারডেলিগেট পদ্ধতি ওভাররাইড করে আমার ইউআইএনএভিগেশন নিয়ন্ত্রণকারী সাবক্লাসের অভ্যন্তরে এই প্রক্রিয়াটিকে কেন্দ্রিয় করার সিদ্ধান্ত নিয়েছিnavigationController:willShowViewController:animated:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    self.previousVCLandscapeOK = self.isLandscapeOK; // Store the current VC's orientation preference before pushing on the new VC so we can set this again from within the custom "back" method
    self.isLandscapeOK = NO; // Set NO as default for all VC's
    if ([viewController isKindOfClass:[YourViewController class]]) {
        self.isLandscapeOK = YES;
    }
}

আমি খুঁজে পেয়েছি যে এনএভি স্ট্যাকের কোনও ভিসি পপ করার সময় এই প্রতিনিধি পদ্ধতিটি কল হয় না। এটি আমার পক্ষে কোনও সমস্যা ছিল না কারণ আমি আমার ইউআইএনএভিগেশন কন্ট্রোলার সাবক্লাসের মধ্যে থেকে পিছনের কার্যকারিতাটি পরিচালনা করছি যাতে নির্দিষ্ট ভিসির মতো সঠিক নেভিগেশন বারের বোতাম এবং ক্রিয়াগুলি সেট করতে পারি ...

if ([viewController isKindOfClass:[ShareViewController class]]) {

    UIButton* backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 57, 30)];
    [backButton setImage:[UIImage imageNamed:@"back-arrow"] forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem* backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    viewController.navigationItem.leftBarButtonItem = backButtonItem;

    UIImageView* shareTitle = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"share-title"]];
    [shareTitle setContentMode:UIViewContentModeScaleAspectFit];
    [shareTitle setFrame:CGRectMake(0, 0, shareTitle.frame.size.width - 10, shareTitle.frame.size.height - 10)];
    viewController.navigationItem.titleView = shareTitle;

} else if(...) {
    ...
}

আমার backপদ্ধতিটি স্ট্যাকের উপাচার্যকে পপিং করা পরিচালনা করতে এবং উপযুক্ত ঘূর্ণন পছন্দটি সেট করার মত দেখাচ্ছে ...

- (void)back {
    self.isLandscapeOK = self.previousVCLandscapeOK;
    self.previousVCLandscapeOK = NO;
    [self popViewControllerAnimated:YES];
}

সুতরাং, আপনি দেখতে পাচ্ছেন, মূলত যা ঘটছে তা হ'ল আমি প্রথমে আমাকে দুটি বৈশিষ্ট্য নির্ধারণ করছি ...

@property (nonatomic) BOOL isLandscapeOK;
@property (nonatomic) BOOL previousVCLandscapeOK;

মধ্যে navigationController:willShowViewController:animated:যা কি সমর্থিত ওরিয়েন্টেশন যে ভিসি যে বিষয়ে উপস্থাপন করা মধ্যে রয়েছে নির্ধারণ করা হবে। কোনও ভিসি পপ করার সময়, আমার কাস্টম "ব্যাক" পদ্ধতিটি কল করা হচ্ছে এবং আমি পরে ল্যান্ডস্কেপওকে পূর্ববর্তী ভিসিএলএসপেকওক মানের মাধ্যমে সঞ্চিত ছিল সেটিতে সেট করছি।

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

আশা করি এটি আমার মতো করে কাউকে সহায়তা করবে। ধন্যবাদ, জেরেমি



0

আপনি কেবল iOS 6 অ্যাপের প্রতিকৃতি জোর করতে চান তবেই আপনি পদ্ধতিগুলির নীচে কোনও ইউআইভিউকন্ট্রোলার সাবক্লাসে যুক্ত করতে পারেন

- (BOOL)shouldAutorotate {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return YES;
    } else {
        return NO;
    }
}


- (NSUInteger)supportedInterfaceOrientations {
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return UIInterfaceOrientationMaskAll;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}

4
সমস্যাটি হ'ল যদি না সেই দর্শনটি মূল দৃষ্টিভঙ্গি না হয় (যা এটি এই প্রশ্নে নেই), তবে অটোরিওটেটকে কল করা উচিত নয়।
ব্রায়ান

যে কোনও কারণে রিটার্ন টাইপ NSUIntegerহ'ল সতর্কবার্তাটি সঠিক ভের টাইপ হওয়া সত্ত্বেও। যদি এর UIInterfaceOrientationMaskপরিবর্তে আপনার ওসিডি ব্যবহার থাকে ।
ক্রিস জে

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

0

আমি আমার সমস্ত ভিসিগুলিকে একটি ব্যতীত প্রতিকৃতি ওরিয়েন্টেশনে লক করতে চেয়েছিলাম। এটিই আমার পক্ষে কাজ করেছিল।

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

    -(NSUInteger)supportedInterfaceOrientations
    {
        UIViewController *topMostViewController = [[Utils getAppDelegate] appNavigationController].topViewController;
        if ([topMostViewController isKindOfClass:[SVWebViewController class]]) {
            return UIInterfaceOrientationMaskAllButUpsideDown;
        }
        return UIInterfaceOrientationMaskPortrait;
    }
    

ত্রুনাল, এটি কয়েক মাস পুরাতন তবে আপনি কীভাবে শীর্ষে থাকা ভিউ কন্ট্রোলারটি সনাক্ত করতে পারেন সে সম্পর্কে আপনি আরও কিছুটা বিশদ দিতে পারেন। আপনি এখানে যাচ্ছেন তা বিশেষত আমি নিশ্চিত নই [[Utils getAppDelegate] appNavigationController]। যে অনুমানগুলি আমি অনুমান করছি এটি আপনার কাছে কিছু শ্রেণি তবে এটিতে আপনি যা করেন তা আমার ক্ষতি হয়। যেকোনো সাহায্যই অসাধারণ!
বেন

0

@Mmdk জবাবের অধীনে @ র্যাম এস প্রশ্নের উত্তর দেওয়ার মতো যথেষ্ট খ্যাতি আমার নেই তাই আমি আমার নোটটি এখানে যুক্ত করব।

আপনি ব্যবহার করেন, তখন UITabbarController পরিবর্তন করার চেষ্টা self.viewControllers.lastObject করার @ micmdk এর কোড মধ্যে self.selectedViewController ভালো:

- (BOOL)shouldAutorotate {
    return [self.selectedViewController shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {
    return [self.selectedViewController supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return [self.selectedViewController shouldAutorotateToInterfaceOrientation:toInterfaceOrientation];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}

0

আপনি আপনার সমস্ত ভিউ কন্ট্রোলার ক্লাসে অডিওরোটেট () এবং সমর্থিত ইন্টারফেস ওরিয়েন্টেশনগুলি প্রয়োগ করতে এবং ওভাররাইড করতে পারেন যা আপনার অ্যাপ্লিকেশনটির পিআইএলএসটি বর্ণিত সংজ্ঞাগুলির চেয়ে আলাদা অভিযোজনে উপস্থাপন করা উচিত।

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

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

সুতরাং আপনি কিছু এক্সটেনশন বাস্তবায়ন করতে পারেন এবং এখনও এই সুইফট 4 কোড স্নিপেটের মতো অন্য সকলের চেয়ে আলাদা ওরিয়েন্টেশনগুলিতে দেখানোর জন্য মাইপ্রিসিয়াস ভিউ কনট্রোলার সেটআপ করতে পারেন:

extension UITableViewController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

    if let last = self.navigationController?.childViewControllers.last,
        last != self {
            return last.supportedInterfaceOrientations
    } else {
        return [.portrait]
    }
    }
}

extension MyPreciousViewController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

    return [.portrait,.landscape]
    }
}


extension UINavigationController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        return [.portrait]
    }
}


extension UITabBarController {
    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        return [.portrait]
    }
}

0

আমি একই ধরণের সমস্যা সমাধান করেছি।

আপনি যদি UINavigationControllerভিউ কন্ট্রোলারগুলিকে ঠেলাতে ব্যবহার করেন তবে আপনাকে নীচের পদ্ধতিগুলি সেট করতে হবে।

extension UINavigationController{

    override open var shouldAutorotate: Bool {

        if topViewController != nil && (topViewController?.isKind(of: LogInViewController.self))!
        {
            return true
        }
        return false
    }

    override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {

        if topViewController != nil && (topViewController?.isKind(of: LogInViewController.self))!
        {
            return .portrait
        }
        return .landscapeRight

    }
    override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {

        if topViewController != nil && (topViewController?.isKind(of: LogInViewController.self))!
        {
            return .portrait
        }
        return .landscapeRight
    }
}

LoginViewControllerব্যবহারের জায়গায় যা UIViewControllerআপনি প্রদর্শন করতে চান। আমার ক্ষেত্রে, আমি দেখাতে চাই LoginViewControllerযে Portraitমোড অন্যান্য ViewControllersমধ্যে landscapeমোড।


-1

এই সমস্যাটি সমাধান করার জন্য দয়া করে নীচের পদ্ধতিটি ব্যবহার করুন

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;
}

আপনি চান শুধুমাত্র ওরিয়েন্টেশন ফিরে !!!


4
আমি যেটা লিখেছি, সেটাই করেছি। এটি আমার দৃশ্যের নিয়ামককে ঘোরানো থেকে বিরত রাখে, তবে আমি যখন ফিরে আসি তখন এটি কেবলমাত্র সমর্থিত অভিযোজনে জোর করে না
হ্যারাল্ড ব্যাগহোলজ

এটি আমার পক্ষে কাজ করে না। এমনকি এটি আমার ভিউ কন্ট্রোলারে অন্তর্ভুক্ত করা হয়েছে, দৃশ্যটি এখনও ঘোরে। শেষ ঘন্টা?
শিম

ম্যাক্সফায়ারসোলিউশনের জন্য কেন ডাউনভোট? এটি আমার পক্ষে কাজ করেছে এবং @ ফ্লো দ্বারা প্রদত্ত একই পদ্ধতিতে অনেকগুলি উত্সাহ রয়েছে।
ভিরুম্যাক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.