UIKit Dynamic主題學(xué)習(xí)筆記
1伤疙、重力效果:UIGravityBehavior
@IBOutlet weak var frogImage: UIImageView!
//創(chuàng)建一個(gè)關(guān)聯(lián)到view的動(dòng)畫(必須為全局變量)
lazy var animator = UIDynamicAnimator(referenceView: self.view)
override func viewDidLoad() {
super.viewDidLoad()
//創(chuàng)建一個(gè)重力感應(yīng)的動(dòng)作
let behavior_gravity = UIGravityBehavior(items: [frogImage])
//設(shè)置重力感應(yīng)限量临梗,參數(shù)為分別向x軸和y軸的偏移量
behavior_gravity.gravityDirection = CGVector(dx: 0.0, dy: 0.05)
//為動(dòng)畫添加動(dòng)畫動(dòng)作蔽介。
animator.addBehavior(behavior_gravity)
}
效果圖「苫ā:
2绪氛、碰撞:UICollisionBehavior
@IBOutlet weak var frogImage: UIImageView!
@IBOutlet weak var frogImag1: UIImageView!
//創(chuàng)建一個(gè)關(guān)聯(lián)到view的動(dòng)畫(必須為全局變量)
lazy var animator = UIDynamicAnimator(referenceView: self.view)
override func viewDidLoad() {
super.viewDidLoad()
//創(chuàng)建一個(gè)重力感應(yīng)的動(dòng)作
let behavior_gravity = UIGravityBehavior(items: [frogImage,frogImag1])
//設(shè)置重力感應(yīng)限量,參數(shù)為分別向x軸和y軸的偏移量
behavior_gravity.gravityDirection = CGVector(dx: 0.0, dy: 0.5)
//為動(dòng)畫添加動(dòng)畫動(dòng)作。
animator.addBehavior(behavior_gravity)
//創(chuàng)建碰撞動(dòng)作
let collision = UICollisionBehavior(items: [frogImage,frogImag1])
//碰撞模式 .items(導(dǎo)致物體相互碰撞)
//.boundaries(導(dǎo)致物體不相互碰撞)
//.everything(導(dǎo)致物體既相互碰撞又與便捷相互碰撞)
collision.collisionMode = .everything
//設(shè)置具有碰撞邊界bool屬性
collision.translatesReferenceBoundsIntoBoundary = true
collision.collisionDelegate = self
animator.addBehavior(collision)
}
extension ViewController:UICollisionBehaviorDelegate{
func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item1: UIDynamicItem, with item2: UIDynamicItem, at p: CGPoint) {
print("beganContactFor")
}
func collisionBehavior(_ behavior: UICollisionBehavior, endedContactFor item1: UIDynamicItem, with item2: UIDynamicItem) {
print("endedContactFor")
}
}
效果圖:
3脑慧、依附:UIAttachmentBehavior
@IBOutlet weak var frogImage: UIImageView!{
didSet{
frogImage.isUserInteractionEnabled = true
}
}
@IBOutlet weak var frogImag1: UIImageView!
//創(chuàng)建一個(gè)關(guān)聯(lián)到view的動(dòng)畫(必須為全局變量)
lazy var animator = UIDynamicAnimator(referenceView: self.view)
var attachment:UIAttachmentBehavior!
override func viewDidLoad() {
super.viewDidLoad()
//記錄初始錨點(diǎn)
let frogCenter = CGPoint(x: frogImage.center.x, y: frogImage.center.y)
//創(chuàng)建依附動(dòng)作
attachment = UIAttachmentBehavior(item: frogImag1, attachedToAnchor: frogCenter)
animator.addBehavior(attachment)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let t = touches.first
let v = t?.view
if v == frogImage {
let p = t?.location(in: self.view)
frogImage.center = p!
attachment.anchorPoint = p!
}
}
效果圖
4魄眉、彈簧效果
第三個(gè)實(shí)例的代碼基礎(chǔ)上:
//設(shè)置彈簧效果相關(guān)屬性
//頻率
attachment.frequency = 1
//阻尼
attachment.damping = 0.1
attachment.length = 100
效果圖
5.捕捉效果:UISnapBehavior
@IBOutlet weak var frogImage: UIImageView!{
didSet{
frogImage.isUserInteractionEnabled = true
}
}
@IBOutlet weak var frogImag1: UIImageView!
@IBOutlet weak var pointBtn: UIButton!
//創(chuàng)建一個(gè)關(guān)聯(lián)到view的動(dòng)畫(必須為全局變量)
lazy var animator = UIDynamicAnimator(referenceView: self.view)
var attachment:UIAttachmentBehavior!
var snap:UISnapBehavior!
var snap_Point:CGPoint!
override func viewDidLoad() {
super.viewDidLoad()
//default 0.5這個(gè)值越大,震動(dòng)的幅度越小 是從0.0~1.0當(dāng)時(shí)當(dāng)它為負(fù)數(shù)時(shí) 也震動(dòng)闷袒,可以試試
//snap.damping = 0.75;
//snap_Point = pointBtn.center
snap = UISnapBehavior(item: frogImage, snapTo: pointBtn.center)
}
@IBAction func clickAction(_ sender: UIButton) {
self.animator.removeAllBehaviors();
snap.snapPoint = sender.center
animator.addBehavior(snap)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let t = touches.first
let v = t?.view
if v == frogImage {
let p = t?.location(in: self.view)
frogImage.center = p!
self.animator.removeAllBehaviors();
snap.snapPoint = p!
}
}
效果圖:
6坑律、推力:UIPushBehavior
class ViewController: UIViewController {
@IBOutlet weak var frogImage: UIImageView!{
didSet{
frogImage.isUserInteractionEnabled = true
}
}
@IBOutlet weak var frogImag1: UIImageView!
@IBOutlet weak var pointBtn: UIButton!
//創(chuàng)建一個(gè)關(guān)聯(lián)到view的動(dòng)畫(必須為全局變量)
lazy var animator = UIDynamicAnimator(referenceView: self.view)
var push:UIPushBehavior!
override func viewDidLoad() {
super.viewDidLoad()
// 創(chuàng)建碰撞動(dòng)作
let collision = UICollisionBehavior(items: [frogImag1])
// 碰撞模式 .items(導(dǎo)致物體相互碰撞)
// .boundaries(導(dǎo)致物體不相互碰撞)
// .everything(導(dǎo)致物體既相互碰撞又與便捷相互碰撞)
collision.collisionMode = .everything
// 設(shè)置具有碰撞邊界bool屬性
collision.translatesReferenceBoundsIntoBoundary = true
collision.collisionDelegate = self
animator.addBehavior(collision)
collision.collisionMode = .boundaries
push = UIPushBehavior(items: [frogImag1], mode: .instantaneous)
//推力矢量的方向
push.pushDirection = CGVector(dx: 0.5, dy: 0.5)
//推力角度
push.angle = 0.0
//推力矢量的大小,默認(rèn)值為nil,沒有任何力量囊骤。當(dāng)設(shè)置一個(gè)負(fù)值晃择,力的方向改變。
push.magnitude = 0.0
//推動(dòng)行為是否處于活躍狀態(tài)
//在添加一個(gè)push behavior到animator時(shí)也物,使用這個(gè)屬性來激活或禁用推力作用宫屠,而不是通過重新添加behavior來實(shí)現(xiàn)。
push.active = true;
animator.addBehavior(push)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let t = touches.first
let v = t?.view
if v == frogImage {
let p = t?.location(in: self.view)
frogImage.center = p!
let origin = CGPoint(x: (self.view.bounds.midX), y: (self.view.bounds.midY))
var distance = sqrt(powf(Float((p?.x)!-origin.x), 2.0)) + powf(Float((p?.y)!-origin.y), 2.0)
let angle = atan2(Double((p?.y)!-origin.y), Double((p?.x)!-origin.x))
distance = min(distance, 100.0)
push.magnitude = CGFloat(-distance/100.0)
push.angle = CGFloat(angle)
push.active = true
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
extension ViewController:UICollisionBehaviorDelegate{
func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item1: UIDynamicItem, with item2: UIDynamicItem, at p: CGPoint) {
print("beganContactFor")
}
func collisionBehavior(_ behavior: UICollisionBehavior, endedContactFor item1: UIDynamicItem, with item2: UIDynamicItem) {
print("endedContactFor")
}
}
效果圖:
7滑蚯、UIDynamicItemBehavior
//創(chuàng)建一個(gè)重力感應(yīng)的動(dòng)作
let behavior_gravity = UIGravityBehavior(items: [frogImag1])
//設(shè)置重力感應(yīng)限量浪蹂,參數(shù)為分別向x軸和y軸的偏移量
behavior_gravity.gravityDirection = CGVector(dx: 0.0, dy: 0.5)
//為動(dòng)畫添加動(dòng)畫動(dòng)作。
animator.addBehavior(behavior_gravity)
let dynamicItem = UIDynamicItemBehavior(items: [frogImag1])
//彈性系數(shù):用于碰撞行為的動(dòng)態(tài)元素的彈性量告材。默認(rèn)值為0.0坤次,有效范圍從0.0(沒有碰撞)到1.0(完全碰撞)。
dynamicItem.elasticity = 1.0
dynamicItem.allowsRotation = false
//相對(duì)質(zhì)量密度:用于動(dòng)態(tài)元素相對(duì)密度斥赋。其連同動(dòng)態(tài)元素大小缰猴,決定動(dòng)態(tài)元素的有效質(zhì)量。其參與的動(dòng)力學(xué)行為包括摩擦灿渴、碰撞洛波、推動(dòng)等...默認(rèn)為:1.0
/*
假設(shè)你有兩個(gè)具有相同密度但大小不同的動(dòng)態(tài)元素:元素一尺寸為100x100像素點(diǎn)胰舆,元素二尺寸為100x200像素點(diǎn)骚露。
這個(gè)例子中,元素二的有效質(zhì)量是元素一的兩倍缚窿。
在一個(gè)彈性碰撞中棘幸,這些元素根據(jù)它們的相對(duì)質(zhì)量表現(xiàn)出自然的動(dòng)量守恒。元素一密度為1.0倦零,當(dāng)施加一個(gè)力(通過推動(dòng)行為)1.0級(jí)時(shí)误续,加速度為100點(diǎn)/s2。
*/
dynamicItem.density = 3.0
//摩擦系數(shù):用于兩個(gè)發(fā)生摩擦的動(dòng)態(tài)元素扫茅。默認(rèn)值0.0(沒有摩擦)蹋嵌,當(dāng)值為1.0時(shí),強(qiáng)烈摩擦葫隙。如果設(shè)置更高的摩擦栽烂,可以使用更高的數(shù)值。
dynamicItem.friction = 0.5
//線速度阻尼:用于動(dòng)態(tài)元素所受線速度阻尼大小。默認(rèn)值是0.0腺办。有效范圍從0.0(沒有速度阻尼)到CGFLOAT_MAX(最大速度阻尼)焰手。當(dāng)設(shè)置為1.0,動(dòng)態(tài)元素會(huì)立馬停止就像沒有力量作用于它一樣怀喉。
dynamicItem.resistance = 0.5
//角速度阻尼:用于動(dòng)態(tài)元素所受角速度阻尼大小书妻。有效范圍從0.0到CGFLOAT_MAX,值越大躬拢,角速度阻尼越大躲履,旋轉(zhuǎn)減速越快,到停止聊闯。
dynamicItem.angularResistance = 0.0
//電荷:好吧崇呵,物理太差,不懂馅袁,請高手指教域慷,只能官翻了。電荷數(shù)確定動(dòng)態(tài)元素與電場和磁場相互作用的程度汗销。這個(gè)屬性值沒有單位犹褒,電磁場強(qiáng)度由你調(diào)控的適當(dāng)?shù)闹祦頉Q定。默認(rèn)值0.0弛针。
//@available(iOS 9.0, *)
dynamicItem.charge = 0.0
//是否固定:用于指定動(dòng)態(tài)元素是否固定在當(dāng)前位置叠骑。當(dāng)一個(gè)動(dòng)態(tài)元素被設(shè)置為固定后,該元素參與碰撞削茁,但不受碰撞影響宙枷,仿佛成為一個(gè)碰撞邊界。默認(rèn)值為NO茧跋。
//@available(iOS 9.0, *)
dynamicItem.isAnchored = false
animator.addBehavior(dynamicItem);
/*
添加一個(gè)動(dòng)態(tài)元素慰丛,并設(shè)置它的角速度 默認(rèn)值為0.0,單位弧度/秒瘾杭。設(shè)置一個(gè)負(fù)值诅病,減少一定角速度。
-(void)addAngularVelocity:(CGFloat)velocity forItem:(id<UIDynamicItem>)item;
添加一個(gè)動(dòng)態(tài)元素粥烁,并設(shè)置它的線速度, 默認(rèn)值為0.0贤笆,單位點(diǎn)/秒。設(shè)置一個(gè)負(fù)值讨阻,減少一定線速度芥永。
-(void)addLinearVelocity:(CGPoint)velocity forItem:(id<UIDynamicItem>)item;
獲得動(dòng)態(tài)元素的角速度
-(CGFloat)angularVelocityForItem:(id<UIDynamicItem>)item;
獲得動(dòng)態(tài)元素的線速度
-(CGPoint)linearVelocityForItem:(id<UIDynamicItem>)item;
*/
效果圖:
附加:
@property (weak, nonatomic) IBOutlet UITextView *noteView;
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
__block NSString *nextText = @"撒胡椒粉等擴(kuò)大社會(huì)科技活動(dòng)空間撒謊很快就到沙發(fā)和科技大會(huì)上";
[UIView transitionWithView:self.noteView duration:0.6 options:UIViewAnimationOptionTransitionCurlUp animations:^{
self.noteView.text = nextText;
} completion:^(BOOL finished){
}];
}