আইফোনের অরিয়েন্টেশন সেট করার কোনও ডকুমেন্টেড উপায় আছে কি?


94

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

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

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

অভিমুখীকরণকে বাধ্য করার কোনও নথিভুক্ত উপায় আছে কি?

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

আমি আমার অ্যাপ্লিকেশনটি ল্যান্ডস্কেপ এবং প্রতিকৃতিতে দৃশ্য 1 এ সমর্থন করতে চাই তবে কেবলমাত্র 2 দেখুন দেখুন port ফোন পোর্ট্রেটে ফিরে ঘোরান।


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

4
সেট ওরিয়েন্টেশন প্রকাশের জন্য জিজ্ঞাসা করে আমি একটি বাগ দায়ের করেছি
জেসেসডেক

4
[[ইউআইডিভাইস কারেন্ট ডিভাইস] সেট ওরিয়েন্টেশন: ইউআইআইন্টারফেস ওরিয়েন্টেশন পোর্ট্রেট]; এই পদ্ধতিটি অবচয় করা হয়েছে এবং এর বেশি অস্তিত্ব নেই।
হিকমত খান 10'12

উত্তর:


6

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

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


এটি আইফোন সিমুলেটর ৩.৩.২ এর ক্ষেত্রে নয়। এটি এখনও কাজ করছে না।
হাঁস

4
@ ব্যবহারকারী যখন আপনি স্ট্যাকের উপর কোনও ভিউ চাপেন তখন আপনি কীভাবে একটি ওরিয়েন্টেশনের অনুরোধ করবেন?
প্রোগ্রামার

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

@ কেনেথবেলেঞ্জার আমি গাইডলাইন এবং / অথবা চুক্তিতে পড়ে মনে করি যে এ জাতীয় জিনিসগুলি গোপন করা আপনার অ্যাপ্লিকেশনটিকে সরিয়ে ফেলতে পারে এবং এমনকি আপনার অ্যাকাউন্টটি সরিয়ে ফেলতে পারে। আমি ঝুঁকি নেব না যে কেবল অপ্রকাশিত API ব্যবহার করতে হবে।
ইভান ভুইকা 18

101

এটি সত্যের অনেক পরে, তবে যে কেউ কেউ নেভিগেশন নিয়ামক ব্যবহার করছেন না এবং / অথবা অনিবন্ধিত পদ্ধতি ব্যবহার করতে ইচ্ছুক নয় এমন কেউ যদি আসে:

UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

এটি একটি ভ্যানিলা দর্শন নিয়ামককে উপস্থাপন এবং বরখাস্ত করার পক্ষে যথেষ্ট।

স্পষ্টতই আপনাকে এখনও আপনার ওভারড্রাইডের ওঅর্ডারটেশন অডিটোরোটেটটোইন্টারফেস ওরিয়েন্টেশনকে নিশ্চিত করতে বা অস্বীকার করতে হবে। তবে এটি অডিওরোটেটকে ... সিস্টেম দ্বারা আবার কল করার কারণ ঘটবে।


4
আশ্চর্যজনক, এইটিকে এই পোস্টটির সঠিক উত্তর হিসাবে চিহ্নিত করা হয়নি, তবে এটি আমার সমস্যার এক অর্ধেক সমাধান করেছে stackoverflow.com/questions/5030315 । মডেল ভিউ ট্রিক 'ফোর্স' পোর্ট্রেট ওরিয়েন্টেশন, আপনি কি ল্যান্ডস্কেপকে বাধ্য করার জন্য একজনকে জানতেন?
এপোলোজি

5
হা হা !! এটা ঠিক খুব বোকা! কিন্তু এটি কাজ করে! - অবশ্যই আছে! : ডি
hfossli

দুর্দান্ত, দীর্ঘদিন ধরে এটির সাথে লড়াই করে যাচ্ছি। ধন্যবাদ! সাথী
রাহুল চৌধুরী

