View Programming Guide for iOS 学习笔记_1

这是View Programming Guide for iOS 学习笔记的第二部分,在翻译这部分的时候我照抄了文档里的代码,因为实在markdown编辑器里写的,没有代码补全功能,这让我有时间一遍照抄一边思考,看着这些官方代码有了一点点体会,这些体会我会稍后写在下一篇博客里。

在外部显示器显示内容

为了在外部显示器显示内容,你必须为你的应用程序创建一个额外的window,并且把这个额外的window与代表外部显示器的屏幕对象连接起来。新window(们)默认情况下通常是与主屏幕相联系的。改变与这个window相关联的屏幕对象会导致这个window的内容改变到相应的显示器上。一旦这个window与一个正确的屏幕相关联,你可以郑家子视图到这个window上,并且可以像你应用程序主屏幕去表现他。
UIScreen类保存了一个屏幕对象的列表来表示可用的显示器硬件。通常情况下,对于iOS设备,只有一个屏幕对象来表示主显示器,但是那些支持连接额外显示的的设备有额外的屏幕对象可供使用。这些支持连接额外显示器的设备包括iPhone、配备retina显示屏的iPod和iPad。

注意
因为外部显示器必须是一个video连接,你不应该期望与一个外部显示器相关联的window上的view和control的触摸事件。当有需要时,你的应用程序有责任去更新这个window。因此,为了映射你主window上的内容,你的应用程序应该为额外显示器的window创建view(们)设置的副本,并协同更新这些views和在主window的view(们)。

