سؤال

أستطيع أن أرى أن هذا شيء كان يزعج الكثير من الناس:/

لديّ uitabbarcontroller الذي يحتوي على 4 ViewControllers ، وكلها من النوع uinavigationController. يحصل أحد NavigationControllers على دفع ViewController على مكدته ، ويجب تقديم هذا ViewController في وضع/اتجاه المناظر الطبيعية.

ViewController هو رسم بياني ، إنه المكان الوحيد في التطبيق الذي يكون فيه المشهد منطقيًا. (أخفي uitabbar عندما يتم تقديم هذا لعدم قيادة المستخدم للاعتقاد بأن هذا سيعمل في كل مكان)

لجعل uitabbarcontroller يستجيب بشكل صحيح للتغيرات في الاتجاه ، تحتاج جميع رواد ViewControlls إلى إرجاع نفس القيمة من طريقة المندوب:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

لذا ، لإقامة هذا السلوك ، قمت بتطبيق هذه الطريقة في جميع المشاركين في ViewControllers الذين ينتمون إلى UitabbarController:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    BOOL canRotate = [defaults boolForKey:@"can_rotate"];

    return canRotate;
}

"الخدعة" هي الآن عندما يتم دفع Can-be-landscape viewController ، فإنني أفعل ذلك:

- (void) viewWillAppear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:YES forKey:@"can_rotate"];
    [defaults synchronize];

}

وعندما يتم عرضه ، أفعل هذا:

- (void) viewWillDisappear:(BOOL)animated {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setBool:NO forKey:@"can_rotate"];
    [defaults synchronize];

}

هذا يعمل بشكل جيد حقا. عندما يكون ViewController على المكدس ، يمكنني تدوير الجهاز ويتبعه العرض.

ومع ذلك ، فإن المشكلة هي أنه إذا قام المستخدم بنقرل الزر "الخلفي" على شريط التنقل أثناء وجوده في وضع المناظر الطبيعية ، وبالتالي وضع ViewController إلى ViewController السابق ، فإن هذا ViewController "القديم" هو بالطبع أيضًا في وضع المناظر الطبيعية. لتزويد الأمور سوءًا ، لأنني قمت بتعيين منطقي على لا ، لا يمكن لهذا ViewController "القديم" التدوير مرة أخرى عندما أقوم بتوجيه الجهاز إلى وضع الصورة.

هل هناك طريقة لتحديث كل شيء بحيث لا يكون أي من مشاركاتي الأخرى في وضع ViewControllers في وضع المناظر الطبيعية عندما أقوم بتشغيل وضع ViewController Can-in-in-in-in-in-inldscape؟

أنا قلق بعض الشيء من أنه إذا كان يمكن القيام بذلك من المشهد إلى الصورة ، فيجب أن يكون ذلك ممكنًا من الصورة إلى المناظر الطبيعية ، وبالتالي جعل "الاختراق" غير ضروري .. ولكن إذا لم يكن بإمكانه ذلك ، فأنا أعود إلى المربع الأول:/

آمل أن أكون قريبًا وأن يساعدني شخص ما في الوصول إلى هناك ، شكرًا :)

هل كانت مفيدة؟

المحلول

أعتقد أنه يمكنني تبسيط كل شيء ....

- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation {
return NO;
}

-(void) viewDidAppear: (bool) الرسوم المتحركة {[uiview startAnimations:@"view flip" context: nil] ؛ [Uiview SetAnimationDuration: 0.5F] ؛ [Uiview SetAnimationCurve: UivieWanimationCurveaseEnout] ؛

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

// [uiapplication sharedapplication] .StatusBarorientation = uiinterfaceorientationlandslandscaperight ؛

[UIView commitAnimations];
[super viewDidAppear:animated];

}

لا شيء يدور تلقائيًا ، لكنك تدور يدويًا من العرض الذي تريد نقله. إذا لم تكن بحاجة إلى دعم لوحة المفاتيح في العرض ، فلن تحتاج إلى تغيير توبيخ الحالة.

إذا كنت لا تريد دائمًا أن يتم تدوير هذه العرض ، فستواجه مشكلة أصعب قليلاً - قد ترغب في التحقق عن طريق المكالمات إلى NustautotateToInterfaceorientation ثم فقط استدعاء رمز التحويل عند الحاجة إلى ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top