4
এটি আইওএস 5 এবং আইওএস 6, উভয়ের জন্যই কাজ করছে বলে মনে হচ্ছে: [স্বতঃ উপস্থিত ভিউকন্ট্রোলার: [ইউআইভিউকন্ট্রোলার নতুন] অ্যানিমেটেড: কোনও সমাপ্তি: ^ {[স্ব বরখাস্তভিউকন্ট্রোলার অ্যানিমেটেড: কোনও সমাপ্তি: শূন্য]; ;];
ইনফেরিস

4
এটি আইওএস 7 এবং আইওএস 8 এ কাজ করছে বলে মনে হয়, তবে একটি কালো রঙের পর্দা রয়েছে যা দেখতে পাবে না (আইওএস 8 মূলত)।
লেভিগ্রোগার

16

আপনি যদি এটি জোর করে প্রতিকৃতি থেকে পোর্ট্রেট থেকে ল্যান্ডস্কেপে যেতে চান তবে কোডটি এখানে। কেবল নোট করুন যে আপনার দৃষ্টিভঙ্গির কেন্দ্রটি সামঞ্জস্য করা দরকার। আমি লক্ষ্য করেছি যে আমার দৃশ্যটি সঠিক জায়গায় রাখেনি didn't অন্যথায়, এটি পুরোপুরি কাজ করে। টিপ জন্য ধন্যবাদ.

if(UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){

        [UIView beginAnimations:@"View Flip" context:nil];
        [UIView setAnimationDuration:0.5f];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
        self.view.center = CGPointMake(160.0f, 240.0f);

        [UIView commitAnimations];
}

আমি যদি কোনও ইউআইএলআর্টভিউ যুক্ত করি তবে তা কি কাজ করবে? আমি CGAffineTransformMakeRotationভিউটি ঘোরার চেষ্টা করেছি তবে ইউআইএলার্টভিউ এখনও স্ট্যাটাস বারের ওরিয়েন্টেশন অনুসারে, -ড্রেগ্রিটোরিডিয়ান (কোণ) অনুসারে? আপনি কি এরকম কিছু পেয়েছেন?
কখনইহোপহীন

এর সাথে এটি করার সহজতম উপায় UIAlertViewহ'ল সতর্কতার সাথে আপনার ভিউ কন্ট্রোলারটিকে সতর্কতা দর্শনের প্রতিনিধি হিসাবে সেট করা এবং তারপরে:, - (void) didPresentAlertView:(UIAlertView *) alertViewআপনি বর্তমানের উপর ভিত্তি করে আবর্তন সম্পাদন করেন [UIApplication sharedApplication].statusBarOrientation। আপনি যদি এনিমেট না করেন তবে খুব অদ্ভুত লাগবে না।
মাইকেল

16

আমি যা বলতে পারি তা থেকে, setOrientation:পদ্ধতিটি কাজ করে না (বা সম্ভবত আর কাজ করে না)। আমি এটি করতে যা করছি তা এখানে:

প্রথমে আপনার ফাইলের শীর্ষে এই সংজ্ঞাটি আপনার # আমদানির নীচে রাখুন:

#define degreesToRadian(x) (M_PI * (x) / 180.0)

তারপর, viewWillAppear:পদ্ধতিতে

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}

আপনি যদি এটি অ্যানিমেটেড করতে চান তবে আপনি পুরো জিনিসটি একটি অ্যানিমেশন ব্লকে মোড়ানো করতে পারেন, এর মতো:

