আইওএস 8 এ কীভাবে নিয়ন্ত্রণ নিয়ামককে জোর করবেন?


149

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

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:vc animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];

তবে এটি আইওএস ৮ এ ব্যর্থ হচ্ছে Also এছাড়াও, আমি স্ট্যাক ওভারফ্লোতে কিছু উত্তর দেখেছি যেখানে লোকেরা পরামর্শ দিয়েছিল যে আমাদের সর্বদা আইওএস 8 এর পরে এই পদ্ধতিটি এড়ানো উচিত।

আরও নির্দিষ্ট করে বলতে গেলে, আমার অ্যাপ্লিকেশনটি সর্বজনীন ধরণের অ্যাপ্লিকেশন। মোট তিনটি নিয়ামক রয়েছে।

  1. প্রথম দেখান নিয়ন্ত্রক - এটি আইপ্যাডের সমস্ত দিকনির্দেশ এবং আইফোনে কেবল প্রতিকৃতি (হোম বোতাম ডাউন) সমর্থন করবে।

  2. দ্বিতীয় দর্শন নিয়ামক - এটি সমস্ত পরিস্থিতিতে ঠিক ল্যান্ডস্কেপ সমর্থন করা উচিত

  3. তৃতীয় দর্শন নিয়ন্ত্রক - এটি সমস্ত পরিস্থিতিতে ঠিক ল্যান্ডস্কেপ সমর্থন করা উচিত

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

নীচে আমার shouldAutorotateএবং supportedInterfaceOrientationsদ্বিতীয় এবং তৃতীয় ভিউ নিয়ন্ত্রকের পদ্ধতিগুলি রয়েছে।

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscapeRight;
}

-(BOOL)shouldAutorotate {
    return NO;
}

আইওএস-এর জন্য বিশেষ অভিযোজনে কোনও ভিউ কন্ট্রোলারকে লক করার কোনও আরও ভাল উপায় বা সমাধানের কি আছে? দয়া করে সহায়তা করুন !!


উপস্থাপিত উপাচার্যে আপনি উল্লিখিত পদ্ধতিগুলি কার্যকরভাবে কার্যকর করা উচিত (কমপক্ষে এটি আইওএস 8-এ আমার অভিজ্ঞতা)। সম্ভবত আপনার নির্দিষ্ট সেটআপ সমস্যা সৃষ্টি করছে?
ভ্লাদিমির গ্রিতসেনকো

আমি প্রশ্নটি কিছুটা পরিষ্কার করে দিতে পারি। আমি প্রশ্নটি কিছুটা সম্পাদনা করব।
রশ্মি রঞ্জন মল্লিক

@ ভ্লাদিমিরগ্রিটসেনকো: দয়া করে এখনই পরীক্ষা করুন। আমি এটি সম্পাদনা করেছি।
রশ্মি রঞ্জন মল্লিক

প্রশ্নের কোডটি নেভিগেশন নিয়ন্ত্রকের স্ট্যাক ব্যবহার করে না, বরং মডেল উপস্থাপনা ব্যবহার করে, তাই আপনি ঠিক কী করছেন তা এখনও পরিষ্কার নয়। আমি বলব যে আমাদের কোডে, shouldAutoRotate থেকে হ্যাঁ ফিরে এসে কাঙ্ক্ষিত ওরিয়েন্টেশন supportedInterfaceOrientations থেকে ফেরার উপস্থাপন ভিসি সঠিকভাবে যে ভিসি orients।
ভ্লাদিমির গ্রিতসেনকো

ঠিক আছে, এটি সত্যই ব্যর্থ নয়, এটি ধারণার একটি বড় পরিবর্তন মাত্র। এটির পরিবর্তনটি পুরোপুরি অন্য বিষয় Whether
কেগলুনেক

উত্তর:


315

আইওএস 7 - 10 এর জন্য:

উদ্দেশ্য গ:

[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationLandscapeLeft) forKey:@"orientation"];
[UINavigationController attemptRotationToDeviceOrientation];

সুইফট 3:

let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()

- viewDidAppear:উপস্থাপিত ভিউ কন্ট্রোলারের মধ্যে এটি কল করুন


61
এই না ব্যক্তিগত API- টি। এটি এপিআই-এর অনিরাপদ ব্যবহার। আপনি কোনও ব্যক্তিগত পদ্ধতি ব্যবহার করছেন না, তবে 'অভ্যন্তরীণ জিনিসগুলি' ব্যবহার করছেন। যদি অ্যাপল "ওরিয়েন্টেশন" এর মান পরিবর্তন করে তবে এটি ব্যর্থ হয়। আরও খারাপ: অ্যাপল যদি "ওরিয়েন্টেশন" মানটির অর্থ পরিবর্তন করে তবে আপনি কী জানেন যে আপনি হার্ড-সেটিংটি কীভাবে সেট করছেন।
Sonxurxo

