当前位置: 首页 > news >正文

做淘宝客的网站需要备案吗做一个众筹网站多少钱

做淘宝客的网站需要备案吗,做一个众筹网站多少钱,企业邮箱哪家安全,厦门设计师网站一直觉得自己写的不是技术#xff0c;而是情怀#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的#xff0c;希望我的这条路能让你们少走弯路#xff0c;希望我能帮你们抹去知识的蒙尘#xff0c;希望我能帮你们理清知识的脉络#xff0…一直觉得自己写的不是技术而是情怀一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的希望我的这条路能让你们少走弯路希望我能帮你们抹去知识的蒙尘希望我能帮你们理清知识的脉络希望未来技术之巅上有你们也有我。 整个的原理在视频中已经说的很清楚了,不懂的话直接看视频是很明朗的. 前言 2023.09.03自定义封装一个视频拖拽的滚动条.需要满足一下的需求: 1.能拖拽快进 2.能点击快进 3.能预加载进度 4.显示当前播放进度 5.显示节点,点击跳到对应的节点 思路 该拖拽进度条底部是用来显示预加载进度的,使用系统自带的UIProgressView控件.最外面能拖拽播放进度的使用系统自带的UISlider控件.节点通过for循环创建按键出来的节点.这样有一个问题,当播放到节点的位置的时候,节点会挡住拖拽进度条的位置.所以拖拽进度条的原点,就用一张透明的图片(相当于不要了),然后创建一个按键在最前面,用一张圆形图片,挡住原来UISlider控件的原点,跟随滑动,播放的个过程 可以看到上面的图片就是用一个自定义的按键挡住了原来UISlider控件的原点. 重点 下面说一下整个封装的几个关键地方. 点击滚动条 算出point值的公式: let point ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue) / widthOfSlider)全部代码 // // PlayProgressView.swift // SwiftDemol // // Created by 冯汉栩 on 2023/8/21. //import UIKitclass PlayProgressView: UIView {// 预加载进度lazy var progress: UIProgressView {let progress UIProgressView()progress.progressTintColor UIColor(red: 169.0/255.0, green: 169.0/255.0, blue: 169.0/255.0, alpha: 1.0)//深灰色progress.trackTintColor UIColor(red: 228.0/255.0, green: 228.0/255.0, blue: 228.0/255.0, alpha: 1.0)//浅灰色return progress}()// 进度条 clearn_point slider_pointer_normallazy var slider: UISlider { [weak self] inlet slider UISlider()slider.minimumTrackTintColor UIColor(red: 74.0/255.0, green: 155.0/255.0, blue: 234.0/255.0, alpha: 1.0)//蓝色slider.maximumTrackTintColor UIColor.clear // 透明颜色slider.setThumbImage(UIImage(named: slider_pointer_normal), for: .normal)//clearn_point(透明) slider_pointer_normal(白色)slider.setThumbImage(UIImage(named: slider_pointer_normal), for: .highlighted)slider.setThumbImage(UIImage(named: slider_pointer_normal), for: .selected)let tapGestureRecognizer UITapGestureRecognizer(target: self, action: #selector(sliderTapped(gestureRecognizer:)))slider.addGestureRecognizer(tapGestureRecognizer)return slider}()//自定义point点lazy private var draggableButton: UIButton {let button UIButton()button.frame CGRect(x: 0, y: 0, width: 10, height: 20)//button.backgroundColor .blue.withAlphaComponent(0.5)button.setImage(UIImage(named: slider_pointer_normal), for: .normal)button.tag 111return button}()// 修改播放进度var changePointBlock:((_ point: Float) -Void)?// point数组var pointList [Float]()// 当前播放点的移动位置var pointX:Float 0.0 {didSet {let newX (self.frame.width - draggableButton.frame.width) * CGFloat(pointX)if newX.isNaN { return }draggableButton.frame CGRect(x: newX, y: draggableButton.frame.origin.y, width: draggableButton.frame.width, height: draggableButton.frame.height)slider.value pointX}}override init(frame: CGRect) {super.init(frame: frame)buildUI()}required init?(coder aDecoder: NSCoder) {fatalError(init(coder:) has not been implemented)}private func buildUI() {backgroundColor .clear // .green.withAlphaComponent(0.5)addSubview(progress)progress.snp.makeConstraints { make inmake.centerY.equalToSuperview()make.left.equalToSuperview().offset(21)//2是跟随slider的2偏移1make.right.equalToSuperview().offset(-2)make.height.equalTo(4)}addSubview(slider)slider.snp.makeConstraints { make inmake.centerY.equalToSuperview().offset(-1)make.left.equalToSuperview().offset(2)make.right.equalToSuperview().offset(-2)make.height.equalTo(20)}addSubview(draggableButton)let panGesture UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))draggableButton.addGestureRecognizer(panGesture)}override func layoutSubviews() {super.layoutSubviews()//严重的bug是否创建过if pointList.isEmpty { return }//如果有节点就移除for subview in self.subviews {if subview is UISlider {for sliderSubView in subview.subviews {if sliderSubView is UIButton {sliderSubView.removeFromSuperview()}}}}//布局节点for i in 0..pointList.count {let button UIButton()slider.addSubview(button)button.tag ibutton.setImage(UIImage(named: point_none), for: .normal)button.addTarget(self, action: #selector(pointNoneClick), for: .touchUpInside)button.snp.makeConstraints { make inmake.width.equalTo(16)make.height.equalTo(20)make.centerY.equalToSuperview().offset(1)make.left.equalToSuperview().offset(Float(progress.bounds.size.width)*pointList[i]-16*0.5)}}}// MARK: - slider -- 点击滚动条objc private func sliderTapped(gestureRecognizer: UIGestureRecognizer) {let pointTapped: CGPoint gestureRecognizer.location(in: self)let positionOfSlider: CGPoint slider.frame.originlet widthOfSlider: CGFloat slider.frame.size.widthlet point ((pointTapped.x - positionOfSlider.x) * CGFloat(slider.maximumValue) / widthOfSlider)//UI--修改进度条的值slider.setValue(Float(point), animated: false)//换算x的值let newX (self.frame.width - draggableButton.frame.width) * CGFloat(point)//修改自定义point按键的framedraggableButton.frame CGRect(x: newX, y: draggableButton.frame.origin.y, width: draggableButton.frame.width, height: draggableButton.frame.height)//闭包出去修改AVPlayer的值 0 -- 100changePointBlock?(Float(point))}// MARK: - 按键 -- 节点按键objc private func pointNoneClick(button:UIButton) {//换算x的值let newX (self.frame.width - draggableButton.frame.width) * CGFloat(pointList[button.tag])//修改自定义point按键的framedraggableButton.frame CGRect(x: newX, y: draggableButton.frame.origin.y, width: draggableButton.frame.width, height: draggableButton.frame.height)//UI--修改进度条的值slider.setValue(Float(pointList[button.tag]), animated: false)//闭包出去修改AVPlayer的值 0 -- 100changePointBlock?(pointList[button.tag])}// MARK: - 自定义按键 -- 拖拽objc func handlePanGesture(_ gesture: UIPanGestureRecognizer) {let translation gesture.translation(in: self)//translation.x 拖拽的值var newX draggableButton.frame.origin.x translation.xswitch gesture.state {case .changed://更新按钮的 x 坐标限制在 view 的范围内newX max(0, min(newX, self.frame.width - draggableButton.frame.width))//意思是:newX取值范围0 ~ self.frame.width - draggableButton.frame.width 之间//修改自定义point按键的framedraggableButton.frame CGRect(x: newX, y: draggableButton.frame.origin.y, width: draggableButton.frame.width, height: draggableButton.frame.height)gesture.setTranslation(.zero, in: self)//修改进度//换算成进度0.0-1.0let progress newX / (self.frame.width - draggableButton.frame.width)//UI--修改进度条的值slider.setValue(Float(progress), animated: false)//闭包出去修改AVPlayer的值 0 -- 100changePointBlock?(Float(progress))default:break}}} 使用 创建返回值出来 约束 赋值给它
http://www.w-s-a.com/news/423367/

相关文章:

  • 做网站是用ps还是ai服饰东莞网站建设
  • 只做一页的网站多少钱网站开发就业趋势
  • 陈村网站建设有哪些网站可以做店面设计
  • 查询网站注册信息wordpress 照片墙
  • 成都网站设计服务商室内设计设计师网站推荐
  • 企业建站系统cms百度网址ip
  • wordpress 代码编辑插件下载搜索引擎优化seo课程总结
  • 韩都衣舍网站建设的改进邯郸公众号小程序制作
  • 上海设计网站建设在线视频制作
  • 东营高端网站建设新建网站如何让百度收录
  • wordpress怎么生成网站地图微网站平台怎样做网站
  • 同安区建设局网站招投标公众号简介有趣的文案
  • 江苏州 网站制作网上宣传方法有哪些
  • 做网站时怎样申请域名郑州制作网站公司
  • 深圳 网站开发公司电话网站关键词快排名
  • 网站建设的工作总结seo同行网站
  • 网站需要兼容哪些浏览器sql数据库做的网站怎么发布
  • 营销型网站的建站步骤是什么意思广州门户网站建设公司
  • 汕尾好网站建设推广计算机软件包含网站开发
  • 建设工程施工许可证在哪个网站办wordpress更换主题白屏
  • 微交易网站建设wordpress摘要调用
  • 做网站维护需要懂什么网站后台后缀名
  • 网站建设的认可桂平市住房和城乡建设局网站
  • 网站设计师岗位职责域名关键词查询
  • 百度怎样建设网站盐城公司网站建设
  • 站长工具国产2023网站制作 商务
  • 网络新闻专题做的最好的网站杭州网站设计建设公司
  • 电商网站界面设计流程ps培训班一般学费多少钱
  • 西安网站运营上海闵行区网站制作公司
  • 宁波网站推广代运营长链接转化成短链接工具