iOS 面向協議封裝全屏旋轉功能

LinXunFeng發表於2018-09-15

關於使用面向協議來封裝功能的實戰可以參考我上篇文章 【iOS 面向協議方式封裝空白頁功能】,這裡就不再贅述,我們直接進入使用階段吧。 本篇文章只有一個目的,那就是隻要遵守協議,一行程式碼隨意切換全屏~

如果對面向協議有疑問的同學可以看下我之前的兩篇文章

iOS - Swift 面向協議程式設計(一)

iOS - Swift 面向協議程式設計(二)

開源庫

Name Link
GitHub LXFProtocolTool
Wiki Wiki首頁
本文 Demo LXFFullScreenable

使用Cocoapods的方式來安裝即可

pod 'LXFProtocolTool/FullScreenable'
複製程式碼

一、配置

在AppDelegate中實現如下方法

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return UIApplication.shared.lxf.currentVcOrientationMask
}
複製程式碼

二、使用案例

方法與屬性的呼叫都需要名稱空間加上 lxf,如isFullScreen -> lxf.isFullScreen

isFullScreen : 獲取當前遵守協議者是否為全屏狀態
複製程式碼
func switchFullScreen(
    isEnter: Bool? = nil,
    specifiedView: UIView? = nil,
    superView: UIView? = nil,
    config: FullScreenableConfig? = nil,
    completed: ((_ isFullScreen: Bool)->Void)? = nil
)
複製程式碼
Name Type Desc
isEnter Bool? 是否進入全屏
specifiedView UIView? 指定即將全屏的檢視
superView UIView? 作為退出全屏後specifiedView的父檢視
config FullScreenableConfig? 配置
completed ((_ isFullScreen: Bool)->Void)? 進入/退出 全屏後的回撥

switchFullScreen的呼叫者為UIView時,如果specifiedViewnil會自動填寫,superView也是如此

switchFullScreen方法不推薦直接使用,不過當遵守協議者為UIViewController時,可以通過使用預設引數來切換螢幕方向lxf.switchFullScreen()

lxf_FullScreenable_1

以下分兩種情況說明

UIViewController

func enterFullScreen(
    specifiedView: UIView,
    config: FullScreenableConfig? = nil,
    completed: FullScreenableCompleteType? = nil
)
複製程式碼
func exitFullScreen(
    superView: UIView,
    config: FullScreenableConfig? = nil,
    completed: FullScreenableCompleteType? = nil
)
複製程式碼

以上兩個方法是對switchFullScreen的抽離,使呼叫時對引數的傳遞更加清晰

1、遵守協議 FullScreenable

class LXFFullScreenableController: UIViewController, FullScreenable { }
複製程式碼

2、指定檢視進入全屏

lxf.enterFullScreen(specifiedView: cyanView)
複製程式碼

3、指定檢視退出全屏,並新增到當前控制器的view

lxf.exitFullScreen(superView: self.view)
複製程式碼

?自動進入|退出全屏

func autoFullScreen(
    specifiedView: UIView,
    superView: UIView,
    config: FullScreenableConfig? = nil
) 
複製程式碼
  • 控制器可以呼叫該方法來註冊自動進入或退出全屏,各控制器之間互不影響。
  • view手動進入全屏會遮蔽當前控制器的自動全屏功能,退出方可恢復

UIView

func enterFullScreen(
    specifiedView: UIView? = nil,
    config: FullScreenableConfig? = nil,
    completed: FullScreenableCompleteType? = nil
)
複製程式碼
func exitFullScreen(
    superView: UIView? = nil,
    config: FullScreenableConfig? = nil,
    completed: FullScreenableCompleteType? = nil
)
複製程式碼

以上兩個方法是對switchFullScreen的抽離,使呼叫時對引數的傳遞更加清晰

1、遵守協議 FullScreenable

class LXFFullScreenView: UIButton, FullScreenable { }
複製程式碼
let cyanView = LXFFullScreenView()
複製程式碼

2、進入全屏

cyanView.lxf.enterFullScreen()
複製程式碼

3、退出全屏

cyanView.lxf.exitFullScreen()
複製程式碼

這裡是對遵守了FullScreenable協議的檢視進入全屏切換,由於程式碼內部已經經過自動檢視填寫,所以直接呼叫相應的方法即可,當然也可以自己指定specifiedViewsuperView

lxf_FullScreenable_2

三、FullScreenableConfig說明

上述的方法都有一個config引數,預設為nil,即為預設配置

相關屬性說明

Name Type Desc Default
animateDuration Double 進入/退出 全屏時的旋轉動畫時間 0.25
enterFullScreenOrientation UIInterfaceOrientation 進入全屏時的初始方向 landscapeRight

這裡我們把動畫時間設定為1s,初始方向為後來看看效果

FullScreenableConfig(
    animateDuration: 1,
    enterFullScreenOrientation : .landscapeLeft
)
複製程式碼
cyanView.lxf.enterFullScreen(config: diyConfig)
cyanView.lxf.exitFullScreen(config: diyConfig)
複製程式碼

lxf_FullScreenable_3

結語

到這裡相關的說明已羅列完畢,有什麼不清楚的可以下載Demo看看,或者在文章下方留言提問

LXFProtocolTool 主要是通過協議的方式來方便快捷地實現一些的實用功能,除了本文提及的全屏旋轉功能外還有其它實用功能的封裝,具體內容可以到 Wiki首頁 查詢。如果你有什麼想實現的功能也可以提出來,喜歡的就給個Star鼓勵下我吧 ? ? ?,感謝支援!

相關文章