4
নিষ্ক্রিয় অ্যানিমেশন, লাগাতে [UIView setAnimationsEnabled:NO];মধ্যে viewWillAppearএবং [UIView setAnimationsEnabled:YES];মধ্যে viewDidAppear:, সম্পর্কিত stackoverflow.com/a/6292506/88597
ohho

3
চমৎকার হ্যাক, তবে এর সাথে সমস্যাটি হ'ল নতুন ওরিয়েন্টেশন মান (দীর্ঘশ্বাস) নির্ধারণের পরে ডেটরোটেটফ্রোমআইন্টারফেস ওরিয়েন্টেশনকে গুলি চালানো হচ্ছে না
লোরোটোরপিসি

2
আইওএস 9.2-এ, এটি কেবলমাত্র ওরিয়েন্টেশন পরিবর্তন করছে তবে লকিং নয়।
মার্ক 13426

2
প্রত্যেকের জন্য এটি 90% সময় ভাল আচরণ করে এবং অন্য 10% বগি [UINavigationController attemptRotationToDeviceOrientation];
বানাতে

93

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

আমি ইউআইএনএভিগেশন কন্ট্রোলার এবং ইউআইটিববারকন্ট্রোলারে নিম্নলিখিত 2 এক্সটেনশনগুলি ব্যবহার করি যাতে এই নিয়ন্ত্রণকারীগুলির মধ্যে একটিতে এম্বেড থাকা দৃশ্যের নিয়ন্ত্রণকারীরা সিদ্ধান্ত নিতে পারে।

দেখুন নিয়ন্ত্রণ কন্ট্রোলারদের শক্তি!

সুইফট 2.3

extension UINavigationController {
    public override func supportedInterfaceOrientations() -> Int {
        return visibleViewController.supportedInterfaceOrientations()
    }
    public override func shouldAutorotate() -> Bool {
        return visibleViewController.shouldAutorotate()
    }
}

extension UITabBarController {
    public override func supportedInterfaceOrientations() -> Int {
        if let selected = selectedViewController {
            return selected.supportedInterfaceOrientations()
        }
        return super.supportedInterfaceOrientations()
    }
    public override func shouldAutorotate() -> Bool {
        if let selected = selectedViewController {
            return selected.shouldAutorotate()
        }
        return super.shouldAutorotate()
    }
}

সুইফট 3

extension UINavigationController {
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return visibleViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations
    }

    open override var shouldAutorotate: Bool {
        return visibleViewController?.shouldAutorotate ?? super.shouldAutorotate
    }
}

extension UITabBarController {
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if let selected = selectedViewController {
            return selected.supportedInterfaceOrientations
        }
        return super.supportedInterfaceOrientations
    }

    open override var shouldAutorotate: Bool {
        if let selected = selectedViewController {
            return selected.shouldAutorotate
        }
        return super.shouldAutorotate
    }
}

এখন আপনি supportedInterfaceOrientationsপদ্ধতিটি ওভাররাইড করতে পারেন বা আপনি ওভাররাইড করতে পারেনshouldAutoRotate যে ভিউ কন্ট্রোলারটি লক করতে চান তাতে ওভাররাইড করতে পারেন অন্যথায় আপনি অন্য অ্যাপ্লিকেশনটির প্লাস্টে নির্দিষ্ট করা ডিফল্ট ওরিয়েন্টেশন আচরণের উত্তরাধিকার পেতে চান এমন অন্যান্য ভিউ কন্ট্রোলারে ওভাররাইডগুলি ছেড়ে দিতে পারেন you

ঘূর্ণন অক্ষম করুন

class ViewController: UIViewController {
    override func shouldAutorotate() -> Bool {
        return false
    }
}

নির্দিষ্ট ওরিয়েন্টেশন লক করুন

class ViewController: UIViewController {
    override func supportedInterfaceOrientations() -> Int {
        return Int(UIInterfaceOrientationMask.Landscape.rawValue)
    }
}

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

লক স্ক্রিন ঘূর্ণন


1
আমি জানি এটি খুব পুরানো পোস্ট তবে আপনি এক্সটেনশন কোডটি কোথায় রাখবেন?
dwinnbrown

7
একটি উদ্দেশ্য-সি প্রশ্নের উপর একটি সুইফট উত্তরের জন্য কেবল নীচে চিহ্নিত করা।
চার্লি স্কট-স্কিনার

17
এটি সুইফট এবং ওবিজিসির জন্য একটি দুর্দান্ত সমাধান। লোকেরা কেন ভোট দিচ্ছে তা বুঝবেন না। আপনি ধারণা পেয়েছেন এবং তারপরে কোড লিখতে সহজ। অভিযোগ কেন?
ঝাও

2
@ ক্রোডাক, এক্সটেনশানগুলিতে "-> ইন্ট" "" -> ইউআইআইন্টারফেস ওরিয়েন্টেশনমাস্ক "এ পরিবর্তন করার চেষ্টা করুন। আমার জন্য কৌশলটি।
the_pantless_coder

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

24

এটিই আমার পক্ষে কাজ করেছে:

https://developer.apple.com/library//ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/clm/UIViewController/attemptRotationToDeviceOrientation

