gpt4 book ai didi

ios - 相机图像选择器控件 - iOS7 中的自动旋转

转载 作者:可可西里 更新时间:2023-11-01 05:41:24 24 4
gpt4 key购买 nike

我有一个照片应用程序,它覆盖了相机图像选择器上的自定义按钮(用于拍照、打开/关闭闪光灯、其他常用功能等)

我希望控制界面只支持纵向(我只是在谈论控制按钮/界面,而不是实际捕获的图像),直到 iOS 6 都可以正常工作。

但是,在升级到 xCode 5.0 版并将我的 iPad 3 升级到 iOS 7(GM Seed,适用于第三代 iPad WiFi)后,我发现当方向改变时相机选择器界面会自动旋转。令人惊讶的是,我在 iPhone 5(升级到 iOS 7)上测试了相同的版本,但自动旋转问题并没有出现。

[双重确定,我再次在 iOS 6 中测试了同一段代码,自动旋转没有发生,无论是在 iPhone 还是 iPad 中]。

为了演示我如何处理我的图像选择器,这里有一些代码片段:

    UIImagePickerController *pickercustom = [[UIImagePickerController alloc] init];
pickercustom.sourceType = UIImagePickerControllerSourceTypeCamera;
pickercustom.showsCameraControls = NO;
pickercustom.wantsFullScreenLayout = YES;
pickercustom.navigationBarHidden=YES;
pickercustom.view.userInteractionEnabled=YES;

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{


if (IPAD.userInterfaceIdiom == UIUserInterfaceIdiomPad)
{
pickercustom.delegate = self;
UIDevice *currentDevice = [UIDevice currentDevice];
while ([currentDevice isGeneratingDeviceOrientationNotifications])
[currentDevice endGeneratingDeviceOrientationNotifications];


[self presentViewController:pickercustom animated:YES completion:nil];

while ([currentDevice isGeneratingDeviceOrientationNotifications])
[currentDevice endGeneratingDeviceOrientationNotifications];

}

else
{
pickercustom.delegate = self;
[self presentViewController:pickercustom animated:YES completion:nil];
}
}

添加了“endGeneratingDeviceOrientationNotifications”以阻止界面旋转(迄今为止效果很好)。

阅读此文后,我也尝试添加这三种方法:UIImagePickerController in iOS 6 doesn't work properly

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

- (BOOL)shouldAutorotate
{
return NO;
}

- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}

...但这也许是 iOS 6 特定的解决方案。它在我的案例中不起作用。

如果您能找出根本原因,请告诉我。这将是很大的帮助。

最佳答案

你很接近。当您想要支持旋转但又希望一个 viewController 不旋转时,事情就变得棘手了:

UIResponder 链真的希望整个应用程序具有相同的旋转。只是简单地覆盖单个类中的旋转委托(delegate)方法是行不通的。 (仅供引用,在您的情况下,您需要继承 UIImagePickerController 以添加这些方法。)您需要在根导航 Controller 中实现这些委托(delegate)方法(您需要再次拥有自己的子类),并且覆盖它们以查询最顶层的 viewController 以获得所需的旋转。像这样的东西:

// Handles the should Auto Rotation for all view controllers
- (BOOL)shouldAutorotate {

if ([self.topViewController conformsToProtocol:@protocol(CustomRotation)]) {
return [self.topViewController shouldAutorotate];
}

// Auto rotate the screen by default.
return YES;
}

// Handles the supported Interface Orientations for all View Controllers by seeing if
// the top level viewController responds to Custom Rotation callbacks.
- (NSUInteger)supportedInterfaceOrientations {
if ([self.topViewController conformsToProtocol:@protocol(CustomRotation)]) {
return [self.topViewController supportedInterfaceOrientations];
}

// The default rotation for the application.
return UIInterfaceOrientationMaskAll;
}

您不能使用 respondsToSelector: 代替 conformsToProtocol: 因为选择器方法将始终为派生自的任何类返回 YES UIResponder(就像所有内容一样),您必须重写项目中每个 UIViewController 上的旋转委托(delegate)才能使其正常工作。相反,您可以创建一个空白协议(protocol) (CustomRotation)。在您的自定义轮换类中,需要该协议(protocol)并包括上面的重写轮换委托(delegate)方法,并具有您想要的限制。

最后确保在 xcode 和/或您的 Application: didFinishLaunchingWithOptions 方法中正确设置您支持的界面方向。

关于ios - 相机图像选择器控件 - iOS7 中的自动旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18824769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com