iOS - UISplitViewController


前言

	NS_CLASS_AVAILABLE_IOS(3_2) @interface UISplitViewController : UIViewController
	@available(iOS 3.2, *)		 public class UISplitViewController : UIViewController
  • 大多數時候,iPhone、iPod 應用與 iPad 應用開發沒有太大的區別,但是 iPad 的屏幕比 iPhone 大,設計程序時可以充分利用 iPad 的大屏幕特點,例如 TabBar 和 Navigation 的使用會減少,相應的會采用新的一種 ViewController 來代替,那就是 UISplitViewController,這個控件是 iPad 專用的視圖控制器。使用 SplitViewController 導航時,橫屏情況下,左邊顯示一個導航表,點擊導航項時右邊顯示對應的詳情。橫屏情況下顯示方式會有所不同,默認只顯示詳情面板,原來左側的導航列表會通過浮動窗口隱藏,需要從邊緣向內側拖動來顯示。

  • 在 iPhone 應用中,使用導航控制器由上一層界面進入下一層界面,在下一層界面處理完成后,用戶可以非常方便的返回上一層界面。這種方式在 iPhone 應用里非常方便,因為小屏幕通常只能顯示一個界面,但對於 iPad 來說,那么大的屏幕只顯示一個列表會顯得不太好看,同時用戶操作也不方便,所以在 iPad 中,通常使用 SplitViewController 來實現導航。iPhone 和 iPad 的系統設置就是典型的按設備區別界面的應用。

    • self.splitViewController.viewControllers[0] // 表示 Master 頁
    • self.splitViewController.viewControllers[1] // 表示 Detail 頁

1、splitViewController 的創建

  • Objective-C

    	// 初始化分割視圖控制器
    	UISplitViewController *splitViewController = [[UISplitViewController alloc] init];
    
    	// 設置分割面板的 2 個視圖控制器            
    	splitViewController.viewControllers = @[navigationController, detailViewController];
    
      	// 添加到窗口  
    	[self addChildViewController:splitViewController];
    	[self.view addSubview:splitViewController.view];
    
    	// 做為 window 的根視圖控制器
    	self.window.rootViewController = splitViewController;
    
  • Swift

    	// 初始化分割視圖控制器
    	let splitViewController = UISplitViewController()
    
    	// 設置分割面板的 2 個視圖控制器
    	splitViewController.viewControllers = [navigationController, detailViewController]
    
    	// 添加到窗口
    	self.addChildViewController(splitViewController)
    	self.view.addSubview(splitViewController.view)
    
    	// 做為 window 的根視圖控制器
    	self.window.rootViewController = splitViewController
    