[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];     
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {  
    self.view.transform = CGAffineTransformIdentity;
    self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
[UIView commitAnimations];

তারপরে, আপনার প্রতিকৃতি মোড নিয়ামকটিতে, আপনি বিপরীতটি করতে পারেন - এটি বর্তমানে ল্যান্ডস্কেপে রয়েছে কিনা তা পরীক্ষা করে দেখুন এবং যদি তা হয় তবে এটিকে আবার প্রতিকৃতিতে ঘোরান।


4
স্ব.ভিউয়ের পরিবর্তে আপনার নিজের.উন্ডো.ভিউ ঘোরানো উচিত। আপনার দৃশ্যের শীর্ষে যদি ইউআইটিববার বা অন্যান্য কন্ট্রোলার থাকে তবে এটি কার্যকর।
বোরুত তোমাজিন

7

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

আমি যেটা লক্ষ্য করেছি, shouldAutorotateToInterfaceOrientation:তা হল যখন কোনও নতুন ভিউ কন্ট্রোলারটিকে স্ট্যাকের দিকে ঠেলে দেওয়া হয় তখন পদ্ধতিটি বলা হয় না, তবে যখন ভিউ কন্ট্রোলার স্ট্যাক থেকে পপ করা হয় তখন এটিকে বলা হয়

এর সুবিধা নিয়ে আমি এই অ্যাপ্লিকেশনগুলির মধ্যে কোডের এই স্নিপেটটি ব্যবহার করছি:

- (void)selectHostingAtIndex:(int)hostingIndex {

    self.transitioning = YES;

    UIViewController *garbageController = [[[UIViewController alloc] init] autorelease];
    [self.navigationController pushViewController:garbageController animated:NO];
    [self.navigationController popViewControllerAnimated:NO];

    BBHostingController *hostingController = [[BBHostingController alloc] init];
    hostingController.hosting = [self.hostings objectAtIndex:hostingIndex];
    [self.navigationController pushViewController:hostingController animated:YES];
    [hostingController release];

    self.transitioning = NO;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    if (self.transitioning)
        return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
    else
        return YES;
}

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


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

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

7

প্রয়োজনীয় দিকনির্দেশের জন্য আইটেমকে প্রোগ্রামিকভাবে বাধ্য করার একটি সহজ উপায় রয়েছে - কেডিবিডালাস , জোশের ইতিমধ্যে প্রদত্ত দুটি উত্তর ব্যবহার করে :

//will rotate status bar
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];


//will re-rotate view according to statusbar
UIViewController *c = [[UIViewController alloc]init];
[self presentModalViewController:c animated:NO];
[self dismissModalViewControllerAnimated:NO];
[c release];

একটি যাদুমন্ত্র মত কাজ করে :)

সম্পাদনা:

আইওএস 6 এর জন্য আমাকে এই ফাংশনটি যুক্ত করতে হবে: (মডেল ভিউকন্ট্রোলারের উপর কাজ করে)

- (NSUInteger)supportedInterfaceOrientations
{
    return (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight);
}

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

