這是我今天要示範的畫面,我們立即開始吧!
我們首先先分析一下圖層的結構
背景 -> 毛玻璃 -> 其他元件
看過以下專案圖,我發現有一下物件會一直重複使用,因此我決定建立工廠模式,讓我的物件可以用簡潔的生成,以及風格一致:
首先建立一個工廠模式的class
背景的素材如下,一共有三個:
因此我建立一個enum 包覆這三個case
善用enum可以避免重複的程式碼,並且降低輸入錯誤的風險
建立switch 應對enum的情況產出圖片。
var uiImage:UIImage
switch type{
case .background1:
uiImage = #imageLiteral(resourceName: "background1.png")
case .background2:
uiImage = #imageLiteral(resourceName: "background2.png")
case .backgroundBlurred:
uiImage = #imageLiteral(resourceName: "backgroundBlurred.png")
}
這樣是一個雛形,如果可以用一個funtion包裝,我們更容易在應對的情境選擇:
class BackGroundFactory{
enum backGroundType{
case background1,background2,backgroundBlurred
}
static func makeImage(type:backGroundType)->UIImageView{
let backgroundImage : UIImageView = {
var uiImage:UIImage
switch type{
case .background1:
uiImage = #imageLiteral(resourceName: "background1.png")
case .background2:
uiImage = #imageLiteral(resourceName: "background2.png")
case .backgroundBlurred:
uiImage = #imageLiteral(resourceName: "backgroundBlurred.png")
}
let imageView = UIImageView(image: uiImage, highlightedImage: nil)
imageView.frame = CGRect(x: 0, y: 0, width: ScreenSize.width.value, height: ScreenSize.height.value)
imageView.contentMode = .scaleAspectFill
return imageView
}()
return backgroundImage
}
}
專案總共用了三次頭像,分別大中小。
enum ImageType {
case large,medium,small
}
因應大小對應switch
var radius = ScreenSize.width.value
switch size {
case .large:
radius = radius * 0.8
case .medium:
radius = radius * 0.3
case .small:
radius = radius * 0.2
}
然後包裝:
class UserImageFactory{
static func makeImageView(size:ImageType,image:UIImage?)->UIImageView{
let imageView = UIImageView()
if let image = image {
imageView.image = image
}else{
imageView.image = UIImage(systemName: "photo")
}
var radius = ScreenSize.width.value
switch size {
case .large:
radius = radius * 0.8
case .medium:
radius = radius * 0.3
case .small:
radius = radius * 0.2
}
imageView.frame = CGRect(
x: 100,
y: 78,
width: radius,
height: radius)
imageView.layer.cornerRadius = radius * 0.5
imageView.clipsToBounds = true
return imageView
}
enum ImageType {
case large,medium,small
}
}
以上範例了兩個簡易工廠模式,接下來介紹利用工廠模式可以做到的效果:
private var backgroundImage : UIImageView = {
return BackGroundFactory.makeImage(type: .background1)
}()
實例化一個物件變得非常輕鬆簡單容易,當然物件的種類還可以從enum中選擇。
private var glassView : UIVisualEffectView = {
var glassView = GlassFactory.makeGlass()
return glassView
}()
實例化毛玻璃
實例化的方式不太一樣?沒錯,我實例化的方式是先宣告一個物件的型別,後面緊隨一個閉包,賦予這個型別初始化的屬性。
這個實例化風格在純程式碼風格非常常見。