日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

swift水波效果

發布時間:2025/7/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 swift水波效果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

//

//? LCWaveView.swift

//? sinaDemo

//

//? Created by admin on 17/4/21.

//? Copyright ? 2017 super. All rights reserved.

//

?

import UIKit

?

class LCWaveView: UIView {

?

? ? //角速度

? ? var waveFrequency: CGFloat = 1.5

? ? //速度

? ? var waveSpeed: CGFloat = 0.6

? ? //高度

? ? var waveHeight: CGFloat = 5

? ? //真實圖層

? ? fileprivate var realWaveLayer: CAShapeLayer = CAShapeLayer()

? ? //蒙版圖層

? ? fileprivate var maskWaveLayer: CAShapeLayer = CAShapeLayer()

? ? //浮動view

? ? var overView: UIView?

? ? //時間

? ? fileprivate var timer: CADisplayLink?

? ? //真實圖層顏色

? ? var realWaveColor: UIColor = UIColor.orange {

? ? ? ? didSet {

? ? ? ? ? ? realWaveLayer.fillColor = realWaveColor.cgColor

? ? ? ? }

? ? }

? ? //蒙版圖層顏色

? ? var maskWaveColor: UIColor = .orange {

? ? ? ? didSet {

? ? ? ? ? ? maskWaveLayer.fillColor = maskWaveColor.cgColor

? ? ? ? }

? ? }

? ? //偏距

? ? fileprivate var offset: CGFloat = 0

?? ?

? ? fileprivate var priFrequency: CGFloat = 0

? ? fileprivate var priWaveSpeed: CGFloat = 0

? ? fileprivate var priWaveHeight: CGFloat = 0

? ? fileprivate var isStarting: Bool = false

? ? fileprivate var isStopping: Bool = false

?? ?

? ? //init View

? ? override init(frame: CGRect) {

? ? ? ? super.init(frame: frame)

?? ? ? ?

? ? ? ? var f = self.bounds

? ? ? ? f.origin.y = frame.size.height

? ? ? ? f.size.height = 0

? ? ? ? maskWaveLayer.frame = f

? ? ? ? realWaveLayer.frame = f

? ? ? ? self.backgroundColor = .clear

?? ? ? ?

? ? ? ? self.layer.addSublayer(realWaveLayer)

? ? ? ? self.layer.addSublayer(maskWaveLayer)

?? ? ? ?

? ? }

? ? //convenience init

? ? convenience init(frame: CGRect, color: UIColor) {

? ? ? ? self.init(frame: frame)

?? ? ? ?

? ? ? ? realWaveColor = color

? ? ? ? maskWaveColor = color.withAlphaComponent(0.5)

?? ? ? ?

? ? ? ? realWaveLayer.fillColor = realWaveColor.cgColor

? ? ? ? maskWaveLayer.fillColor = maskWaveColor.cgColor

? ? }

?? ?

? ? required init?(coder aDecoder: NSCoder) {

? ? ? ? fatalError("init(coder:) has not been implemented")

? ? }

?? ?

? ? //添加漂浮view

? ? func addOverView(oView: UIView) -> Void {

? ? ? ? overView = oView

? ? ? ? overView?.center = self.center

? ? ? ? overView?.frame.origin.y = self.frame.height - (overView?.frame.height)!

? ? ? ? self.addSubview(overView!)

? ? }

?? ?

? ? //開始浮動

? ? func startWave() -> Void {

? ? ? ? if !isStarting {

? ? ? ? ? ? stop()

? ? ? ? ? ? isStarting = true

? ? ? ? ? ? isStopping = false

? ? ? ? ? ? priWaveHeight = 0

? ? ? ? ? ? priFrequency = 0

? ? ? ? ? ? priWaveSpeed = 0

?? ? ? ? ? ?

? ? ? ? ? ? timer = CADisplayLink(target: self, selector: #selector(waveEvent))

? ? ? ? ? ? timer?.add(to: .current, forMode: .commonModes)

? ? ? ? }

? ? }

?? ?

? ? //停止浮動

?? ?

? ? func stop() -> Void {

? ? ? ? if timer != nil {

? ? ? ? ? ? timer?.invalidate()

? ? ? ? ? ? timer = nil

? ? ? ? }

? ? }

?? ?

?? ?

? ? func stopWave() -> Void {

?? ? ? ?

? ? ? ? if !isStopping {

? ? ? ? ? ? isStarting = false

? ? ? ? ? ? isStopping = true

? ? ? ? }

? ? }

?? ?

? ? //浮動事件

? ? func waveEvent() -> Void {

?? ? ? ?

? ? ? ? if isStarting {

? ? ? ? ? ? if priWaveHeight < waveHeight {

? ? ? ? ? ? ? ? priWaveHeight = priWaveHeight + waveHeight/100.0

? ? ? ? ? ? ? ? var f = self.bounds

? ? ? ? ? ? ? ? f.origin.y = f.size.height - priWaveHeight

? ? ? ? ? ? ? ? f.size.height = priWaveHeight

? ? ? ? ? ? ? ? maskWaveLayer.frame = f

? ? ? ? ? ? ? ? realWaveLayer.frame = f

? ? ? ? ? ? ? ? priFrequency = priFrequency + waveFrequency/100.0

? ? ? ? ? ? ? ? priWaveSpeed = priWaveSpeed + waveSpeed/100.0

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? isStarting = false

? ? ? ? ? ? }

? ? ? ? }

?? ? ? ?

? ? ? ? if isStopping {

? ? ? ? ? ? if priWaveHeight > 0 {

? ? ? ? ? ? ? ? priWaveHeight = priWaveHeight - waveHeight / 50.0

? ? ? ? ? ? ? ? var f = self.bounds

? ? ? ? ? ? ? ? f.origin.y = f.size.height

? ? ? ? ? ? ? ? f.size.height = priWaveHeight

? ? ? ? ? ? ? ? maskWaveLayer.frame = f

? ? ? ? ? ? ? ? realWaveLayer.frame = f

? ? ? ? ? ? ? ? priFrequency = priFrequency - waveFrequency / 50.0

? ? ? ? ? ? ? ? priWaveSpeed = priWaveSpeed - waveSpeed / 50.0

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? isStopping = false

? ? ? ? ? ? ? ? stopWave()

? ? ? ? ? ? }

? ? ? ? }

?? ? ? ?

? ? ? ? offset += priWaveSpeed

?? ? ? ?

? ? ? ? let width = frame.width

? ? ? ? let height = CGFloat(priWaveHeight)

?? ? ? ?

? ? ? ? let path = CGMutablePath()

? ? ? ? path.move(to: CGPoint(x: 0, y: height))

? ? ? ? var y: CGFloat = 0

?? ? ? ?

? ? ? ? let maskPath = CGMutablePath()

? ? ? ? maskPath.move(to: CGPoint(x: 0, y: height))

?? ? ? ?

? ? ? ? let offset_f = Float(offset * 0.045)

? ? ? ? let waveFrequency_f = Float(0.01 * priFrequency)

?? ? ? ?

? ? ? ? for x in 0...Int(width) {

? ? ? ? ? ? y = height * CGFloat(sinf(waveFrequency_f * Float(x) + offset_f))

? ? ? ? ? ? path.addLine(to: CGPoint(x: CGFloat(x), y: y))

? ? ? ? ? ? maskPath.addLine(to: CGPoint(x: CGFloat(x), y: -y))

? ? ? ? }

? ? ? ? if overView != nil {

? ? ? ? ? ? let centX = self.bounds.size.width/2

? ? ? ? ? ? let centY = height * CGFloat(sinf(waveFrequency_f * Float(centX) + offset_f))

? ? ? ? ? ? let center = CGPoint(x: centX , y: centY + self.bounds.size.height - overView!.bounds.size.height/2 - priWaveHeight - 1 )

? ? ? ? ? ? overView?.center = center

? ? ? ? }

?? ? ? ?

? ? ? ? path.addLine(to: CGPoint(x: width, y: height))

? ? ? ? path.addLine(to: CGPoint(x: 0, y: height))

?? ? ? ?

? ? ? ? path.closeSubpath()

? ? ? ? self.realWaveLayer.path = path

?? ? ? ?

? ? ? ? maskPath.addLine(to: CGPoint(x: width, y: height))

? ? ? ? maskPath.addLine(to: CGPoint(x: 0, y: height))

?? ? ? ?

? ? ? ? maskPath.closeSubpath()

? ? ? ? self.maskWaveLayer.path = maskPath

? ? }

}

?

【微分享】:山不辭土,故能成其高;海不辭水,故能成其深

轉載于:https://www.cnblogs.com/supersr/p/5386083.html

總結

以上是生活随笔為你收集整理的swift水波效果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。