2025-01-08

常用的一些頁面效果逸吵,做下記錄

1. 文字漸入漸出的效果

// 創(chuàng)建文本視圖
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 150))
label.text = "這是一段示例文字\n這是一段示例文字\n這是一段示例文字\n這是一段示例文字\n這是一段示例文字\n這是一段示例文字\n這是一段示例文字\n這是一段示例文字\n這是一段示例文字\n"
label.textColor = .black
label.numberOfLines = 0
label.font = UIFont.systemFont(ofSize: 16)
self.view.addSubview(label)
        
// 創(chuàng)建漸變蒙版圖層
let gradientMaskLayer = CAGradientLayer()
gradientMaskLayer.frame = label.bounds
// 設(shè)置漸變顏色,這里從透明到白色再到透明,實(shí)現(xiàn)上下漸變消失效果
gradientMaskLayer.colors = [UIColor.clear.cgColor, UIColor.white.cgColor, UIColor.white.cgColor, UIColor.clear.cgColor]
// 對(duì)應(yīng)顏色的位置分布,調(diào)整可改變漸變區(qū)域范圍
gradientMaskLayer.locations = [0.0, 0.3, 0.7, 1.0]
// 設(shè)置漸變方向?yàn)榇怪狈较颍◤纳系较拢?gradientMaskLayer.startPoint = CGPoint(x: 0.5, y: 0)
gradientMaskLayer.endPoint = CGPoint(x: 0.5, y: 1)
        
// 將漸變蒙版圖層應(yīng)用到文字視圖上
label.layer.mask = gradientMaskLayer

2. 靜態(tài)圖片作為背景的模糊效果

let context = CIContext(options: nil)
guard let image = try result.get().image.scaled(toHeight: screenHeight) else {return}
let ciImage = CIImage(cgImage: image.cgImage!)
let filter = CIFilter(name: "CIGaussianBlur")
filter?.setValue(ciImage, forKey: kCIInputImageKey)
filter?.setValue(75.0, forKey: kCIInputRadiusKey)
let result = filter?.value(forKey: kCIOutputImageKey) as! CIImage
let cgImage = context.createCGImage(result, from: result.extent)
let blurredImage = UIImage(cgImage: cgImage!)
// 將處理后的圖片設(shè)置為背景
imageView.image = blurredImage

3. 剪裁圖片的窗口

// 添加遮罩層
let maskLayer = CAShapeLayer()
let path = UIBezierPath(rect: view.bounds)
let cropPath = UIBezierPath(rect: .init(x: 0, y: 0, width: 100, height: 100))
path.append(cropPath.reversing())
maskLayer.path = path.cgPath
maskLayer.fillColor = UIColor(hex: 0x000000, alpha: 0.3).cgColor
self.view.layer.addSublayer(maskLayer)

4. 提取image的主要顏色

func dominantColor(from image: UIImage, darkenBy factor: CGFloat = 0.2) -> UIColor? {
    // 縮小圖片尺寸以加快處理速度
    let scaleFactor: CGFloat = 20.0
    let thumbSize = CGSize(width: image.size.width / scaleFactor, height: image.size.height / scaleFactor)
    
    // 創(chuàng)建上下文
    guard let cgImage = image.cgImage,
    let colorSpace = CGColorSpace(name: CGColorSpace.sRGB),
    let context = CGContext(data: nil,
                                  width: Int(thumbSize.width),
                                  height: Int(thumbSize.height),
                                  bitsPerComponent: 8,
                                  bytesPerRow: Int(thumbSize.width) * 4,
                                  space: colorSpace,
                                  bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) else {
        return nil
    }
    
    // 在上下文中繪制縮小后的圖像
    context.draw(cgImage, in: CGRect(origin: .zero, size: thumbSize))
    
    // 獲取像素?cái)?shù)據(jù)
    guard let data = context.data else { return nil }
    let pixelData = data.bindMemory(to: UInt8.self, capacity: Int(thumbSize.width * thumbSize.height * 4))
    
    // 使用字典統(tǒng)計(jì)顏色出現(xiàn)頻率
    var colorFrequency: [UIColor: Int] = [:]
    
    for x in 0..<Int(thumbSize.width) {
        for y in 0..<Int(thumbSize.height) {
            let offset = 4 * (y * Int(thumbSize.width) + x)
            let red = pixelData[offset]
            let green = pixelData[offset + 1]
            let blue = pixelData[offset + 2]
            let alpha = pixelData[offset + 3]
            
            // 過濾透明像素
            guard alpha > 0 else { continue }
            
            // 創(chuàng)建顏色對(duì)象
            let color = UIColor(
                red: CGFloat(red) / 255.0,
                green: CGFloat(green) / 255.0,
                blue: CGFloat(blue) / 255.0,
                alpha: CGFloat(alpha) / 255.0
            )
            
            // 統(tǒng)計(jì)顏色頻率
            colorFrequency[color, default: 0] += 1
        }
    }
    
    // 找到出現(xiàn)次數(shù)最多的顏色
    guard let dominantColor = colorFrequency.max(by: { $0.value < $1.value })?.key else { return nil }
    
    // 調(diào)整顏色亮度
    return darkenedColor(dominantColor, by: factor)
}

4.CA動(dòng)畫

