10

最终这样做: 支持多方向的最简单方法?当应用程序处于横向时,如何加载自定义 NIB?效果很棒!

我在 Photoshop 中制作了一张图像,我想将其用作 iPad 应用程序中信息屏幕的背景。该图像还包含文本和一些图标。在图像周围,我有一个绿色的边框。

我想要达到的效果是:

当用户从纵向转向横向时,我希望图像(仅框架和图标)旋转 90 度,以便图像以横向模式显示,而不是在横向模式下获得框架的纵向视图。文本和图标是解耦的(我在不同的 UIImageView 中组织了不同的层)它们应该旋转 90 度。

我已经做的是以下内容:

用这个方法做了一些实验:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:

并尝试这样做:

self.btnFacebook.transform = CGAffineTransformMakeRotation(1.5707964);

我认为这会将 btnFacebook 属性向右旋转 90 度(如果我错了,请纠正我),因为它指定了正弧度。我似乎无法让它正常工作。这不应该将按钮围绕框架中的中心坐标旋转 90 度吗?这不会导致按钮位置发生变化(按钮是方形的)?

编辑

做了一张图:

在此处输入图像描述

由于图像显示图像背景(其上的一些自定义图形在两个方向上看起来都不错)从纵向变为横向并旋转,因此它不会在横向中显示为纵向,图标与背景分离,因此它们需要旋转为好吧,因为它们需要处于正确的方向(这是社交图标)。然而,文本位于同一位置,它仅旋转 90 度而不重新定位。

4

1 回答 1

21

我理解你的问题,因为你试图不旋转整个界面,而是单独旋转紫色和红色方块。

我创建了一个UIViewController类似于您的布局。

接口 Bulder 截图

黑色方块是 UIView,白色方块只是为了让我知道黑色视图何时旋转。此视图连接到view1控制器上的属性。

有 4 个按钮连接到btnx(x 运行 1 到 4)属性。

由于我不再想自动旋转界面,我只支持纵向。

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

为了手动进行旋转,我向 ViewController 添加了一个方法。它确定将组件从纵向旋转到当前方向所需的角度,创建旋转变换并将其应用于所有出口。

- (void)deviceDidRotate:(NSNotification *)notification
{
    UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation];
    double rotation = 0;
    UIInterfaceOrientation statusBarOrientation;
    switch (currentOrientation) {
        case UIDeviceOrientationFaceDown:
        case UIDeviceOrientationFaceUp:
        case UIDeviceOrientationUnknown:
            return;
        case UIDeviceOrientationPortrait:
            rotation = 0;
            statusBarOrientation = UIInterfaceOrientationPortrait;
            break;
        case UIDeviceOrientationPortraitUpsideDown:   
            rotation = -M_PI;
            statusBarOrientation = UIInterfaceOrientationPortraitUpsideDown;
            break;     
        case UIDeviceOrientationLandscapeLeft:     
            rotation = M_PI_2;   
            statusBarOrientation = UIInterfaceOrientationLandscapeRight;
            break;  
        case UIDeviceOrientationLandscapeRight:    
            rotation = -M_PI_2;
            statusBarOrientation = UIInterfaceOrientationLandscapeLeft;
            break;
    }
    CGAffineTransform transform = CGAffineTransformMakeRotation(rotation);
    [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        [self.btn1 setTransform:transform];
        [self.btn2 setTransform:transform];
        [self.btn3 setTransform:transform];
        [self.btn4 setTransform:transform];
        [self.view1 setTransform:transform];
        [[UIApplication sharedApplication] setStatusBarOrientation:statusBarOrientation];
    } completion:nil];
}

最后要做的是让操作系统调用我的方法。为此,我application:didFinishLaunchingWithOptions:在 AppDelegate 中添加了以下代码。

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

我不确定这是否正是您想要的,但我相信它至少是相似的,因此您可以从中获得一些想法来解决您的问题。我可以为我创建的工作 iPad 应用程序提供源代码来说明这一点。

于 2011-06-20T09:56:04.297 回答