এটিকে আপনার ভিউডিডঅ্যাপার: পদ্ধতিতে কল করুন।

- (void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    [UIViewController attemptRotationToDeviceOrientation];
}

3
খুব দরকারী, যদি ডিভাইসটি ইতিমধ্যে ঘোরানো হয় এবং আপনার ভিউ কন্ট্রোলারটি ঘোরানো দরকার
avdyushin

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

1
যদিও আমি মনে করি এটি জিজ্ঞাসা করা প্রশ্নের উত্তর নয়, তবে এটি সত্যই আমাকে সহায়তা করেছিল।
আব্দুররহমান মুবীন আলী

21

আমি দেখেছি এটি যদি উপস্থাপিত ভিউ কন্ট্রোলার হয় তবে আপনি ওভাররাইড করতে পারেন preferredInterfaceOrientationForPresentation

সুইফট:

override func supportedInterfaceOrientations() -> Int {
  return Int(UIInterfaceOrientationMask.Landscape.rawValue)
}

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
  return UIInterfaceOrientation.LandscapeLeft
}

override func shouldAutorotate() -> Bool {
  return false
}

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

1
@ ক্লিফটনল্যাব্রাম আপনি কি কেবল ল্যান্ডস্কেপকে বাধ্য করতে অন্য কিছু করেছিলেন ? একই কোড ব্যবহার করে, ভিউ কন্ট্রোলার এখনও অন্য অভিযোজনে ঘুরতে সক্ষম।
ক্র্যাশলোট

আমি পরে বুঝতে পেরেছি - আপনি সঠিক। আমি এখনও একটি ঠিক খুঁজে পাইনি।
ক্লিফটন ল্যাব্রাম

1
এটি আমার পক্ষে কাজ করেছে। আমি এই কোডটি ব্যবহার করে প্রতিকৃতি মোডে একক ভিউ কন্ট্রোলার রাখতে সক্ষম হয়েছি (পোর্ট্রেটের সাথে ল্যান্ডস্কেপ প্রতিস্থাপন করে)। +1
মার্ক ব্যারাসো

হ্যাঁ! এটি আমার জন্য এক্সকোড .3.৩ এবং সুইফট ২.২ এও কাজ করেছিল। তবে এখনও অ্যাপডেলিজেটে সমর্থিত ইন্টারফেস ওরিয়েন্টেশন ফর উইন্ডোর জন্য ফানক অ্যাপ্লিকেশনটি সংজ্ঞায়িত করতে হবে।
Charles.cc.hsu

15

এইভাবে সুইফট 2 আইওএস 8.x এ আমার জন্য কাজ করুন :

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

আপনার প্রকল্পের সাধারণ তথ্যতে "সম্পূর্ণ পর্দার প্রয়োজন" পরীক্ষা করুন। এখানে চিত্র বর্ণনা লিখুন

সুতরাং, AppDelegate.swift এ একটি পরিবর্তনশীল করুন:

var enableAllOrientation = false

সুতরাং, এই ফানক রাখুন:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
        if (enableAllOrientation == true){
            return UIInterfaceOrientationMask.All
        }
        return UIInterfaceOrientationMask.Portrait
}

সুতরাং, আপনার প্রকল্পের প্রতিটি শ্রেণিতে আপনি ভিউউইল অ্যাপয়ারে এই বৈচিত্র সেট করতে পারেন:

override func viewWillAppear(animated: Bool)
{
        super.viewWillAppear(animated)
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.enableAllOrientation = true
}

আপনার যদি ডিভাইসের ধরণের ভিত্তিতে কোনও পছন্দ করা দরকার হয় তবে আপনি এটি করতে পারেন:

override func viewWillAppear(animated: Bool)
    {
        super.viewWillAppear(animated)
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        switch UIDevice.currentDevice().userInterfaceIdiom {
        case .Phone:
        // It's an iPhone
           print(" - Only portrait mode to iPhone")
           appDelegate.enableAllOrientation = false
        case .Pad:
        // It's an iPad
           print(" - All orientation mode enabled on iPad")
           appDelegate.enableAllOrientation = true
        case .Unspecified:
        // Uh, oh! What could it be?
           appDelegate.enableAllOrientation = false
        }
    }

খুব সুন্দর ব্যাখ্যা
মিহির ওজা

11

প্রথমত - এটি একটি খারাপ ধারণা, সাধারণভাবে, আপনার অ্যাপের স্থাপত্যের সাথে কিছু ভুল হচ্ছে, কিন্তু sh..t happens, যদি তাই হয় তবে আপনি নীচের মতো কিছু করার চেষ্টা করতে পারেন:

final class OrientationController {

    static private (set) var allowedOrientation:UIInterfaceOrientationMask = [.all]

    // MARK: - Public

    class func lockOrientation(_ orientationIdiom: UIInterfaceOrientationMask) {
        OrientationController.allowedOrientation = [orientationIdiom]
    }