let clockwiseFullRotation = CABasicAnimation(keyPath: "transform.rotation")
//clockwiseFullRotation.byValue = 0
clockwiseFullRotation.fromValue = 0
clockwiseFullRotation.toValue = Double.pi * 2 // 順時(shí)針一圈
clockwiseFullRotation.duration = 1.0 // 動(dòng)畫時(shí)長 1 秒
clockwiseFullRotation.repeatCount = 1 //重復(fù)次數(shù)
clockwiseFullRotation.beginTime = 0.0 //開始時(shí)間
clockwiseFullRotation.speed = 1.0 //動(dòng)畫速度
clockwiseFullRotation.autoreverses = false //自動(dòng)到放
clockwiseFullRotation.fillMode = .forwards //動(dòng)畫結(jié)束后的狀態(tài)
layer.add(clockwiseFullRotation, forKey: "rotationAnimation")

// 創(chuàng)建動(dòng)畫組
let animationGroup = CAAnimationGroup()
animationGroup.animations = [animation, animation1, animation2]
animationGroup.duration = 1.3 // 設(shè)置動(dòng)畫組的總持續(xù)時(shí)間
animationGroup.repeatCount = .infinity
animationGroup.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
layer.add(animationGroup, forKey: "scaleAnimation")
1.在 CABasicAnimation 中,動(dòng)畫的 keyPath 決定了它作用的屬性挺益,以下是常用的動(dòng)畫 keyPath,分為幾大類:
?   position:改變圖層的中心點(diǎn)位置乘寒。
?   position.x:僅改變水平位置望众。
?   position.y:僅改變垂直位置。
?   anchorPoint:改變圖層的錨點(diǎn)位置。
?   opacity:改變圖層的不透明度烂翰,范圍是 0.0(完全透明)到 1.0(完全不透明)夯缺。
?   transform.scale:整體縮放(x、y甘耿、z 方向同時(shí)縮放)踊兜。
?   transform.scale.x:水平縮放。
?   transform.scale.y:垂直縮放佳恬。
?   transform.scale.z:深度縮放捏境。
?   transform.rotation:繞 z 軸旋轉(zhuǎn)(單位是弧度)。
?   transform.rotation.x:繞 x 軸旋轉(zhuǎn)毁葱。
?   transform.rotation.y:繞 y 軸旋轉(zhuǎn)典蝌。
?   transform.rotation.z:繞 z 軸旋轉(zhuǎn)。
?   backgroundColor:背景顏色的變化头谜。
?   borderColor:邊框顏色的變化骏掀。
?   shadowColor:陰影顏色的變化。
?   borderWidth:邊框?qū)挾鹊淖兓??   cornerRadius:圓角半徑的變化柱告。
?   shadowOffset:陰影偏移量的變化截驮。
?   shadowOpacity:陰影透明度的變化。
?   shadowRadius:陰影模糊半徑的變化际度。
?   transform:綜合形變葵袭,可以包含旋轉(zhuǎn)、縮放乖菱、平移等坡锡。
?   transform.translation.x:沿 x 軸平移。
?   transform.translation.y:沿 y 軸平移窒所。
?   transform.translation.z:沿 z 軸平移鹉勒。
?   path:形狀路徑的變化(通常用于 CAShapeLayer 的 path 屬性)。
?   contents:圖層內(nèi)容的變化(例如圖像替換)吵取。
?   zPosition:改變圖層在 z 軸的順序禽额。
?   bounds:圖層邊界的變化(大小)皮官。
?   frame:圖層的框架(位置和大懈埂)。
?   masksToBounds:是否剪裁子圖層捺氢。
2.fillMode 決定動(dòng)畫執(zhí)行后的視覺效果:
?   .forwards 表示動(dòng)畫結(jié)束后藻丢,圖層將保持在動(dòng)畫結(jié)束的狀態(tài)(雖然視覺效果是保持的,但實(shí)際上圖層的真實(shí)值并未改變摄乒,仍是初始值)悠反。
?   常見的 fillMode 選項(xiàng):
?   .removed(默認(rèn)值):動(dòng)畫結(jié)束后恢復(fù)到初始狀態(tài)残黑。
?   .forwards:動(dòng)畫結(jié)束后保持在結(jié)束狀態(tài)。
?   .backwards:動(dòng)畫開始前问慎,先應(yīng)用開始狀態(tài)。
?   .both:結(jié)合 .forwards 和 .backwards挤茄。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末如叼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子穷劈,更是在濱河造成了極大的恐慌笼恰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歇终,死亡現(xiàn)場離奇詭異社证,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)评凝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門追葡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奕短,你說我怎么就攤上這事宜肉。” “怎么了翎碑?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵谬返,是天一觀的道長。 經(jīng)常有香客問我日杈,道長遣铝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任莉擒,我火速辦了婚禮酿炸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘涨冀。我一直安慰自己梁沧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布蝇裤。 她就那樣靜靜地躺著廷支,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栓辜。 梳的紋絲不亂的頭發(fā)上恋拍,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音藕甩,去河邊找鬼施敢。 笑死周荐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的僵娃。 我是一名探鬼主播概作,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼默怨!你這毒婦竟也來了讯榕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤匙睹,失蹤者是張志新(化名)和其女友劉穎愚屁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痕檬,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡霎槐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梦谜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丘跌。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唁桩,靈堂內(nèi)的尸體忽然破棺而出碍岔,到底是詐尸還是另有隱情,我是刑警寧澤朵夏,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布蔼啦,位于F島的核電站,受9級(jí)特大地震影響仰猖,放射性物質(zhì)發(fā)生泄漏捏肢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一饥侵、第九天 我趴在偏房一處隱蔽的房頂上張望鸵赫。 院中可真熱鬧,春花似錦躏升、人聲如沸辩棒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽一睁。三九已至,卻和暖如春佃却,著一層夾襖步出監(jiān)牢的瞬間者吁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工饲帅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留复凳,地道東北人瘤泪。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像育八,于是被迫代替她去往敵國和親对途。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容