42

试图让我的应用程序同时适用于 iPhone 5 和 iPhone 4/4s。我尝试了“自动布局”,但似乎不适用于我的应用程序,还读到它在 iOS 5 中不受支持。自动布局在具有 UIScrollview 和在代码中调整大小的 UIPicker 的视图控制器上特别失败。拥有两个故事板一个 4 英寸和一个 3.5 英寸似乎是要走的路。

两个 Storyboard aproch 似乎是我的解决方案。所以这给我留下了两个问题;

  1. 如果是 4/4s/5,那么代码应该在哪里检测?我会假设在didFinishLaunchingWithOptions 方法中的appDelegate.m

  2. 如何更改“主情节提要”?

4

5 回答 5

60

这是一个很好的问题。

你需要做的是,

  1. 选择您当前的 4/4 故事板,转到文件,复制,然后给它一个 iPhone 5 特定的名称。 确保选中 Target 和您的应用名称。

  2. 接下来,您必须在情节提要中选择场景,并在 Attributes Inspector 中将大小更改为 Retina 4 Full Screen。这使您可以重新排列此显示的所有内容。

  3. 最后在应用程序 didFinishLaunchingWithOptions 中粘贴以下代码以及您为 4 英寸故事板提供的故事板名称。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        UIStoryboard *storyBoard;
    
        CGSize result = [[UIScreen mainScreen] bounds].size;
        CGFloat scale = [UIScreen mainScreen].scale;
        result = CGSizeMake(result.width * scale, result.height * scale);
    
        if(result.height == 1136){
            storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_5" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }
    }
    
    return YES;
    }
    

如果有人不知道如何执行第 1 步,请执行以下操作。

  1. 转到项目目录并复制粘贴MainStoryboard.storyboard并将新故事板重命名为MainStoryboard5.storyboard.

  2. 通过右键单击 Project 并单击在项目中添加这个新的故事板MainStoryboard5.storyboard(在 Xcode 中)Add Files to ....

  3. 现在我们在 xcode 中有两个故事板。

小费

完成上述所有操作后,您可能必须使用“产品 > 清洁”才能正常工作。

于 2012-09-21T19:43:35.413 回答
7

目前唯一的方法是检查你是否使用 iPhone 5 是[UIScreen mainScreen] bounds][[UIScreen mainScreen] scale].

BOOL isIphone5 = (([[UIDevice currentDevice] userInterfaceIdiom] 
== UIUserInterfaceIdiomPhone) && (([UIScreen mainScreen].bounds.size.height * 
[[UIScreen mainScreen] scale]) >= 1136));

这仅在您至少向Default-568h@2x.png应用程序中添加了启动图像时才有效。否则,这将始终返回 false。(因为如果您没有启动图像,屏幕将被黑框化)

要将情节提要设置为您的 iPhone 5 版本,您可能想看看这个问题

于 2012-09-21T19:35:00.983 回答
2

我从 fields.cage 答案中汲取灵感并将其改编为我的代码,效果很好。谢谢 !!

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        UIStoryboard *storyBoard;

        CGSize result = [[UIScreen mainScreen] bounds].size;
        CGFloat scale = [UIScreen mainScreen].scale;
        result = CGSizeMake(result.width * scale, result.height * scale);

        if(result.height == 1136){


             self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone5" bundle:nil] autorelease];

        }
        else
        {
             self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease];
        }
    }
于 2012-10-10T17:23:28.170 回答
1

我最近一直在做的是在我需要检查设备的任何类中添加一个定义语句。这也可以在任何全局头文件中完成。

#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)

布尔测试来自Detect iphone 5 4" screen

bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136));
if (isiPhone5) {
        // Setup For iPhone 5 Screen Size
    UIStoryboard *storyBoard;

    storyBoard = [UIStoryboard storyboardWithName:@"MyiPhone5StoryboardName" bundle:nil];
    UIViewController *initViewController = [storyBoard instantiateInitialViewController];
    [self.window setRootViewController:initViewController];
}