    class func forceLockOrientation(_ orientation: UIInterfaceOrientation) {
        var mask:UIInterfaceOrientationMask = []
        switch orientation {
            case .unknown:
                mask = [.all]
            case .portrait:
                mask = [.portrait]
            case .portraitUpsideDown:
                mask = [.portraitUpsideDown]
            case .landscapeLeft:
                mask = [.landscapeLeft]
            case .landscapeRight:
                mask = [.landscapeRight]
        }

        OrientationController.lockOrientation(mask)

        UIDevice.current.setValue(orientation.rawValue, forKey: "orientation")
    }
}

তুলনায় AppDelegate

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // do stuff
    OrientationController.lockOrientation(.portrait)
    return true
}

// MARK: - Orientation

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return OrientationController.allowedOrientation
}

এবং যখনই আপনি ওরিয়েন্টেশন পরিবর্তন করতে চান তা করুন:

OrientationController.forceLockOrientation(.landscapeRight)

দ্রষ্টব্য: কখনও কখনও, ডিভাইস যেমন কল থেকে আপডেট নাও হতে পারে, তাই আপনাকে নিম্নলিখিত হিসাবে কাজ করতে হবে

OrientationController.forceLockOrientation(.portrait)
OrientationController.forceLockOrientation(.landscapeRight)

এখানেই শেষ


9

এটি আইওএস 6 থেকে উপরের দিকে কাজ করা উচিত, তবে আমি এটি কেবল আইওএস ৮-এ পরীক্ষা করেছি Sub সাবক্লাস UINavigationControllerএবং নিম্নলিখিত পদ্ধতিগুলিকে ওভাররাইড করুন:

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationLandscapeRight;
}

- (BOOL)shouldAutorotate {
    return NO;
}

অথবা দৃশ্যমান দর্শন নিয়ন্ত্রককে জিজ্ঞাসা করুন

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return self.visibleViewController.preferredInterfaceOrientationForPresentation;
}

- (BOOL)shouldAutorotate {
    return self.visibleViewController.shouldAutorotate;
}

এবং সেখানে পদ্ধতি বাস্তবায়ন।


আমি এটি মাত্র Xcode 8.2.1 এ আইওএস 10.0 চালিত আমার অ্যাপে পরীক্ষা করেছি এবং এটি কার্যকর হয়। আমার গেম মেনুটি প্রথম স্ক্রিন এবং এটি ঘোরবে না; অন্যান্য সমস্ত দর্শন ঘোরান। পারফেক্ট! এটি এক আপ দেওয়া হয়েছে। আমার কেবল মোজো 66 দ্বারা প্রদত্ত 'পছন্দসই ইন্টারফেস ওরিয়েন্টেশন ফরপ্রেজিশন' ফাংশনটি দরকার ছিল।
ফিলিপ বোর্জেস

9

এটি ব্যবহার করে অ্যানিমেশনগুলি কীভাবে অক্ষম করা যায় সে সম্পর্কে সিড শাহের উত্তরের মন্তব্যের প্রতিক্রিয়া :

[UIView setAnimationsEnabled:enabled];

কোড:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:NO];
    [UIView setAnimationsEnabled:NO];

    // Stackoverflow #26357162 to force orientation
    NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
    [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:NO];
    [UIView setAnimationsEnabled:YES];
}

আমি কীভাবে এটি প্রতিকৃতির জন্য ব্যবহার করতে পারি।
মুজু

6

আপনি যদি নেভিগেশনভিউ কনট্রোলার ব্যবহার করছেন তবে আপনার নিজের সুপারক্লাসটি তৈরি করতে হবে এবং ওভাররাইড করতে হবে:

- (BOOL)shouldAutorotate {
  id currentViewController = self.topViewController;

  if ([currentViewController isKindOfClass:[SecondViewController class]])
    return NO;

  return YES;
}

এই ঘূর্ণন নিষ্ক্রিয় করা হবে SecondViewController কিন্তু আপনি যদি আপনার ধাক্কা SecondViewController আপনার ডিভাইস প্রতিকৃতি সজ্জাতে হয় তারপর আপনার SecondViewController প্রতিকৃতি মোডে প্রদর্শিত হবে।

ধরে নিন যে আপনি স্টোরিবোর্ড ব্যবহার করছেন। আপনাকে ম্যানুয়াল সেগুটি তৈরি করতে হবে ( কীভাবে ) এবং আপনার "অনক্লিক" পদ্ধতিতে:

- (IBAction)onPlayButtonClicked:(UIBarButtonItem *)sender {
  NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
  [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
  [self performSegueWithIdentifier:@"PushPlayerViewController" sender:self];
}

এটি আপনার সুপারক্লাসটি অটোোরোটেট বৈশিষ্ট্যটি অক্ষম করার আগে ল্যান্ডস্কেপ অভিযোজনকে বাধ্য করবে।


6

উপর Xcode 8পদ্ধতি বৈশিষ্ট্য রূপান্তরিত হয়, তাই সাথে নিম্নলিখিত কাজ Swift:

override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.portrait
}

override public var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
    return UIInterfaceOrientation.portrait
}