2、判斷設備類型

  • Objective-C

    	// 初始化列表和詳情面板
    
    		// 初始化列表面板,可以為表格視圖控制器
        	MasterViewController *masterViewController = [[MasterViewController alloc] init];
        	
        	// 初始化詳情面板
        	DetailViewController *detailViewController = [[DetailViewController alloc] init];
    
    		// 用導航包裝列表面板,顯示導航條,如果是分割面板也不影響功能
        	UINavigationController *navigationController = [[UINavigationController alloc] 
        	                                              initWithRootViewController:masterViewController];
    
    	// 根據設備類型創建分割視圖控制器
    	/*
    		UIUserInterfaceIdiomUnspecified = -1,
    		UIUserInterfaceIdiomPhone     NS_ENUM_AVAILABLE_IOS(3_2),   // iPhone and iPod touch style UI
    		UIUserInterfaceIdiomPad       NS_ENUM_AVAILABLE_IOS(3_2),   // iPad style UI
    		UIUserInterfaceIdiomTV        NS_ENUM_AVAILABLE_IOS(9_0),   // Apple TV style UI
    		UIUserInterfaceIdiomCarPlay   NS_ENUM_AVAILABLE_IOS(9_0),   // CarPlay style UI
    	*/
    		
    		// 如果是 iPhone 或 iPod 則只顯示列表頁,如果是 iPad 則顯示分割面板
        	if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
    
            	// 添加到窗口
            	[self addChildViewController:navigationController];
            	[self.view addSubview:navigationController.view];
        	}
        	else {
            
            	// 初始化分割視圖控制器
            	UISplitViewController *splitViewController = [[UISplitViewController alloc] init];
            
            	// 設置分割面板的 2 個視圖控制器
            	splitViewController.viewControllers = @[navigationController, detailViewController];
            
            	// 添加到窗口
            	[self addChildViewController:splitViewController];
            	[self.view addSubview:splitViewController.view];
    
    			// 做為 window 的根視圖控制器
    			self.window.rootViewController = splitViewController;
        	}
    	
    	// 表格點擊
    
        	- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
            
            	// 調用 DetailViewController 的方法更新詳細頁
            	[self.splitViewController.viewControllers[1] loadDetailViewController:[dataArray 
            	                                                            objectAtIndex:indexPath.row]];
            
            	// 如果是 iPhone、iPod 則導航到詳情,跳轉到 detailViewController,取消選中狀態
            	if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
                
                	[tableView deselectRowAtIndexPath:indexPath animated:YES];
                
                	[self.navigationController pushViewController:self.splitViewController.viewControllers[1] 
                	                                     animated:YES];
            	}
        	}
    
  • Swift

    	// 初始化列表和詳情面板
    	
    		// 初始化列表面板,可以為表格視圖控制器
        	let masterViewController = MasterViewController()
        	
        	// 初始化詳情面板
        	let detailViewController = DetailViewController()
    
    		// 用導航包裝列表面板,顯示導航條,如果是分割面板也不影響功能
        	let navigationController = UINavigationController(rootViewController: masterViewController)
    
    	// 根據設備類型創建分割視圖控制器
    	/*
    		case Unspecified
    		case Phone    @available(iOS 3.2, *)  // iPhone and iPod touch style UI
    		case Pad      @available(iOS 3.2, *)  // iPad style UI
    		case TV       @available(iOS 9.0, *)  // Apple TV style UI
    		case CarPlay  @available(iOS 9.0, *)  // CarPlay style UI
    	*/
    	
    		// 如果是 iPhone 或 iPod 則只顯示列表頁,如果是 iPad 則顯示分割面板
    		if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
    
            	// 添加到窗口
            	self.addChildViewController(navigationController)
            	self.view.addSubview(navigationController.view)
        	}
        	else {
            
            	// 初始化分割視圖控制器
            	let splitViewController = UISplitViewController()
            
            	// 設置分割面板的 2 個視圖控制器
            	splitViewController.viewControllers = [navigationController, detailViewController]
            
            	// 添加到窗口
            	self.addChildViewController(splitViewController)
            	self.view.addSubview(splitViewController.view)
    
    			// 做為 window 的根視圖控制器
    			self.window.rootViewController = splitViewController
        	}
    
    	// 表格點擊
    
        	func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
            
            	// 調用 DetailViewController 的方法更新詳細頁
            	(self.splitViewController?.viewControllers[1] as! DetailViewController)
            	                          .loadDetailViewController(dataArray[indexPath.row])
            
            	// 如果是 iPhone、iPod 則導航到詳情頁,跳轉到 detailViewController,取消選中狀態
            	if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Phone {
                
                	tableView.deselectRowAtIndexPath(indexPath, animated: true)
                
    				self.navigationController?
    				    .pushViewController((self.splitViewController?
    				    				            .viewControllers[1] as! DetailViewController), 
    				    			  animated: true)
            	}
        	}
    

3、Storyboard 中設置

  • 在 Storyboard 場景中設置

    • 在 Storyboard 場景綁定的 Controller 中設置

      	// 獲取 Master 頁
      	self.splitViewController.viewControllers[0]
      
      	// 獲取 Detail 頁
      	self.splitViewController.viewControllers[1]
      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM