用户的数据如何保证是有效的?我就慢慢看着说说话.只说方式不说原理有兴趣的请自行查阅
互联网中有许多保护措施传统的方式有cookie session 基本上用于网页端,因为算是比较透明.网页上不太安全随着各种加密算法被大家广泛了解.网页上是变得越来越不安全了,或者说可以达到一定的安全但是在某些需求上或许在安全上在网页上会下更大的成本,目前很多行业在验证上采用的是token这种方式在好一点的是手机验证加客户端扫码验证,来验证更合法的用户.
但是今天不是说传统的验证模式的,在简书中发现简书的验证和火车票验证的图片验证方式貌似很有趣,而且那些图片不经意中可以给人打广告深入人心.那就是极验验证,百度查了下我就不秀了.
如何在iOS 上实现类似效果的验证呢??
要快速实现可以采用第三方服务搜索极验验证即可.
算是个挑战自己实现这一套吧!
实现的效果类似简书的效果
![](https://img.haomeiwen.com/i2878206/5c625c9ef4e3eb20.png)
![](https://img.haomeiwen.com/i2878206/f2ad560606e31d47.gif)
思路什么的无非控制的视图panview 实现 begin move end 时进行控制视图,然后是裁剪的图的位置或者不需要裁剪放在想要的地方进行拖拽验证,时间记录也在begin中记录开始时间,end中记录结束时间即可这部分有需要的自行实现吧
//
// ManualView.swift
// SlideAuthorizon
//
// Created by lotawei on 2018/1/30.
// Copyright © 2018年 lotawei. All rights reserved.
//
import Foundation
import UIKit
//目前支持两种 从左滑到右的 点击的
enum ManualType:Int{
case leftrightslide=0,clickmusic
}
protocol PanViewDelegate {
func poschange(_ pos:CGPoint)
//每次end产生一个结果
func isendchange( ispass:Bool)
}
//一个元组 右边界 每个item的大小
var targetpos:(CGFloat,CGFloat) = (0,50)
extension CGPoint {
static func checkinValue(_ prevalue:Int,px1:CGFloat,px2:CGFloat) -> Bool{
let hasx = abs(Int32( px1 - px2))
if hasx < Int32(prevalue){
return true
}
return false
}
}
class PanView:UIView{
var delegate:PanViewDelegate?
private var originalcentx:CGFloat = 0
//目标矩形框
private var tartrec:CGRect = CGRect.zero
//当前移动的矩形框
private var currect:CGRect = CGRect.zero
var begindata:Date!
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//改变x
originalcentx = self.center.x
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos = touches.first?.location(in: self.superview)
let asuperview = self.superview!
let maxx = asuperview.frame.size.width
if (pos?.x)! <= maxx - self.frame.size.width{
self.frame.origin.x = (pos?.x)!
}
else{
self.frame.origin.x = maxx - self.frame.size.width
}
//记录当前的矩形框
currect = CGRect.init(x: self.frame.origin.x, y: 0, width: self.frame.size.width, height: self.frame.size.height)
if delegate != nil {
self.delegate?.poschange(pos!)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
let pos = touches.first?.location(in: self.superview)
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 3, initialSpringVelocity: 1, options: .curveLinear, animations: {() -> Void in
self.center.x = self.originalcentx
})
let ispass = CGPoint.checkinValue(2, px1: pos!.x, px2: targetpos.0)
if delegate != nil {
self.delegate?.isendchange(ispass: ispass)
}
}
override func awakeFromNib() {
clipsToBounds = true
layer.cornerRadius = 15
backgroundColor = #colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1)
}
func setdelegate(_ delegate:PanViewDelegate){
self.delegate = delegate
}
}
class ManualView:UIView,PanViewDelegate{
private var originalx:CGFloat = 10
private var originaly:CGFloat = 0
@IBOutlet weak var panview: PanView!
@IBOutlet weak var codeimg: UIImageView!
//需要移动的滑块
lazy var movesizeview:UIImageView = {
let aview = UIImageView(frame: CGRect.init(x: 0, y: 0, width: 50, height: 50))
return aview
}()
lazy var fadeview:UIView = {
let aview = UIView(frame: CGRect.init(x: 0, y: 0, width: 50, height: 50))
aview.alpha = 0.5
aview.backgroundColor = UIColor.white
return aview
}()
static let shareview:ManualView = {
let aview = Bundle.main.loadNibNamed("ManualView", owner: nil, options: nil)?.first as! ManualView
return aview
}()
@IBOutlet weak var slideview:UIView!
override init(frame: CGRect) {
super.init(frame: frame)
}
func setimageview(_ codeimg:UIImage,_ targetsize:CGSize){
movesizeview.frame.size = targetsize
let disimage = UIImage.convertView(toImage: self.codeimg)
let atrrec = CGRect.init(x: self.codeimg.frame.size.width - 80, y: self.codeimg.center.y - targetsize.height/2.0 , width: targetsize.width, height: targetsize.height)
movesizeview.image = UIImage.clipfacnewimage(disimage, atrrec)
//带阴影的区域
fadeview.frame = atrrec
movesizeview.frame.origin = CGPoint.init(x: originalx, y: atrrec.minY)
self.panview.delegate = self
//更改全局的位置信息
targetpos.0 = self.codeimg.frame.size.width - 80
targetpos.1 = targetsize.width
}
override func draw(_ rect: CGRect) {
debugPrint("draw")
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
super.awakeFromNib()
debugPrint("awakeFromNib")
slideview.clipsToBounds = true
slideview.layer.cornerRadius = 15
self.codeimg.addSubview(movesizeview)
self.codeimg.addSubview(fadeview)
}
/// 获取到的坐标改变
///
/// - Parameter pos: 移动到的坐标
func poschange(_ pos: CGPoint) {
self.movesizeview.frame.origin.x = pos.x
}
func isendchange(ispass: Bool) {
if ispass {
//fadeview的动画
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 3, initialSpringVelocity: 1, options: .curveLinear, animations: {() -> Void in
self.movesizeview.frame.origin.x = self.originalx
self.movesizeview.transform = CGAffineTransform.init(scaleX: 1.5, y: 1.5)
self.movesizeview.transform = CGAffineTransform.identity
self.fadeview.transform = CGAffineTransform.init(scaleX: 2, y: 1)
self.fadeview.transform = CGAffineTransform.init(scaleX: 0.5, y: 1)
self.fadeview.transform = CGAffineTransform.init(scaleX: 1, y: 1)
})
}else{
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 3, initialSpringVelocity: 1, options: .curveLinear, animations: {() -> Void in
self.movesizeview.frame.origin.x = self.originalx
self.fadeview.transform = CGAffineTransform.init(scaleX: 2, y: 1)
self.fadeview.transform = CGAffineTransform.init(scaleX: 0.5, y: 1)
self.fadeview.transform = CGAffineTransform.init(scaleX: 1, y: 1)
})
}
}
}
extension UIImage {
static func clipfacnewimage(_ orimg:UIImage,_ rec:CGRect) -> UIImage {
let ref = orimg.cgImage!.cropping(to: rec)
let scal = UIImage.init(cgImage: ref!)
return scal
}
static func convertView(toImage v: UIView) -> UIImage {
let s: CGSize = v.bounds.size
// 下面方法,第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了
UIGraphicsBeginImageContextWithOptions(s, true, UIScreen.main.scale)
v.layer.render(in: UIGraphicsGetCurrentContext()!)
let image: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image ?? UIImage()
}
}
//使用方式
lazy var aview:ManualView = {
return ManualView.shareview
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(self.aview)
aview.frame = CGRect.init(x:0, y: 100, width: 300, height: 300)
aview.setimageview(#imageLiteral(resourceName: "codeimg"), CGSize.init(width: 60, height: 60))
aview.center = view.center
// Do any additional setup after loading the view, typically from a nib.
}
网友评论