override public var shouldAutorotate: Bool {
    return true
}

এটি কি অরিয়েন্টেশন লক করে?
বনেসিতে

1
@ বুনসেসি আমি অটো ঘোরানো এবং সর্বদা portraitমোডে থাকায় আইপ্যাডের দিকনির্দেশনা যাই হোক না কেন বাঁচাতে চেয়েছিলাম , shouldAutorotateসত্য ফিরে পেয়ে আমি তা অর্জন করেছি।
আলী মোমেন সানী

4

আমি অনেকগুলি সমাধান চেষ্টা করেছি, তবে যেটির জন্য কাজ করেছে সেগুলি হ'ল:

info.plistআইওএস 8 এবং 9 এ সম্পাদনা করার দরকার নেই ।

- (BOOL) shouldAutorotate {
    return NO;
}   

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return (UIInterfaceOrientationPortrait | UIInterfaceOrientationPortraitUpsideDown);
}

অ্যাপল ডকুমেন্টেশন থেকে সম্ভাব্য দিকনির্দেশ :

UIInterfaceOrientationUnknown

ডিভাইসের ওরিয়েন্টেশন নির্ধারণ করা যায় না।

UIInterfaceOrientationPortrait

ডিভাইসটি প্রতিকৃতি মোডে রয়েছে, ডিভাইসটি সোজাভাবে ধরে আছে এবং নীচে হোম বোতামটি রয়েছে।

UIInterfaceOrientationPortraitUpsideDown

ডিভাইসটি প্রতিকৃতি মোডে তবে উল্টো দিকে, ডিভাইসটি ধরে রাখা আছে এবং উপরে হোম বোতামটি রয়েছে।

UIInterfaceOrientationLandscapeLeft

ডিভাইসটি ল্যান্ডস্কেপ মোডে রয়েছে, ডিভাইসটি ডানদিকে ধরে এবং বাম পাশে হোম বোতামটি রয়েছে।

UIInterfaceOrientationLandscapeRight

ডিভাইসটি ল্যান্ডস্কেপ মোডে রয়েছে, ডিভাইসটি সোজাভাবে ধরে আছে এবং ডানদিকে হোম বোতামটি রয়েছে।


3

সিডস এবং কোরিয়ের উত্তরগুলির সংমিশ্রণটি আমার পক্ষে কাজ করেছিল।

নেভিগেশন কন্ট্রোলার প্রসারিত করা:

extension UINavigationController {
    public override func shouldAutorotate() -> Bool {
        return visibleViewController.shouldAutorotate()
    }
}

তারপরে একক দৃশ্যে রোটেশন অক্ষম করা হচ্ছে

class ViewController: UIViewController {
    override func shouldAutorotate() -> Bool {
        return false
    }
}

এবং সিগের আগে উপযুক্ত অভিযোজনে ঘুরছে

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "SomeSegue")
    {
        let value = UIInterfaceOrientation.Portrait.rawValue;
        UIDevice.currentDevice().setValue(value, forKey: "orientation")
    }
}

আপনি কি জানেন যে এটি যদি আমার সমস্যাটিকে যেখানে সহায়তা করতে পারে যেখানে প্রদর্শিত ভিউ কন্ট্রোলার ল্যান্ডস্কেপটিতে প্রদর্শিত হয় যখন এটি পোর্ট্রেটটি সর্বদা হওয়া উচিত তেমন ঘোরার আগে? প্রশ্ন এখানে: stackoverflow.com/questions/30693964/...
dwinnbrown

3

উপরের শীর্ষ সমাধান:

let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")

উপস্থাপিত ভিউ কন্ট্রোলারের ভিডিডিয়ায় আমি যখন এটিকে ডাকি তখন আমার পক্ষে কাজ করেনি। যাইহোক এটি উপস্থাপনার ভিউ কন্ট্রোলারে যখন আমি প্রিপারফোর্ডসেইগ এ ডাকলাম তখন এটি কার্যকর হয়েছিল।

(দুঃখিত, সমাধানের বিষয়ে মন্তব্য করার মতো যথেষ্ট খ্যাতি পয়েন্ট নয়, সুতরাং আমাকে এটির মতো যুক্ত করতে হয়েছিল)


আমি এই কাজটি পেয়েছি তবে কোনও ল্যান্ডস্কেপ ভিউ কন্ট্রোলার থেকে প্রতিকৃতি দৃশ্য নিয়ন্ত্রণকারীর কাছে যাওয়ার সময়, পোর্ট্রেটটিতে যে ভিউ কন্ট্রোলারটি প্রদর্শন করা উচিত তা তার নিজের উপর ঘোরার আগে সংক্ষিপ্তভাবে ল্যান্ডস্কেপে প্রদর্শিত হবে। যদি কেউ জানে কিভাবে সাহায্য করার জন্য আমার প্রশ্ন এখানে: stackoverflow.com/questions/30693964/...
dwinnbrown

