如何为 iPhone 5 显示器加载 xib

Posted

技术标签:

【中文标题】如何为 iPhone 5 显示器加载 xib【英文标题】:How to load xib for iPhone 5 display 【发布时间】:2012-10-30 19:15:03 【问题描述】:

我有一个使用 IB 创建的应用程序,带有一个标签栏和几个标签,其中一个标签视图的背景图像无法自动调整大小(拉伸)。该视图有十几个隐藏在背景后面的按钮,并且按钮的位置必须根据背景进行更改。

我正在考虑复制 XIB 文件并编辑 XIB 以选择 568 像素背景图像并相应地重新定位页面下方的按钮。然后在运行时我想添加代码以在 iPhone 5 上选择 568 像素(iPhone x/5 选择不是问题)”。

最后一件事,我想使用相同的视图控制器和连接(如果可能的话),因为所有代码都是通用的。有可能这样做吗?如何创建 XIB 并使其在选项卡选择时可见。

【问题讨论】:

使用 IB 使用正确的自动调整大小设置来定位按钮,然后提供两个图像 background.pngbackground@2x.png,后者将用于视网膜(包括 iphone5)。 【参考方案1】:

您可以检查屏幕的高度,并以编程方式选择要使用的 xib:

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

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    MyFirstViewController *vc1 = nil;
    MySecondViewController *vc2 = nil;

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
        CGSize screenSize = [[UIScreen mainScreen] bounds].size;
        if(screenSize.height == 568) 
            vc1 = [[MyFirstViewController alloc] initWithNibName:@"LargeFirstViewController" bundle:nil];
            vc2 = [[MySecondViewController alloc] initWithNibName:@"LargeSecondViewController" bundle:nil];
        
        if(screenSize.height == 480) 
            vc1 = [[MyFirstViewController alloc] initWithNibName:@"SmallFirstViewController" bundle:nil];
            vc2 = [[MySecondViewController alloc] initWithNibName:@"SmallSecondViewController" bundle:nil];
        
    
    else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
        // ... Add iPad code here if relevant.
    

    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[vc1, vc2];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;

要以编程方式更改标签栏图标图像,请在视图控制器中编辑以下内容(将“YOUR-IMAGE”替换为实际名称...不要放置扩展名(例如 .png)):

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        self.tabBarItem.image = [UIImage imageNamed:@"YOUR-IMAGE"];
    
    return self;

当您创建一个新的 xib 文件时,不要忘记选择“文件所有者”(在“占位符”下)并将“自定义类”设置为属性检查器中的实际视图控制器类。此外,在选择“文件所有者”时,转到“连接检查器”并将“视图”出口拖到 xib 的顶层视图。

【讨论】:

我的意思是我的标签栏是在 IB 中创建的,所以我从不设置 VC。根据您的回答,我正在尝试调整“self.tabBarController.viewControllers = @[vc1, vc2];”通过将属性复制到可变数组、更改和设置。 如果标签栏控制器位于 XIB 中,您可能无法轻松地做您想做的事情。相反,我建议考虑以如上所述的方式以编程方式创建选项卡栏控制器。 好的,在 Application:ApplicationDidFinishLaunching 中,我做了 initWithNibName 位,然后将 self.tabBarController.viewControllers 复制到一个可变对象,更改了可变对象中的一个条目并将 self.tabBarController.viewControllers 属性设置为我的可变对象换一个VC。这行得通,我得到了新的背景,但我更改的选项卡上的图像现在消失了。有任何想法吗?为什么? JS,我想我会改变我的代码来做你说的,因为我会减少 iPad 版本的标签。谢谢您的帮助。由于还没有 15 个学分,因此无法升级。顺便说一句,参考手册上说以前的 VC 已发布,如何设置属性释放 VC(我是 C++ 人)。我没有使用 ARC。参考:“如果您在运行时更改此属性的值,标签栏控制器会在安装新视图控制器之前删除所有旧视图控制器”。再次感谢。 @PeterPurple 没问题 :) 至于 Objective-C 中的内存管理,对象有一个“保留”计数,可以由任何具有有效指针的代码“释放”。在这里查看我的帖子:intertech.com/Blog/Post/…

以上是关于如何为 iPhone 5 显示器加载 xib的主要内容,如果未能解决你的问题,请参考以下文章

如何为 iphone 3.5 和 iphone 4 英寸屏幕(ios 6 和 ios7)设计 Single xib?

如何为所有 iPhone 设备支持一个 xib,直到 iPhone 6 Plus?

加载不同的xib

如何为 iPad 加载不同的笔尖?

如何使用 Xcode 4.5 为 iPhone 4 和 iPhone 5 创建 xib

如何为本地化应用加载 XIB?