★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-eymhhsmb-ma.html
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html
目錄:[Swift]通天遁地Swiftios
本文將演示建立多種自定義Segment分段樣式的控件。git
首先確保已經安裝了所需的第三方類庫。雙擊查看安裝配置文件【Podfile】github
1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'PagingMenuController' 7 end
根據配置文件中的相關設置,安裝第三方類庫。swift
安裝完成以後,雙擊打開項目文件【DemoApp.xcodeproj】數組
依次建立四個自定義的視圖控制器,做爲分段控件每一個分段指向的頁面。xcode
在項目文件夾上點擊鼠標右鍵,彈出右鍵菜單。微信
【New File】->【Cocoa Touch】->【Next】->ide
【Class】:ViewController1post
【Subclass of】:UIView
【Language】:Swift
->【Next】->【Create】
點擊打開【ViewController1.swift】,如今開始編寫代碼,建立一個包含多行文字的段落。
1 import UIKit 2 //引入已經安裝的第三方類庫 3 import PagingMenuController 4 5 class ViewController1: UIViewController { 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 //初始化一個指定顯示區域的標籤對象 10 let textLabel = UILabel(frame: self.view.frame) 11 //設置標籤對象的文字對齊方式爲居中 12 textLabel.textAlignment = .center 13 //設置標籤對象的字體屬性 14 textLabel.font = UIFont.systemFont(ofSize: 24) 15 //設置標籤對象的文字內容 16 textLabel.text = "View Controller 1" 17 //設置標籤對象的背景顏色爲橙色 18 textLabel.backgroundColor = UIColor.orange 19 20 //將標籤對象添加到根視圖 21 view.addSubview(textLabel) 22 } 23 }
在項目文件夾上點擊鼠標右鍵,彈出右鍵菜單。
【New File】->【Cocoa Touch】->【Next】->
【Class】:ViewController2
【Subclass of】:UIView
【Language】:Swift
->【Next】->【Create】
點擊打開【ViewController2.swift】,如今開始編寫代碼,建立一個包含多行文字的段落。
1 import UIKit 2 //引入已經安裝的第三方類庫 3 import PagingMenuController 4 5 class ViewController2: UIViewController { 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 //初始化一個h指定顯示區域的標籤對象 10 let textLabel = UILabel(frame: self.view.frame) 11 //設置標籤對象的文字對齊方式爲居中 12 textLabel.textAlignment = .center 13 //設置標籤對象的字體屬性 14 textLabel.font = UIFont.systemFont(ofSize: 24) 15 //設置標籤對象的文字內容 16 textLabel.text = "View Controller 2" 17 //設置標籤對象的背景顏色爲洋紅色 18 textLabel.backgroundColor = UIColor.magenta 19 20 //將標籤對象添加到根視圖 21 view.addSubview(textLabel) 22 } 23 }
按下【Command】+【Shift】+【S】另存當前的類文件,做爲第三個分段的頁面。
【Save As】:ViewController3
點擊打開【ViewController3.swift】,如今開始編寫代碼,建立一個包含多行文字的段落。
1 import UIKit 2 //引入已經安裝的第三方類庫 3 import PagingMenuController 4 5 //記得修改類的名稱ViewController3 6 class ViewController3: UIViewController { 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 //初始化一個h指定顯示區域的標籤對象 11 let textLabel = UILabel(frame: self.view.frame) 12 //設置標籤對象的文字對齊方式爲居中 13 textLabel.textAlignment = .center 14 //設置標籤對象的字體屬性 15 textLabel.font = UIFont.systemFont(ofSize: 24) 16 //修改此處的標籤內容 17 textLabel.text = "View Controller 3" 18 //設置標籤對象的背景顏色爲紫色 19 textLabel.backgroundColor = UIColor.purple 20 21 //將標籤對象添加到根視圖 22 view.addSubview(textLabel) 23 } 24 }
按下【Command】+【Shift】+【S】另存當前的類文件,做爲第三個分段的頁面。
【Save As】:ViewController4
點擊打開【ViewController4.swift】,如今開始編寫代碼,建立一個包含多行文字的段落。
1 import UIKit 2 //引入已經安裝的第三方類庫 3 import PagingMenuController 4 5 //記得修改類的名稱ViewController4 6 class ViewController4: UIViewController { 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 //初始化一個h指定顯示區域的標籤對象 11 let textLabel = UILabel(frame: self.view.frame) 12 //設置標籤對象的文字對齊方式爲居中 13 textLabel.textAlignment = .center 14 //設置標籤對象的字體屬性 15 textLabel.font = UIFont.systemFont(ofSize: 24) 16 //修改此處的標籤內容 17 textLabel.text = "View Controller 4" 18 //設置標籤對象的背景顏色爲棕色 19 textLabel.backgroundColor = UIColor.brown 20 21 //將標籤對象添加到根視圖 22 view.addSubview(textLabel) 23 } 24 }
在左側的項目導航區,打開視圖控制器的代碼文件【ViewController.swift】
如今開始編寫代碼,建立一個包含四個分段的自定義分段控件。
1 import UIKit 2 //引入已經安裝的第三方類庫 3 import PagingMenuController 4 5 //初始化一個結構體,用來對分段視圖控件進行配置 6 private struct PagingMenuOptions: PagingMenuControllerCustomizable 7 { 8 //初始化一個控件類型屬性,用來設置分段控件的樣式和全部的子視圖控制器。 9 fileprivate var componentType: ComponentType 10 { 11 //分段控件的樣式,由另外一個方法來設置,同時設置一個數組,做爲分段控件的全部子視圖控制器。 12 return .all(menuOptions: MenuOptions(), pagingControllers: pagingControllers) 13 } 14 15 //添加一個數組屬性,做爲分段控件的全部子視圖控制器。 16 fileprivate var pagingControllers: [UIViewController] 17 { 18 //依次初始化四個子視圖控制器 19 let viewController1 = ViewController1() 20 let viewController2 = ViewController2() 21 let viewController3 = ViewController3() 22 let viewController4 = ViewController4() 23 24 //返回四個子視圖控制器,做爲子視圖控制器。 25 return [viewController1, viewController2, viewController3, viewController4] 26 } 27 28 //添加另外一個結構體屬性,用來設置分段控件的外觀樣式 29 fileprivate struct MenuOptions: MenuViewCustomizable 30 { 31 //給結構體添加一個屬性, 32 //設置分段控件的顯示模式爲分段按鈕。 33 //分段控件的樣式共有:標準樣式、分段按鈕樣式和無限樣式三種。 34 var displayMode: MenuDisplayMode 35 { 36 return .segmentedControl 37 } 38 //添加一個屬性,用來設置分段控件的焦點模式。 39 //焦點模式共有:空白、下劃線、圓角三種。 40 var focusMode: MenuFocusMode 41 { 42 return .roundRect(radius: 12, horizontalPadding: 8, verticalPadding: 8, selectedColor: UIColor.orange) 43 } 44 //添加第三個屬性,用來設置四個分段的內容。 45 var focusMode: MenuFocusMode 46 { 47 return .underline(height: 3, color: UIColor.blue, horizontalPadding: 10, verticalPadding: 0) 48 } 49 //添加一個結構體屬性,用來設置第一個分段的內容。 50 var focusMode: MenuFocusMode 51 { 52 return .none 53 } 54 //設置第一個分段的文字內容 55 var itemsOptions: [MenuItemViewCustomizable] 56 { 57 return [MenuItem1(), MenuItem2(), MenuItem3(), MenuItem4()] 58 } 59 } 60 61 //添加一個結構體,用來設置第一個分段的內容 62 fileprivate struct MenuItem1: MenuItemViewCustomizable 63 { 64 //設置第一個分段的顯示模式 65 var displayMode: MenuItemDisplayMode 66 { 67 //設置第一個分段的文字內容 68 return .text(title: MenuItemText(text: "News")) 69 } 70 } 71 72 //添加一個結構體,用來設置第二個分段的內容 73 fileprivate struct MenuItem2: MenuItemViewCustomizable 74 { 75 //設置第二個分段的顯示模式 76 var displayMode: MenuItemDisplayMode 77 { 78 //初始化一個菜單文本對象,並設置對象的文字內容,字體顏色,高亮顏色,字體,高亮字體等屬性。 79 let itemText = MenuItemText(text: "Message", color: .lightGray, selectedColor: .white, font: UIFont(name: "Arial", size: 16)!, selectedFont: UIFont(name: "Arial", size: 12)!) 80 //返回菜單文本對象,做爲第二個分段的文字內容 81 return .text(title: itemText) 82 } 83 } 84 85 //添加一個結構體,用來設置第三個分段的內容 86 fileprivate struct MenuItem3: MenuItemViewCustomizable 87 { 88 //設置第三個分段的顯示模式 89 var displayMode: MenuItemDisplayMode 90 { 91 //初始化一個指定顯示區域的視圖對象 92 let view = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 50)) 93 //初始化一個標籤對象 94 let label = UILabel(frame: CGRect(x: 0, y: 0, width: 80, height: 50)) 95 //設置標籤對象的文字對齊方式爲居中 96 label.textAlignment = .center 97 //設置標籤的文字內容 98 label.text = "Service" 99 //設置標籤的字體的顏色 100 label.textColor = UIColor.purple 101 //將標籤添加到根視圖中 102 view.addSubview(label) 103 //返回視圖對象 104 return .custom(view: view) 105 } 106 } 107 108 //添加一個結構體屬性,用來設置第四個分段的內容 109 fileprivate struct MenuItem4: MenuItemViewCustomizable 110 { 111 //設置第四個分段的顯示模式 112 var displayMode: MenuItemDisplayMode 113 { 114 //設置第四個分段的文字內容 115 return .text(title: MenuItemText(text: "Setting")) 116 } 117 } 118 } 119 120 class ViewController: UIViewController 121 { 122 override func viewDidLoad() 123 { 124 super.viewDidLoad() 125 // Do any additional setup after loading the view, typically from a nib. 126 //完成分段控件的屬性設置以後,開始建立分段控件。 127 128 //首先設置根視圖的背景顏色爲白色 129 view.backgroundColor = UIColor.white 130 131 //初始化一個分段菜單設置選項 132 let options = PagingMenuOptions() 133 //初始化一個分段菜單控制器 134 let pagingMenuController = PagingMenuController(options: options) 135 //設置分段菜單的控制器的代理對象爲當前的視圖控制器 136 pagingMenuController.delegate = self 137 //設置控制器的視圖的顯示區域 138 pagingMenuController.view.frame.origin.y += 20 139 pagingMenuController.view.frame.size.height -= 20 140 141 //將分段菜單控制器,做爲子視圖控制器,添加到當前的視圖控制器。 142 addChild(pagingMenuController) 143 //將分段菜單控制器中的視圖對象,添加到根視圖。 144 view.addSubview(pagingMenuController.view) 145 //當將子視圖控制器添加到父控制器時,必須調用子視圖控制器的移動方法。 146 pagingMenuController.didMove(toParent: self) 147 } 148 149 override func didReceiveMemoryWarning() { 150 super.didReceiveMemoryWarning() 151 // Dispose of any resources that can be recreated. 152 } 153 } 154 155 //添加一個擴展,用來實現協議中的方法 156 extension ViewController: PagingMenuControllerDelegate 157 { 158 //添加一個方法,用來監聽子視圖控制器在即將跳轉時的事件 159 func willMove(toMenu menuController: UIViewController, fromMenu previousMenuController: UIViewController) 160 { 161 //在控制檯輸出當前方法的名稱 162 print(#function) 163 //輸出上一個視圖控制器 164 print(previousMenuController) 165 //和即將跳轉到的視圖控制器的信息 166 print(menuController) 167 } 168 169 //添加一個方法,用來監聽子視圖控制器在完成跳轉後的事件。 170 func didMove(toMenu menuController: UIViewController, fromMenu previousMenuController: UIViewController) 171 { 172 //在控制檯輸出當前方法的名稱 173 print(#function) 174 //輸出上一個視圖控制器 175 print(previousMenuController) 176 //和當前的視圖控制器的信息 177 print(menuController) 178 } 179 180 //添加一個方法,用來監聽分段控件在即將切換時的事件 181 func willMove(toMenuItem menuItemView: MenuItemView, fromMenuItem previousMenuItemView: MenuItemView) 182 { 183 //在控制檯輸出當前方法的名稱 184 print(#function) 185 //輸出上一個分段的信息 186 print(previousMenuItemView) 187 //輸出即將切換到的分段的信息 188 print(menuItemView) 189 } 190 191 //添加一個方法,用來監聽分段在完成切換後的事件 192 func didMove(toMenuItem menuItemView: MenuItemView, fromMenuItem previousMenuItemView: MenuItemView) 193 { 194 //在控制檯輸出當前方法的名稱 195 print(#function) 196 //輸出上一個分段信息 197 print(previousMenuItemView) 198 //完成切換後的分段的信息 199 print(menuItemView) 200 } 201 }