এটি মডেল এবং পুশ ভিউকন্ট্রোলার উভয় ক্ষেত্রেই আমার শেষ দিকে কাজ করে। তবে কেবল আইওএস 5 :(
গুঁটিস ট্রুলেন্ডস

হ্যাঁ আমি এটিও আইওএস 5 এ কাজ করতে পেরেছি। এখন আইওএস 6 এ নেভিগেশন বারের উচ্চতা সঙ্কুচিত হয়ে একবার
মডেল

7

আমি এটির একটি ভাল সমাধান অনুসন্ধান এবং খনন করছি। এই ব্লগ পোস্টটি পেয়েছে যা কৌশলটি করেছে: কী থেকে আপনার বহিরাগত দৃশ্য UIWindowসরিয়ে আবার এটিকে যুক্ত করুন, সিস্টেমটি তখন shouldAutorotateToInterfaceOrientation:আপনার ভিউকন্ট্রোলারদের থেকে পদ্ধতিগুলি পুনরায় জিজ্ঞাসা করবে , প্রয়োগের জন্য সঠিক ওরিয়েন্টেশনটি প্রয়োগ করবে। এটি দেখুন: আইফোন ইউভিউকে পুনরায় তৈরি করতে বাধ্য করছে


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

5

জোশের উত্তর আমার পক্ষে ভাল কাজ করে।

যাইহোক, আমি একটি "ওরিয়েন্টেশন পরিবর্তিত হয়েছে পোস্ট করতে পছন্দ করি , দয়া করে UI আপডেট করুন" বিজ্ঞপ্তি। যখন এই নোটিফিকেশনটি কোনও ভিউ কন্ট্রোলার দ্বারা গ্রহণ করা হয়, তখন এটি কল করে shouldAutorotateToInterfaceOrientation:, আপনার পছন্দসই ওরিয়েন্টেশনটির YESজন্য ফিরে এসে কোনও অভিযোজন সেট করার অনুমতি দেয় ।

[[NSNotificationCenter defaultCenter] postNotificationName:UIDeviceOrientationDidChangeNotification object:nil];

একমাত্র সমস্যা হ'ল এটি কোনও অ্যানিমেশন ছাড়াই পুনরায় ওরিয়েন্টেশনকে বাধ্য করে । আপনি মধ্যে এই লাইন মোড়ানো করতে হবে beginAnimations:এবং commitAnimationsএকটি মসৃণ পরিবর্তন অর্জন করা।

আশা করি এইটি কাজ করবে.


3

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

-(void)rotateInterfaceToOrientation:(UIDeviceOrientation)orientation{

    CGRect bounds = [[ UIScreen mainScreen ] bounds ];
    CGAffineTransform t;
    CGFloat r = 0;
    switch ( orientation ) {
        case UIDeviceOrientationLandscapeRight:
            r = -(M_PI / 2);
            break;
        case UIDeviceOrientationLandscapeLeft:
            r  = M_PI / 2;
            break;
    }
    if( r != 0 ){
        CGSize sz = bounds.size;
        bounds.size.width = sz.height;
        bounds.size.height = sz.width;
    }
    t = CGAffineTransformMakeRotation( r );

    UIApplication *application = [ UIApplication sharedApplication ];

    [ UIView beginAnimations:@"InterfaceOrientation" context: nil ];
    [ UIView setAnimationDuration: [ application statusBarOrientationAnimationDuration ] ];
    self.view.transform = t;
    self.view.bounds = bounds;
    [ UIView commitAnimations ];

    [ application setStatusBarOrientation: orientation animated: YES ];     
}

নিম্নলিখিত UINavigationControllerDelegateপদ্ধতির সাথে মিলিত (ধরে নিচ্ছেন আপনি একটি ব্যবহার করছেন UINavigationController):

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
    // rotate interface, if we need to
    UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
    BOOL bViewControllerDoesSupportCurrentOrientation = [ viewController shouldAutorotateToInterfaceOrientation: orientation ];
    if( !bViewControllerDoesSupportCurrentOrientation ){
        [ self rotateInterfaceToOrientation: UIDeviceOrientationPortrait ];
    }
}

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

-(void)onUIDeviceOrientationDidChangeNotification:(NSNotification*)notification{
    UIViewController *tvc = self.rootNavigationController.topViewController;
    UIDeviceOrientation orientation = [[ UIDevice currentDevice ] orientation ];
    // only switch if we need to (seem to get multiple notifications on device)
    if( orientation != [[ UIApplication sharedApplication ] statusBarOrientation ] ){
        if( [ tvc shouldAutorotateToInterfaceOrientation: orientation ] ){
            [ self rotateInterfaceToOrientation: orientation ];
        }
    }
}

শেষ অবধি, UIDeviceOrientationDidChangeNotificationবিজ্ঞপ্তিগুলির জন্য initবা তেমন loadviewপছন্দ করার জন্য নিবন্ধন করুন :

[[ NSNotificationCenter defaultCenter ] addObserver: self
                                           selector: @selector(onUIDeviceOrientationDidChangeNotification:)
                                               name: UIDeviceOrientationDidChangeNotification
                                             object: nil ];
[[ UIDevice currentDevice ] beginGeneratingDeviceOrientationNotifications ];

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

@ ড্যানডায়ার আপনি নাভিগেশন বারের ভুল উচ্চতা দিয়ে বিষয়টি সমাধান করেছেন? (বিশেষত আইওএস 6 এর উচ্চতাটি ভুল)
অ্যালেক্সওয়েন

@ অ্যালেক্সওয়েন আমি শেষ পর্যন্ত ক্লায়েন্টকে বোঝাতে সক্ষম হয়েছি যে আমাদের এটি করা উচিত নয়। আইওএস 6 এর জন্য আপনাকে নতুন shouldAutorotateপদ্ধতির সাহায্যে কিছু করার প্রয়োজন হতে পারে ( stackoverflow.com/a/12586002/5171 দেখুন )।
ড্যান ডায়ার