如果您已经在使用 storyboards并且只想从您的项目开始时为 iPhone 5 设备使用的默认值更改故事板,这将非常有效。如果您从头开始使用现有的非故事板项目,您可以这样做。

#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)

bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136));
if (isiPhone5) {
        // Load iPhone 5 Storyboard
    UIStoryboard *storyBoard;

    storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil];
    UIViewController *initViewController = [storyBoard instantiateInitialViewController];
    [self.window setRootViewController:initViewController]; 
}

else if (IS_IPAD) {
        // Load IPAD StoryBoard
    UIStoryboard *storyBoard;

    storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
    UIViewController *initViewController = [storyBoard instantiateInitialViewController];
    [self.window setRootViewController:initViewController]; 
}

else {
        // Load the iPhone 3.5" storyboard
    UIStoryboard *storyBoard;

    storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    UIViewController *initViewController = [storyBoard instantiateInitialViewController];
    [self.window setRootViewController:initViewController]; 
}

当我现在开始一个项目时,我在故事板中设计 iPhone 3.5" 版本(如果我正在使用故事板),然后当我完成该设计时,我进入我的项目文件并找到故事板文件。因为故事板文件只是一个XML 布局文件,我可以将该文件加载到我最喜欢的文本编辑器中并更改两个标签。

将 iPhone 转换为 iPad

  1. 在文件顶部找到 targetRuntime="iOS.CocoaTouch
  2. 改成 targetRuntime="iOS.CocoaTouch.iPad"
  3. 在文件底部添加您可能会发现这个 <simulatedScreenMetrics key="destination" type="retina4"/>
  4. 将此更改为<simulatedScreenMetrics key="destination"/>

最后一项只有在您的主情节提要文件设置为 4" iPhone 屏幕时才会出现。

这里重要的是,如果您只将 iPhone 5 添加到现有项目中,您只需要第一次检查以覆盖默认值,并加载您的特殊故事板文件。这实际上使我不必在 iPhone 5 的代码中手动布局所有对象。

于 2012-10-24T19:04:42.450 回答
0

第一个工作非常好,简单明了,但如果你想集成多个设备,请看这里:

  1. 使用名为 iPhone5_Storyboard 的 Storyboard 为 iPhone5 创建一个项目。

  2. 关闭应用程序并在文件夹中克隆名为 iPhone5_Storyboard 的 Main Story 并重命名为 iPhone4_Storyboard 不要忘记更改大小并重新排序 xcode 界面构建器中的所有对象。

  3. 如果您想要通用版本,则可选,在 xcode 内部使用 Add File 并为 iPad 添加新的 Storyboard EMPTY 目标,打开 iphone5_storyboard 使用 CMD+A 并复制所有内容并粘贴到 iPad 的 Empty Story 中(需要重新排序对象,但全部链接和工作)。

  4. 在 Xcode 中,在 TARGET 下设置 Universal App 并在 MainStoryboard 下设置 iPhone5_Storyboard,在 iPad Main Story 下设置 iPad_Storyboard。

  5. 现在感谢这篇文章的第一个答案,我们必须在AppDelegate.m中使用此代码实现所有不同的故事:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        UIStoryboard *storyBoard;

        CGSize result = [[UIScreen mainScreen] bounds].size;
        CGFloat scale = [UIScreen mainScreen].scale;
        result = CGSizeMake(result.width *scale, result.height *scale);

//----------------HERE WE SETUP FOR IPHONE4/4s/iPod----------------------

        if(result.height == 960){
            storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }

//----------------HERE WE SETUP FOR IPHONE3/3s/iPod----------------------

        if(result.height == 480){
            storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }
    }

        return YES;
 }

就是这样,我们有一个适用于 iPhone 3/3Gs/4/4s/5 iPod (AllGen) iPad 1/2/3/4 Mini 和 Retina 的通用应用程序

多谢你们

于 2013-03-29T16:29:15.673 回答