为外部显示器显示内容的步骤如下。下面的步骤总结的是基本的步骤:

  1. 在应用程序启动时,为屏幕注册连接和取消连接的notification。
  2. 当是时候为外部显示器显示内容时,创建并配置一个window
    • 使用UIScreen的screens属性去为外部显示器获得一个screen对象。(UIScreen类的screen属性的描述:Returns an array containing all of the screens attached to the device. 声明:+ (NSArray
处理屏幕连接(connecttion)和取消连接(disconnection)notification

屏幕connection notification和disconnection notification对于优雅的处理外部显示器的改变是非常重要的。当用户连接或者断开一个显示器,系统发送合适的notification到你的应用程序。你应该使用这些notification去更新你应用程序的状态并且创建或者释放与这个显示器关联的window。

关于connection 和 disconnection notification需要记住的重要的是就是,这些notification会在任何时候到来,即使你的应用程序是处于后台挂起的状态。因此最好用一个在你应用程序运行时的持续时间内都存在的对象观察这个notification,比如说你的应用程序委托。当你的应用程序挂起时这些notifications会处于队列中,直到你的应用程序退出挂起状态并开始在前台或后台运行。

下框2-1显示了用来注册connection或disconnection notification的的代码。这个方法会在你应用程序的代理在初始化的时候被调用,但是,你可以在你应用程序的任何地方注册这些notification。处理方法的实现在框2-2中。

2-1

- (void)setupScreenConnectionNotificationHandlers{
    NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
    [center addObsever:self selector(handleScreenConnectionNotification:) name:UIScreenDidConnectNotification object:nil];
    [center addObsever:self selector(handleScreenDisconnectionNotification:) name:UIScreenDidDisconnectNotification object:nil]
}

如果一个外部显示器在你的应用程序活动的时候被添加到设备上,你的应用程序为这个显示器应该创建第二个window并用一些内容填充这个window。这些内容不需要是你想要显示的最终内容。比如,如果你的应用程序还没有准备好实用这个额外的屏幕,应用程序可以使用第二块屏幕去显示一些站位内容。如果你没有为这个screen创建一个window,或者你创建了一个window但是没有显示它,外部显示器监视显示空白的区域。

框2-2 显示了如何去创建一个第二window并用一些内容填充它。在这个例子中,这个应用程序在用来接收connection、disconnection notification的处理方法中创建了这个第二window。这个为connection notification的处理方法创建了一个第二window,将其与新连接的screen相关联并调用了应用程序主view controller中的方法去添加一些内容到这个window并且把这个window显示出来。这个为disconnection notification的处理方法释放了这个window并通知主view controller以使view controller可以做相应的呈现。

2-2

- (void)handleScreenConnectionNotification:(NSNotification *)aNotification{
    UIScreen * newScreen = [aNotification object];/* The object associated with the notification. 
    This is often the object that posted this notification. It may be nil.
    Typically you use this method to find out what object a notification applies to when you receive a notification.*/

    CGRect screenBounds = newScreen.bounds;

    if(!_secondWindow){
        _secondWindow = [[UIWindow alloc]initWithFrame:ScreenBounds];
        _secondWindow.screen = newScreen;

        //Set the initial UI for window.
        [viewController displaySelectionInSecondaryWindow:_secondWindow];

    }

}

- (void)hanleScreenDisconnectionNotification:(NSNotification *)aNotification{

    if(_secondWindow){

        //Hide and the delete the window.
        _secondWindow.hidden = YES;
        [_secondWindow release];
        _secondWindow = nil;

        //Update the main screen based on what is showing here.
        [viewController displaySelectionOnMainScreen];
    }
}
为外部显示器配置一个window

为了在外部屏幕上显示一个window,你必须将这个window关联到一个正确的screen对象上。这个过程包括定位正确的UIScreen对象并将其赋给window的screen属性。你可以通过UIScreen的类方法screens来获得screen对象的列表。这这个方法返回的array包含至少一个对象(主screen)。如果存在第二个对象,这个第二个对象代表一个已连接的外部显示器。

框2-3显示了一个方法,这个方法在应用程序启动的时候被调用去查看一个外部显示器是不是已经连接上了。如果已经连接上了,这个方法创建一个window,把这个window与外部显示器关联起来,并在显示这个window之前添加一些占位符对象。在这个例子里,占位符内容是一个白色的北京和一个指明没有内容显示的label。为了显示这个window,这个方法改变了window的hidden属性而不是调用makeKeyAndVisiable。这是因为这个window只包含静态的内容并且不用来处理事件。

2-3

- (void)checkForExistingScreenAndInitializeIfPresent{

    if([[UIScreen screens]count]>1){

        //Associate the window with the second screen.
        //The main screen is always at index 0.
        UIScreen* secondScreen = [[UIScreen screens] objectAtIndex:1];
        CGRect screenBounds = secondScreen.bounds;

        _secondWindow = [[UIWindow alloc] initWithFrame:screenBounds]];
        _secondWindow.screen = secondScreen;

        //Add a white background to the window
        UIView* whiteField = [[UIView alloc] initWithFrame:screenBounds]];
        whiteField.background = [UIColor whiteColor];

        [_secondWindow addSubview:whiteField];
        [whiteField release];

        //Center a label in the view;
        NSString* noContetString = [NSString stringWithFormat:@"<no content!>"];
        CGSize stringSize = [noContentString sizeWithFont:[UIFont systemFontOfSize:18]];

        CGRect labelSize = CGRectMake((screenBounds.size.width - stringSize.width) / 2.0,(screenBounds.size.height - stringSize.heigth) / 2.0, stringSize.width, stringSize.heigth);

        UILabel* noContentLabel = [[UILabel alloc] initWithFrame:labelSize];
        noContentLabel.text = noContentString;
        noContentLabel.font = [UIFont systemFontOfSize:18];
        [whiteFiled addSubview:noContentLabel];

        //Go ahead and show the window.
        _secondWindow.hidden = NO;
    }
}

重要: 你应该总是在显示这个window之前将这个window与一个screen相关联。虽然有可能改变目前可见的屏幕窗口,但这样的改变是一项昂贵的操作,应该避免。

一旦这个外部显示器的window被显示,你的应用程序就可以像更新其他的window一样去更新它。你可以添加或者移除子视图,改变子视图的内容,使用动画改变view(们),并使view(们)的内容无效。

配置外部显示器的Screen Mode

取决于你的内容,你可能想要在把你的window与screen关联之前改变screen mode。许多screen支持多种分辨率,其中一些使用不同的像素纵横比。screen对象通常使用默认的screen mode,但是你可以改变这个mode以更好的显示你的content。比如没如果你使用OpenEL ES实现了一个游戏,并且你的游戏是为640 x 480像素的屏幕设计的,你可能会改变这个screen的screen mode。

如果你计划使用除默认screen mode之外的一个screen mode,你应该在将这个screen与window相关联之前设置这个screen的screen mode。UIScreenMode类定义了一个单独的screen mode的许多属性。你可以通过一个screen的avilableModes属性获得这个屏幕支持mode的list,并且遍历这个list找到你需要的那个mode。(For more information about screen modes, see UIScreenMode Class Reference.)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值