@ ড্যানডায়ার গতকাল এটি সমাধান করেছেন, ভিউডিড অ্যাপিয়ারে নেভিগেশন এবং স্ট্যাটাস বারের একটি সাধারণ আড়াল এবং শো এটি সমাধান করেছে all এখন সমস্ত কাজ (এসডিকে আইওএস 6, টার্গেট আইওএস 5) আমাকে লক্ষ্য আইওএস 6 নিয়ে প্রতিদ্বন্দ্বিতা করতে হবে
অ্যালেক্সওয়েন

2

এটি আমার পক্ষে কাজ করে (ধন্যবাদ হেনরি কুককে):

আমার উদ্দেশ্য ছিল কেবলমাত্র ল্যান্ডস্কেপ ওরিয়েন্টেশন পরিবর্তনের সাথে ডিল করা।

আরম্ভ পদ্ধতি:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(orientationChanged:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

- (void)orientationChanged:(NSNotification *)notification {    
    //[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    CGRect bounds = [[ UIScreen mainScreen ] bounds ];
    CGAffineTransform t;
    CGFloat r = 0;
    switch ( orientation ) {
        case UIDeviceOrientationLandscapeRight:
            r = 0;
            NSLog(@"Right");
            break;
        case UIDeviceOrientationLandscapeLeft:
            r  = M_PI;
            NSLog(@"Left");
            break;
        default:return;
    }

    t = CGAffineTransformMakeRotation( r );

    UIApplication *application = [ UIApplication sharedApplication ];
    [ UIView beginAnimations:@"InterfaceOrientation" context: nil ];
    [ UIView setAnimationDuration: [ application statusBarOrientationAnimationDuration ] ];
    self.view.transform = t;
    self.view.bounds = bounds;
    [ UIView commitAnimations ];

    [ application setStatusBarOrientation: orientation animated: YES ];
}

1

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

আমি বুঝতে পারি যে এই থ্রেডের উপরের মূল পোস্টটি এখন অনেক পুরানো, তবে আমার এটির মতোই সমস্যা ছিল - যেমন। আমার অ্যাপে থাকা সমস্ত পর্দা কেবল একটি পর্দা বাদে পোর্ট্রেট, যা ব্যবহারকারীর দ্বারা আড়াআড়ি এবং প্রতিকৃতির মাঝে ঘোরানো যেতে পারে।

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

আমি যে সমাধানটি প্রয়োগ করেছি তা হ'ল নেভিগেশন বারটি ল্যান্ডস্কেপ মোডে থাকাকালীন লুকানো ছিল, অর্থাত্ প্রতিকৃতিতে ব্যবহারকারী কেবল পূর্ববর্তী স্ক্রিনগুলিতে ফিরে আসতে পারে। অতএব, অন্যান্য সমস্ত পর্দা কেবল প্রতিকৃতিতে থাকতে পারে।

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)pInterfaceOrientation {
    BOOL lHideNavBar = self.interfaceOrientation == UIInterfaceOrientationPortrait ? NO : YES;
    [self.navigationController setNavigationBarHidden:lHideNavBar animated:YES];
}

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

আশাকরি এটা সাহায্য করবে.


1

আমি শেষ পর্যন্ত এটি বেশ সহজেই সমাধান করেছি। আমি উপরের প্রতিটি পরামর্শ চেষ্টা করেছিলাম এবং এখনও সংক্ষেপে এসেছি, সুতরাং এটি আমার সমাধান ছিল:

ল্যান্ডস্কেপ (বাম বা ডান) থাকা দরকার এমন ভিউকন্ট্রোলারে, আমি ওরিয়েন্টেশন পরিবর্তনের জন্য শুনি:

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didRotate:)
                                             name:UIDeviceOrientationDidChangeNotification object:nil];

তারপরেডরেটেটে:

