zoukankan      html  css  js  c++  java
  • iOS屏幕适配知识

      

    一、旋转处理
        第一步:注册通知 [[NSNotificationCenter defaultCenter] addObserver:self
                                                         selector:@selector(changeFrames:)                                                     
                                name:UIDeviceOrientationDidChangeNotification
                                                           object:nil]; 
        第二把:处理接收事件
    -(void)changeFrames:(NSNotification *)notification{
        NSLog(@"change notification: %@", notification.userInfo);
        float width=[[UIScreen mainScreen]bounds].size.width*[[UIScreen mainScreen] scale];
        float height=[[UIScreen mainScreen]bounds].size.height*[[UIScreen mainScreen] scale];
        if ([[UIDevice currentDevice] orientation]==UIInterfaceOrientationPortrait
            || [[UIDevice currentDevice] orientation]==UIInterfaceOrientationPortraitUpsideDown) {
            NSLog(@">>>portrait");
            self.frame=CGRectMake(0, 0, height, width);
        }else{
            NSLog(@">>>landscape");
            self.frame=CGRectMake(0, 0, width, height);
        }
        
        NSLog(@"view—> %@",self);
    }

    二、获取屏幕分辨率
        //得到当前屏幕的尺寸:
        CGSize size_screen = [[UIScreenmainScreen]bounds].size;
        //获得缩放率:
        CGFloat scale_screen = [UIScreen mainScreen].scale;    

        此时屏幕尺寸的宽高与scale的乘积就是相应的分辨率值。
        CGRect sizeOfA4 = CGRectMake(0, 0, 595, 842);//生成PDF文件时按A4标准
        CGRect sizeOfA5 = CGRectMake(0, 0, 421, 595);//生成PDF文件时按A5标准
        注意:不管scale=1还是scale=2,纸张的标准sizeOfA4和sizeOfA5的设置都不变,这是因为我们通常设置的宽高在iOS体系下都是逻辑上的point,并不是真实的像素!
    只要屏幕是等比例放大缩小,[[UIScreenmainScreen]bounds].size都不变。不同scale的系统会自动放大或缩小,这就是所有的应用在320x480和640x960环境下无差别运行的原因。

    三、设备标准
        iPhone/iPod Touch (320点 x 480点)
        普屏分辨率    320像素 x 480像素
        Retina分辨率 640像素 x 960像素

        iPad,iPad2/New iPad (768点 x 1024点)
        普屏        768像素 x 1024像素
        Retina屏  1536像素 x 2048像素

        换算关系 (在 iPhone3 上 1个 Point 相当于 1个pixel ; 而 iPhone4 上1个 point 就相当于4个 pixel;)
        普屏       1点 = 1像素   image.png 
        Retina屏   1点 = 2像素   image@2x.png  


    四、 真机与模拟器判断+设备类型判断
        #if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
            NSLog(@" on simulator");
        #else
            NSLog(@"not on simulator");
        #endif
        注意:TARGET_OS_IPHONE在真机和模拟器上都是1
        设备类型判断方法有两种:
        1. UI_USER_INTERFACE_IDIOM() 进行区分(ios 3.2以上),但是无法区分iphone和ipod
            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
                //设备为ipad
            } else {
                //设备为iphone 或 ipod
            }
        2. 使用 UIDevice.model 进行区分  (ios 2.0 >=)
            NSString *deviceType = [UIDevice currentDevice].model;    
            if([deviceType isEqualToString:@"iPhone"]) {
                  //iPhone
            }else if([deviceType isEqualToString:@"iPod touch"]) {
                //iPod Touch
            }else {
                //iPad
            }


    五、获取设备相关信息
        //软件信息
        NSLog(@"sysname=%@",[[UIDevice currentDevice] systemName]);// 系统名
        NSLog(@"systemVersion=%@",[[UIDevice currentDevice] systemVersion]); //版本号
        NSLog(@"model=%@",[[UIDevice currentDevice] model]); //类型(ipad、ipod、iphone)而[[UIDevice currentDevice] userInterfaceIdiom]只能判断iphone和ipad
        NSLog(@"olduuid=%@",[[UIDevice currentDevice] uniqueIdentifier]); //唯一识别码 ios5.0开始deprecated
        NSLog(@"name=%@",[[UIDevice currentDevice] name]); //设备名称
        NSLog(@"localizedModel=%@",[[UIDevice currentDevice] localizedModel]); // 本地模式
        NSLog(@"ios6UUID=%@",[[[UIDevice currentDevice] identifierForVendor] UUIDString]);//ios6.0开始available
        
       ----------注:以下内容未测试,摘自http://www.cnblogs.com/mrhgw/archive/2012/06/27/2565798.html---------------
        // 硬件信息
        [UIDevice platform];//平台
        [UIDevice cpuFrequency]];//cpu信息
        UIDevice busFrequency]];//总线
        [UIDevice totalMemory]];//总内存
        UIDevice userMemory]];//已经使用的内存
        -----------------------------------------------------------------------------------------------------------------------------
        //App信息
        NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
        CFShow(infoDictionary);//所有plist内容
        // app名称
        NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
        // app版本
        NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
        // app build版本
        NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];

        判断是否有照相机
        if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
            NSLog(@"有");
        else
            NSLog(@"没有");

    六、针对不同分辨率的设备,程序员只需要做三件事:
        1.提供app高清图标;
        2.UI图片素材@2x.png;
        3.从网络下载适配的图片(判断条件[[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2)
        -所有的iPhone、iPod Touch设备的 Point分辨率都是 320×480,也就是逻辑分辨率都一致,保证了App不需要修改也能正常的在高像素分辨率上运行,只是原来App中的图片会被拉升后显示,影响美观,没有发挥retina的优势。
        -程序内所有的GCRectMake都是逻辑分辨率,不影响位置和大小!做游戏开发最有用,普通app影响不大
        -问题:如何进行相对布局???(6.0之前有autoResizeMask,autoresizing    6.0可使用与android相对布局类似的autoLayout)

  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/jgCho/p/5033028.html
Copyright © 2011-2022 走看看