ভিউডিজঅনব্রাউন @ ডিউইনব্রাউনটি ভিউ কন্ট্রোলার ইতিমধ্যে দৃশ্যমান। পরিবর্তে ভিউডিডলড থেকে চেষ্টা করে দেখতে পারেন?
ক্র্যাশলোট

@ ক্র্যাশলোট আমি এখন এটি স্থির করেছি। আমি উত্তর হিসাবে চিহ্নিত হিসাবে সঠিক হিসাবে দয়া করে দেখুন।
dwinnbrown

@ ডুইনব্রাউন আপনার প্রশ্নের লিঙ্কটি মারা গেছে। হালনাগাদ? ধন্যবাদ!
ক্র্যাশলোট

@ ক্র্যাশলোট সম্প্রদায় এটি মুছে ফেলেছে তবে আমি এটিকে মুছে ফেলার পক্ষে ভোট দিয়েছি। আমি শীঘ্রই জানাব
dwinnbrown

3

[iOS9 +] যদি উপরের সমাধানগুলির কোনওরকম কাজ না করায় কেউ এখানে সমস্তভাবে টেনে নিয়ে যায় এবং আপনি যদি সিগের মাধ্যমে অভিযোজন পরিবর্তন করতে চান এমন দৃশ্য উপস্থাপন করেন তবে আপনি এটি পরীক্ষা করতে চান।

আপনার সেগুর উপস্থাপনা প্রকারটি পরীক্ষা করুন। আমার 'বর্তমান প্রসঙ্গে' ছিল। আমি যখন এটি পূর্ণস্ক্রিনে পরিবর্তন করেছি, এটি কাজ করেছিল।

@ গ্যাবলেউক্সকে ধন্যবাদ, আমি এই সমাধানটি পেয়েছি।

  • উপরের সমাধানগুলির সাথে একত্রিত হলেই এই পরিবর্তনগুলি কার্যকর হয়।

2

আমার প্রয়োজনীয়তা হয়

  1. প্রতিকৃতি মোডে সমস্ত দর্শন লক করুন
  2. AVPlayerViewControllerভিডিও খেলতে ব্যবহার করুন

ভিডিও যখন বাজছে, যদি এটি ল্যান্ডস্কেপ হয় তবে পর্দাটি ল্যান্ডস্কেপটি ডানদিকে এবং ল্যান্ডস্কেপ বামদিকে ঘোরানোর অনুমতি দিন। যদি এটি কোনও প্রতিকৃতি হয় তবে দৃশ্যটি কেবল প্রতিকৃতি মোডে লক করুন।

প্রথমত, সংজ্ঞায়িত supportedInterfaceOrientationsForWindowমধ্যেAppDelegate.swift

var portrait = true
func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
    if portrait {
        return .Portrait
    } else {
        return .Landscape
    }
}

দ্বিতীয়ত, আপনার প্রধান দৃশ্যের নিয়ামকটিতে নিম্নলিখিত ফাংশনগুলি সংজ্ঞায়িত করুন

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    print("\(#function)")
    return .Portrait
}

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
    return .Portrait
}

override func shouldAutorotate() -> Bool {
    return false
}

তারপরে, আপনার সাবক্লাস করা দরকার AVPlayerViewController

class MyPlayerViewController: AVPlayerViewController {

    var size: CGSize?

    var supportedOrientationMask: UIInterfaceOrientationMask?
    var preferredOrientation: UIInterfaceOrientation?

    override func viewDidLoad() {
        super.viewDidLoad()

        if let size = size {
            if size.width > size.height {
                self.supportedOrientationMask =[.LandscapeLeft,.LandscapeRight]
                self.preferredOrientation =.LandscapeRight
            } else {
                self.supportedOrientationMask =.Portrait
                self.preferredOrientation =.Portrait
            }
        }
    }

এই তিনটি ক্রিয়াকে ওভাররাইড করুন MyPlayerViewController.swift

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return self.supportedOrientationMask!
}

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
    return self.preferredOrientation!
}

যেহেতু ব্যবহারকারী ডিভাইস ল্যান্ডস্কেপ বাম বা আড়াআড়ি ডানদিকে ঘোরতে পারে, তাই সত্য হওয়ার জন্য আমাদের অটো রোটেট সেট করতে হবে

override func shouldAutorotate() -> Bool {
    return true
}

অবশেষে, MyPlayerViewControllerআপনার ভিউ কন্ট্রোলারে উদাহরণ তৈরি করুন এবং সম্পত্তি আকারের মান সেট করুন।

let playerViewController = MyPlayerViewController()

// Get the thumbnail  
let thumbnail = MyAlbumFileManager.sharedManager().getThumbnailFromMyVideoMedia(......)

let size = thumbnail?.size
playerViewController.size = size

আপনার খেলোয়াড়কে যথাযথভাবে সূচনা করুন videoUrl, তারপরে আপনার প্লেয়ারকে নিযুক্ত করুন playerViewController। শুভ কোডিং!



1

