文章目录
Xcode部分
Storyboard基础控件:
视图控制器在SB种称为场景
控件:
1.Label:可包含任意数量的文本,UILabel可收缩,换行以及截断文本。
2.Button:按钮。
3.Segmentel Control:可表示单个或多个选择或命令列表,可显示文本或图像,但无法同时显示两者。
4.Text Field:用户可编辑的文本框。
5.Slider:可滑动的水平条。
6.Switch:显示给定的Bool状态,点击控件可以切换状态。
7.Activity Indicator View:转菊花。
8.Progress View:进度条。
基础交互手势:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tapLabel: UILabel!
@IBOutlet weak var pinchLabel: UILabel!
@IBOutlet weak var rotationLabel: UILabel!
@IBOutlet weak var swipeLabel: UILabel!
@IBOutlet weak var panLabel: UILabel!
@IBOutlet weak var screenEdgePanLabel: UILabel!
@IBOutlet weak var longPressLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
//tapLabel.isUserInteractionEnabled = true //动态打开允许用户交互属性
//轻触手势
let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(tap:)))
//tap.numberOfTapsRequired = 1 //指定-需要轻点几下才会触发监听函数(handleTap)
//tap.numberOfTouchesRequired = 1 //指定-需要用几个手指轻点才会触发监听函数(handleTap)
tapLabel.addGestureRecognizer(tap)
//可以给这个手势添加更多的事件监听函数,也就是说用户轻点之后会发生好几件事情。所有手势通用。
//tap.addTarget(self, action: #selector(handleTap2(sender:)))
//捏合手势-缩小和放大用-缩放
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(pinch:)))
pinchLabel.addGestureRecognizer(pinch)
//旋转手势
let rotation = UIRotationGestureRecognizer(target: self, action: #selector(handleRotation(rotation:)))
rotationLabel.addGestureRecognizer(rotation)
//轻扫手势
let swipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(swipe:)))
//swipe.direction = .right //指定轻扫方向
//swipe.numberOfTouchesRequired = 1 //指定需要几个手指轻扫
swipeLabel.addGestureRecognizer(swipe)
//平移拖拽手势--开发中用的比较多
let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePan(pan:)))
//pan.maximumNumberOfTouches 指定最多几个手指-默认是无限多-一般不设定
//pan.minimumNumberOfTouches = 1 //指定至少需要几个手指才能拖拽
panLabel.addGestureRecognizer(pan)
//屏幕边缘平移手势--属于Pan手势的一种
let screenEdgePan = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handleScreenEdgePan(screenEgdePan:)))
//指定从屏幕的哪边可以滑。不受屏幕转向影响,比如规定左边,横屏时还是从左边滑
screenEdgePan.edges = .left
//screenEdgePanLabel没有靠到边缘,所以不能给他加,这里给rootview加
view.addGestureRecognizer(screenEdgePan)
//长按手势
let longPress = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(longPress:)))
//longPress.numberOfTapsRequired = 0 //指定长按前需要轻点的次数
//longPress.numberOfTouchesRequired = 1
//longPress.minimumPressDuration = 0.5 //最小长按时间
//longPress.allowableMovement = 10.0 //长按时允许移动的最大距离-容错范围,单位:点
longPressLabel.addGestureRecognizer(longPress)
}
//离散型(一次性)手势
@IBAction func handleIBTap(IBTap: UITapGestureRecognizer){
guard let IBTapLabel = IBTap.view as? UILabel else{
return}
//就算是离散手势,也要在做操作之前check一下state
if IBTap.state == .ended{
IBTapLabel.text = "被翻牌了"
}
}
//离散型(一次性)手势
@objc func handleTap(tap: UITapGestureRecognizer){
if tap.state == .ended{
tapLabel.text = "被翻牌了"
}
}
//持续型手势-持续调用这个函数
@objc func handlePinch(pinch: UIPinchGestureRecognizer){
if pinch.state == .began || pinch.state == .changed{
pinchLabel.transform = pinchLabel.transform.scaledBy(x: pinch.scale, y: pinch.scale)
//pinch.scale表示总缩放比,transform里已包含上一帧的缩放比了,不能重复相乘,所以把他归为初始值1
pinch.scale = 1.0
//print(pinch.velocity) //缩放速度(放大为正,缩小为负) 单位:缩放比/秒
}
}
//持续型手势-持续调用这个函数
@objc func handleRotation(rotation: UIRotationGestureRecognizer){
if rotation.state == .began || rotation.state == .changed{
rotationLabel.transform = rotationLabel.transform.rotated(by: rotation.rotation)
//同scale
rotation.rotation = 0.0
//rotation.velocity //旋转速度(顺时针为正,逆时针为负) 单位:弧度/秒
}
}
//离散型(一次性)手势
@objc func handleSwipe(swipe: UISwipeGestureRecognizer){
if swipe.state == .ended{
swipeLabel.text = "被翻牌了"
}
}
//持续型手势-持续调用这个函数
var startCenter = CGPoint.zero
@objc func handlePan(pan: UIPanGestureRecognizer){
//手指在panLabel的父视图中平移的x和y(含上下左右各多少四个信息)
let translation = pan.translation(in: panLabel.superview)
//pan.setTranslation(<#T##translation: CGPoint##CGPoint#>, in: <#T##UIView?#>)//设置手指在某个view中的偏移量
//pan.velocity(in: <#T##UIView?#>)//平移速度 单位:point/秒(CGPoint,有x和y)
if pan.state == .began{
startCenter = panLabel.center//开始时先把当前panlabel的center保存在startcenter中
}
//.began, .changed, .ended 状态时更新panlabel的位置(改center)
if pan.state != .cancelled{
panLabel.center = CGPoint(x: startCenter.x + translation.x, y: startCenter.y + translation.y)
}else{
//.cancelled 时恢复到原位置-被系统事件中断-比如来电话
panLabel.center = startCenter
}
}
//持续型手势-持续调用这个函数
@objc func handleScreenEdgePan(screenEgdePan: UIScreenEdgePanGestureRecognizer){
let x =