构建自适应iPhone和iPad设备工程

Posted PJXWang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建自适应iPhone和iPad设备工程相关的知识,希望对你有一定的参考价值。

需要注意如下几个方面:API、导航模式和设计层面

API:都使用一个操作系统-ios,因此,他们的API基本是一样的,但有一些是iPad专用的,比如UIPopoverController控制器(用于呈现“漂浮”类型的视图)和

UISplitViewController控制器(用于控制器用于屏幕分栏)。UIPopoverController视图是一种临时视图,触摸UIPopoverController视图的外边,则关闭视图。

UIPopoverController控制器

常用方法:

setContentViewController: animated: 设置内容视图的大小的方法

presentPopoverFromRect:  inView: permittedArrowDirections: animated: 指定一个矩形区域的位置作为锚点来呈现Popover视图的方法。

 

presentPopoverFromBarButtonItem:  permittedArrowDirections: animated: 指定一个按钮作为锚点来呈现Popover视图的方法

dismissPopoverAnimated: 关闭Popover视图的方法。

@property(nonatomicreadonlygetter=isPopoverVisibleBOOL popoverVisible; 只读属性,判断Popover视图是否可见

@property(nonatomicreadonlyUIPopoverArrowDirection  popoverArrowDirection 判断Popover视图箭头的方向。

 UIPopoverController实例:

点击show时弹出打印机设置界面:连接如下图:

点击Coding Show时代码实现弹出SelectViewController视图:

@property(nonatomic,strong) UIPopoverController *poc;

- (IBAction)show:(id)sender {

    SelectViewController *popoverViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SelectViewController"];

    if (self.poc == nil) {

        UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:popoverViewController];

        self.poc = [[UIPopoverController alloc]initWithContentViewController:nav];

    }

    [self.poc presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

}

 UISplitViewController控制器

横屏SplitView,屏幕被分割为左右两个视图,右侧是DetailView,负责显示详细信息,左侧是MasterView,其中有个导航列表,用于为右侧的DetailView导航。MasterView的导航列表占有320点的固定大小,在竖屏的情况下,MasterView会隐藏起来

删除模板生成的View Controller ,拖拽Split View Controller到设计界面,生成四个视图控制器

选中Split View Controller,打开其属性检查器,将Orientation属性选择为Landspace(横屏)。master View可以去除导航控制器:直接删除,重新将Split View Controller拖拽到Table View  Controller ,从弹出的界面中选择master View controller,重新连接视图控制器。

 

MasterTableViewController设计

#import <UIKit/UIKit.h>

#import "DetailViewController.h"

@interface MasterTableViewController : UITableViewController

@property(nonatomic,strong)NSArray *listData;

@property(strong,nonatomic)DetailViewController *detailViewController;

@end

 

#import "MasterTableViewController.h"

 

@interface MasterTableViewController ()

 

@end

 

@implementation MasterTableViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    self.listData = [[NSArray alloc]initWithObjects:@"Blue View",@"Yellow View" ,nil];

    self.detailViewController = (DetailViewController*)[self.splitViewController.viewControllers lastObject];

    /*

self.splitViewController用于获得它们所在的分栏视图控制器。splitViewController属性由UISplitViewController类提供,在iPad的UISplitViewController作为根视图控制器时使用。UISplitViewController的viewControllers属性是NSArray指针,只能存两个视图控制器,第一个是Master View的根视图控制器,第二个元素是DetailView的根视图控制器

*/

   

}

#pragma mark - Table view data source

 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;

}

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return 2;

}

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString * cellIdentifier = @"cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

        if (cell == nil) {

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

    }

    NSInteger row = [indexPath row];

    cell.textLabel.text = [self.listData objectAtIndex:row];

    

    return cell;

}

 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

    NSInteger row = [indexPath row];

    [self.detailViewController updateView:row];

}

@end

 

#import <UIKit/UIKit.h>

#import "BlueViewController.h"

#import "YellowViewController.h"

 

 

DetailViewController设计

@interface DetailViewController : UIViewController

@property(nonatomic,strong) YellowViewController *yellowViewController;

@property(nonatomic,strong) BlueViewController *blueViewController;

-(void)updateView:(NSInteger)row;

@end

 

#import "DetailViewController.h"

 

@interface DetailViewController ()

 

@end

 

@implementation DetailViewController

 - (void)viewDidLoad {

    [super viewDidLoad];

    self.blueViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"blueViewController"];

    self.yellowViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"yellowViewController"];

    [self.view addSubview:self.blueViewController.view];

}

-(void)updateView:(NSInteger)row;

{

    if (row == 0) {

        if (self.yellowViewController.view.superview) {

            [self.yellowViewController.view removeFromSuperview];

        }

        if (self.blueViewController.view.superview == nil) {

            [self.view addSubview:self.blueViewController.view];

        }

    }else{

        if (self.blueViewController.view.superview ) {

            [self.blueViewController.view removeFromSuperview];

        }

        if (self.yellowViewController.view.superview == nil) {

            [self.view  addSubview:self.yellowViewController.view];

        }

    }

}

@end

 

模态视图专用属性

iPad横屏时,模态视图只是显示在屏幕中间,而非占有整个屏幕,这些是由模态视图控制器的modelPresentationStyle属性来控制的,该属性由枚举类型UIModalPresentationStyle定义,

typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {

        UIModalPresentationFullScreen = 0, //全屏状态

        UIModalPresentationPageSheet , //它的宽度是固定的768点,因此,iPad横屏时的模态视图,竖屏时全屏呈现

        UIModalPresentationFormSheet , //固定540*620

        UIModalPresentationCurrentContext , //与父视图控制器有相同的呈现方式。

        UIModalPresentationCustom,

        UIModalPresentationOverFullScreen,

        UIModalPresentationOverCurrentContext ,

        UIModalPresentationPopover ,

        UIModalPresentationNone  = -1,         

};

 

以上是关于构建自适应iPhone和iPad设备工程的主要内容,如果未能解决你的问题,请参考以下文章

屏幕自适应宽度

AngularJS谷歌地图点击事件不在ios设备ipad和iphone中触发

在 iOS 设备(iPhone / iPad)上安装应用程序或从 Xcode 创建 .ipa,无需代码签名和开发人员帐户

Rem是如何实现自适应布局的?

Swift自适应布局(Adaptive Layout)教程

如何适应不同的屏幕尺寸