UIKit Dynamic主題學(xué)習(xí)筆記

UIKit Dynamic主題學(xué)習(xí)筆記

image.png

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)
}

效果圖「苫ā:

Gravity.gif

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")
    }   
}

效果圖:

Collision.gif

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!
    }
}

效果圖

Attachement.gif

4魄眉、彈簧效果

第三個(gè)實(shí)例的代碼基礎(chǔ)上:

//設(shè)置彈簧效果相關(guān)屬性
//頻率
attachment.frequency = 1
//阻尼
attachment.damping = 0.1
attachment.length = 100       

效果圖

Spring.gif

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!
    }
}

效果圖:

Snap.gif

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")
    }
 
}

效果圖:

push.gif

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;
 */

效果圖:

![UIview.gif](https://upload-images.jianshu.io/upload_images/2045565-0476df6775895577.gif?imageMogr2/auto-orient/strip)

附加:

@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){
         
    }];
}

效果圖:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钝吮,隨后出現(xiàn)的幾起案子埋涧,更是在濱河造成了極大的恐慌贴唇,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飞袋,死亡現(xiàn)場離奇詭異戳气,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巧鸭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門瓶您,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纲仍,你說我怎么就攤上這事呀袱。” “怎么了郑叠?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵夜赵,是天一觀的道長。 經(jīng)常有香客問我乡革,道長寇僧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任沸版,我火速辦了婚禮嘁傀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘视粮。我一直安慰自己细办,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布蕾殴。 她就那樣靜靜地躺著笑撞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钓觉。 梳的紋絲不亂的頭發(fā)上茴肥,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音议谷,去河邊找鬼炉爆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卧晓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赴捞,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逼裆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赦政?” 一聲冷哼從身側(cè)響起胜宇,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤耀怜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后桐愉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體财破,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年从诲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了左痢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡系洛,死狀恐怖俊性,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情描扯,我是刑警寧澤定页,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站绽诚,受9級(jí)特大地震影響典徊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恩够,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一宫峦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玫鸟,春花似錦导绷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钦购,卻和暖如春檐盟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背押桃。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工葵萎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唱凯。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓羡忘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親磕昼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卷雕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn) Spring****基于 Annotation 的簡單介紹 2011年03月29日 15:07:00 閱讀數(shù):...
    fd649cf896c0閱讀 345評(píng)論 1 0
  • 當(dāng)我還是個(gè)孩子時(shí)漫雕,大人們總是跟我說滨嘱,你要上進(jìn)要努力,要考第一浸间,要考好學(xué)校太雨。我記得考高中的時(shí)候,壓力很大魁蒜,大到得了腸...
    你的喜歡很重要閱讀 562評(píng)論 0 0
  • 想起那天遇見開滴滴的葉師傅囊扳,在閑聊中知道了他是葉景呂的后人(葉景呂是誰?百度………) 他父親...
    林楓閱讀 218評(píng)論 0 0
  • 最好的閨蜜老賈梅惯,明日即將成為臺(tái)上最矚目的好運(yùn)新娘宪拥,這是我們認(rèn)識(shí)的第15個(gè)年頭。 初識(shí)閨蜜老賈是在初一铣减,名中都帶娜字...
    李妞兒閱讀 284評(píng)論 0 0
  • 翠蓮和春萊她君、寶萊、勝男幾人回家時(shí)葫哗,早已尋不到喜萊的蹤影缔刹。也許此時(shí)的喜萊正靜靜地坐在某節(jié)車廂,或者游蕩在某個(gè)陌生的城...
    影子影閱讀 780評(píng)論 24 23