এই কাজটি কীভাবে সর্বোত্তমভাবে সম্পাদন করা যায় তা নিয়ে এখনও কিছুটা বিতর্ক রয়েছে বলে আমি মনে করি আমি আমার (কর্মক্ষম) পদ্ধতির ভাগ করে নেব। আপনার UIViewControllerপ্রয়োগে নিম্নলিখিত কোড যুক্ত করুন :

- (void) viewWillAppear:(BOOL)animated
{
    [UIViewController attemptRotationToDeviceOrientation];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft);
}

-(BOOL)shouldAutorotate
{
    return NO;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeLeft;
}

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

আমার জন্য চাবিকাঠিটি ছিল attemptRotationToDeviceOrientationকল viewWillAppear- এটি ছাড়া দৃশ্যটি ডিভাইসটি শারীরিকভাবে ঘোরানো ছাড়া সঠিকভাবে ঘোরানো হবে না।


অবমানিত পদ্ধতি।
সাকিব ওমর

1

অনুসারে Korey Hinton এর উত্তর

সুইফট ২.২:

extension UINavigationController {
    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return visibleViewController!.supportedInterfaceOrientations()
    }
    public override func shouldAutorotate() -> Bool {
        return visibleViewController!.shouldAutorotate()
    }
}


extension UITabBarController {
    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        if let selected = selectedViewController {
            return selected.supportedInterfaceOrientations()
        }
        return super.supportedInterfaceOrientations()
    }
    public override func shouldAutorotate() -> Bool {
        if let selected = selectedViewController {
            return selected.shouldAutorotate()
        }
        return super.shouldAutorotate()
    }
}

ঘূর্ণন অক্ষম করুন

override func shouldAutorotate() -> Bool {
    return false
}

নির্দিষ্ট ওরিয়েন্টেশন লক করুন

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.Portrait
}

1

আমি এখানে কয়েকটি সমাধান চেষ্টা করেছিলাম এবং গুরুত্বপূর্ণ বিষয়টি বুঝতে হবে যে এটি মূল দৃষ্টিভঙ্গি নিয়ামক যা এটি নির্ধারণ করবে যে এটি ঘোরবে কিনা।

আমি নীচের উদ্দেশ্য-সি প্রকল্প তৈরি করেছি github.com/GabLeRoux/RotationLockInTabbedViewChild একটি কাজের উদাহরণ সহ TabbedViewControllerযেখানে একটি শিশু দৃষ্টিভঙ্গি ঘোরানো যায় এবং অন্য শিশু দর্শন প্রতিকৃতিতে লক থাকে।

এটি নিখুঁত নয় তবে এটি কাজ করে এবং একই ধারণার মতো অন্যান্য ধরণের মূল দৃষ্টিভঙ্গির জন্যও কাজ করা উচিত NavigationViewController। :)

শিশু দর্শন পিতামাতার অভিযোজনকে লক করে


0

@ Sid-sha দ্বারা দেখানো সমাধান অনুসারে আপনাকে সমস্ত কিছু viewDidAppear:পদ্ধতিতে রেখে দিতে হবে, অন্যথায় আপনি didRotateFromInterfaceOrientation:বরখাস্ত পাবেন না , তাই এরকম কিছু:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    UIInterfaceOrientation interfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
        interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
        NSNumber *value = [NSNumber numberWithInt:interfaceOrientation];
        [[UIDevice currentDevice] setValue:value forKey:@"orientation"];
    }
}

0

আমার সমাধান

ইন AppDelegate:

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask {
    if let topController = UIViewController.topMostViewController() {
        if topController is XXViewController {
            return [.Portrait, .LandscapeLeft]
        }
    }
    return [.Portrait]
}

XXViewController আপনি ল্যান্ডস্কেপ মোড সমর্থন করতে চান এমন ভিউকন্ট্রোলার।

তারপরে সানি শাহের সমাধানটিXXViewController কোনও আইওএস সংস্করণে আপনার কাজ করবে :

let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")

শীর্ষ সর্বাধিক ভিউকন্ট্রোলার সন্ধান করার জন্য এটি ইউটিলিটি ফাংশন।

extension UIViewController {

    /// Returns the current application's top most view controller.
    public class func topMostViewController() -> UIViewController? {
        let rootViewController = UIApplication.sharedApplication().windows.first?.rootViewController
        return self.topMostViewControllerOfViewController(rootViewController)
    }



    /// Returns the top most view controller from given view controller's stack.
    class func topMostViewControllerOfViewController(viewController: UIViewController?) -> UIViewController? {
        // UITabBarController
        if let tabBarController = viewController as? UITabBarController,
           let selectedViewController = tabBarController.selectedViewController {
            return self.topMostViewControllerOfViewController(selectedViewController)
        }

        // UINavigationController
        if let navigationController = viewController as? UINavigationController,
           let visibleViewController = navigationController.visibleViewController {
            return self.topMostViewControllerOfViewController(visibleViewController)
        }

        // presented view controller
        if let presentedViewController = viewController?.presentedViewController {
            return self.topMostViewControllerOfViewController(presentedViewController)
        }