- (void) didRotate:(NSNotification *)notification
{   if (orientationa == UIDeviceOrientationPortrait) 
    {
        if (hasRotated == NO) 
        {
            NSLog(@"Rotating to portait");
            hasRotated = YES;
            [UIView beginAnimations: @"" context:nil];
            [UIView setAnimationDuration: 0];
            self.view.transform = CGAffineTransformIdentity;
            self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(-90));
            self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            self.view.frame = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
            [UIView commitAnimations];

    }
}
else if (UIDeviceOrientationIsLandscape( orientationa))
{
    if (hasRotated) 
    {
        NSLog(@"Rotating to lands");
        hasRotated = NO;
        [UIView beginAnimations: @"" context:nil];
        [UIView setAnimationDuration: 0];
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(0));
        self.view.bounds = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        self.view.frame = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
        [UIView commitAnimations];

    }
}

স্বয়ংক্রিয়করণ ব্যবহার করে এমন কোনও সুপার ভিউ / সাবভিউ মনে রাখবেন, কারণ ভিউ.বাউন্ডস / ফ্রেমটি স্পষ্টভাবে পুনরায় সেট করা হচ্ছে ...

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


1

আইওএস 6 সমাধান:

[[[self window] rootViewController] presentViewController:[[UIViewController alloc] init] animated:NO completion:^{
    [[[self window] rootViewController] dismissViewControllerAnimated:NO completion:nil];
}];

সঠিক কোডটি প্রতি অ্যাপ্লিকেশন এবং আপনি এটি কোথায় রাখেন তা নির্ভর করে (আমি এটি আমার অ্যাপ্লিকেশনটিতে ব্যবহার করেছি)। [[self window] rootViewController]আপনি যা ব্যবহার করেন তা দিয়ে প্রতিস্থাপন করুন । আমি একটি ব্যবহার করছিলাম UITabBarController


0

আমি একটি সমাধান পেয়েছি এবং ফ্রেঞ্চ ভাষায় কিছু লিখেছি (তবে কোডটি ইংরেজিতে রয়েছে)। এখানে

উপায়টি হল উইন্ডো ভিউতে নিয়ামক যুক্ত করা (নিয়ামককে কাঁধের কাঁটা .... ফাংশনটির একটি ভাল প্রয়োগ থাকতে হবে)।


-3

আপনি যদি ইউআইভিউউকন্ট্রোলার ব্যবহার করছেন তবে এই পদ্ধতিটি রয়েছে:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

NOআপনি ঘুরতে চান না এমন দর্শনগুলি রয়েছে এমন দর্শকদের জন্য ফিরুন Return

আরও তথ্য এখানে


4
এটি ঘূর্ণন বন্ধ করে দেয়, আমি যা খুঁজছি তা হল কোনও ঘূর্ণনটি বাধ্যতামূলকভাবে প্রতিকৃতিতে প্রতিক্রিয়ার জন্য যদি ব্যবহারকারী ল্যান্ডস্কেপে থাকে in আমি কী বোঝাতে চেয়েছি তা বলতে উপরে আমি একটি উদাহরণ যুক্ত করেছি।
ডেভ ভারওয়ার 18

-3

রান-টাইমে এটি করা সম্ভব বলে আমি মনে করি না, যদিও আপনি অবশ্যই আপনার ইউআইতে 90 ডিগ্রি রূপান্তর করতে পারেন।


আমি মূলত যে কোডটি পোস্ট করেছি তার মাধ্যমে এটি সম্ভব, কখনই এটি কাজ করা বন্ধ করে দিতে পারে তা আপনি কখনই জানেন না;)
ডেভ ভারওয়ার

-3

এটিই আমি ব্যবহার করি। (আপনি কিছু সংকলন সতর্কতা পেয়েছেন তবে এটি সিমুলেটর এবং আইফোন উভয় ক্ষেত্রেই কাজ করে)

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

আমি খুঁজে পেয়েছি এটি 4.1 তেও কাজ করার জন্য যথেষ্ট। তবে আমার স্ট্যাটাস বারটি গোপনে সেট করা থাকায় আমি শীর্ষে 20 পিক্সেল ব্যবধান অর্জন করি :(
অ্যান্টনি মেইন

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