如何在不改变iPhone应用程序中的设备方向的情况下更改应用程序的方向

时间:2012-09-27 06:12:01

标签: iphone objective-c ios

我想在不改变iPhone应用程序中的设备方向的情况下更改应用程序的方向。 我想以编程方式将我的视图从portraid模式更改为landscap模式。

并且还想知道苹果商店是否会接受这个?

谢谢

现在我从其他人那里得到了解决方案

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

当您在此时添加此行时会出现一条警告,并且要删除此警告,只需在您的实施文件中添加以下代码即可。

@interface UIDevice (MyPrivateNameThatAppleWouldNeverUseGoesHere)


    - (void) setOrientation:(UIInterfaceOrientation)orientation;


    @end

然后在波纹管方法中,只需要编写此代码..

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    {

        return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);

    }

但是现在想知道苹果应用商店是否接受了这个?

谢谢

5 个答案:

答案 0 :(得分:5)

使用此行以编程方式更改方向...

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

当你在此时添加此行时会出现一个警告,并且要删除此警告,只需在实现文件中添加以下代码即可。

@interface UIDevice (MyPrivateNameThatAppleWouldNeverUseGoesHere)
- (void) setOrientation:(UIInterfaceOrientation)orientation;
@end

然后在波纹管方法中,只需要编写此代码..

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    //    return NO;
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

我希望这可以帮到你..

:)

答案 1 :(得分:3)

添加一个类变量

Bool isInLandsCapeOrientation;

在viewDidLoad

将此标志设置为

isInLandsCapeOrientation = false;

添加以下功能

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
     if (!isInLandsCapeOrientation) {
         return (UIInterfaceOrientationIsPortrait(interfaceOrientation));

     }else {
         return  (UIInterfaceOrientationIsLandscape(interfaceOrientation));
     }
}

要将方向从纵向更改为横向,请在按钮操作

上进行
 - (IBAction)changeOrientationButtonPressed:(UIButton *)sender
{
    isInLandsCapeOrientation = true;
    UIViewController *viewController = [[UIViewController alloc] init];
    [self presentModalViewController:viewController animated:NO];
    [self dismissModalViewControllerAnimated:NO];
}

这对我来说很好。

答案 2 :(得分:1)

要将方向纵向模式更改为横向模式,请使用此代码

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

使用此代码以编程方式更改方向...

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

答案 3 :(得分:0)

该文档将orientation属性描述为只读,因此如果它有效,我不确定您将来可以依赖它(除非Apple做了聪明的事情并改变了它;强制方向改变无论用户当前如何握住他们的设备,都是如此明显的功能需求。)

作为替代方案,在viewDidLoad中插入的以下代码将成功(并且有点奇怪)强制方向(假设您已经修改过,您应该使用AutorotateToInterfaceOrientation):

if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]))
{
    UIWindow *window = [[UIApplication sharedApplication] keyWindow];
    UIView *view = [window.subviews objectAtIndex:0];
    [view removeFromSuperview];
    [window addSubview:view];
}

显然,如果用户当前正在以纵向方向握住他们的设备(这可能是因为您的shouldAutorotateToInterfaceOrientation仅设置为横向设置,并且如果用户使用此例程将其转换为横向设置,则会执行此操作将他们的设备保持在纵向模式)。如果您的UIDeviceOrientationIsPortrait设置为仅限肖像,则您只需将UIDeviceOrientationIsLandscapeshouldAutorotateToInterfaceOirentation交换。

出于某种原因,从主窗口中删除视图然后重新添加它会强制它查询shouldAutorotateToInterfaceOrientation并正确设置方向。鉴于这不是Apple批准的方法,也许应该避免使用它,但它适用于我。你的旅费可能会改变。但这也指其他技术。校验 SO discussion

答案 4 :(得分:0)

如果您只想在横向更改特定视图..那么您可以在其viewDidLoad中尝试以下内容

    float   angle = M_PI / 2; 
    CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
   [ [self.view] setTransform:transform];