        // child view controller
        for subview in viewController?.view?.subviews ?? [] {
            if let childViewController = subview.nextResponder() as? UIViewController {
                return self.topMostViewControllerOfViewController(childViewController)
            }
        }

        return viewController
    }

}

0

আইওএস 9 এ পরীক্ষিত দর্শন নিয়ামক ওরিয়েন্টেশন লক করতে এটি ব্যবহার করুন:

// ল্যান্ডস্কেপ ডানদিকে লক

-(UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscapeRight;
}

-(NSUInteger)navigationControllerSupportedInterfaceOrientations:(UINavigationController *)navigationController {
    return UIInterfaceOrientationMaskLandscapeRight;
}

0

আমার একই সমস্যা আছে এবং এর জন্য অনেক সময় নষ্ট করছি। সুতরাং এখন আমি আমার সমাধান আছে। আমার অ্যাপ্লিকেশানের সেটিং ঠিক সমর্থন প্রতিকৃতি হয় only.However, আমার অ্যাপ্লিকেশন মধ্যে কিছু পর্দা আড়াআড়ি only.I দ্বারা এটা ঠিক একটি পরিবর্তনশীল আছে প্রয়োজন isShouldRotateAppDelegate । এবং অ্যাপডেলিগেটে ফাংশন :

func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int {
    if isShouldRotate == true {
        return Int(UIInterfaceOrientationMask.Landscape.rawValue)
    }
    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

এবং অবশেষে যখন একটি ভিউকন্ট্রোলারএর জন্য ল্যান্ডস্কেপ রাজ্যের প্রয়োজন হয়। শুধু যে একটি করুন: সামনে ধাক্কা / বর্তমান করার ViewControllerA বরাদ্দ isShouldRotate করার সত্য । ভুলবেন যখন POP / বরাদ্দ যে নিয়ামক বরখাস্ত না isShouldRotate করার মিথ্যাviewWillDisappear


0

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

VC-main
    |
    -> VC 2
        |
        -> VC 3

মূলত আমার পরীক্ষায় কেবল ভিসি-মেইন শোনা যায়।


0

দেখে মনে হচ্ছে আপনি এমনকি এখানে এত উত্তর দিয়েছেন যে আমার পক্ষে কেউ যথেষ্ট ছিল না। আমি ওরিয়েন্টেশনকে জোর করতে চেয়েছিলাম এবং তারপরে আবার ফিরে যেতে ডিভাইস অভিযোজনে ফিরে যাই তবে [UIViewController attemptRotationToDeviceOrientation];ঠিক কাজ হয়নি। জটিল জিনিসটি যা করেছে তা হ'ল আমি কোনও উত্তরের ভিত্তিতে ভুয়াতে অডিওরোটেট যুক্ত করেছিলাম এবং সমস্ত পরিস্থিতিতে সঠিকভাবে ঘোরানোর জন্য কাঙ্ক্ষিত প্রভাব পেতে পারি না।

সুতরাং আমি এই কি করেছি:

নিয়ন্ত্রককে তার ইনিস্ট্র কনস্ট্রাক্টরে কল করার আগে এটির আগে:

_userOrientation = UIDevice.currentDevice.orientation;
[UIDevice.currentDevice setValue:@(UIInterfaceOrientationPortrait) forKey:@"orientation"];
[self addNotificationCenterObserver:@selector(rotated:)
                               name:UIDeviceOrientationDidChangeNotification];

তাই আমি সর্বশেষ ডিভাইস ওরিয়েন্টেশন সংরক্ষণ করেছি এবং ওরিয়েন্টেশন পরিবর্তন ইভেন্টের জন্য নিবন্ধন করি। ওরিয়েন্টেশন পরিবর্তন ইভেন্টটি সহজ:

- (void)rotated:(NSNotification*)notification {
    _userOrientation = UIDevice.currentDevice.orientation;
}

এবং বিতর্কিত দৃষ্টিভঙ্গিতে আমি কেবল ব্যবহারকারীরূপ হিসাবে আমার যে কোনও অভিমুখকে ফিরিয়ে দিচ্ছি:

- (void)onViewDismissing {
    super.onViewDismissing;
    [UIDevice.currentDevice setValue:@(_userOrientation) forKey:@"orientation"];
    [UIViewController attemptRotationToDeviceOrientation];
}

এবং এটিও সেখানে থাকতে হবে:

- (BOOL)shouldAutorotate {
    return true;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

এবং নেভিগেশন কন্ট্রোলারকে ওডিওরোটেট এবং সমর্থিত ইন্টারফেস ওরিয়েন্টেশনগুলিকে প্রেরণ করতে হবে, তবে বেশিরভাগ লোকের ইতিমধ্যে আমার বিশ্বাস believe

পিএস: দুঃখিত, আমি কিছু এক্সটেনশন এবং বেস ক্লাস ব্যবহার করি তবে নামগুলি যথেষ্ট অর্থবহ তাই ধারণাটি বোধগম্য, আরও বেশি এক্সটেনশন তৈরি করবে কারণ এটি এখন খুব বেশি সুন্দর নয়।

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