5.5 iOS 碰撞行為UICollisionBehavior

1.5碰撞行為UICollisionBehavior

(一)碰撞行為UICollisionBehavior作用

作用:可以讓物體之間實(shí)現(xiàn)碰撞效果,可以通過(guò)添加邊界(boundary)將碰撞行為限定到某個(gè)區(qū)域.

(二)常用屬性和方法

常用屬性

@property (nonatomic, readonly, copy) NSArray<id <UIDynamicItem>> *items;
// 碰撞模式(有三種:元素碰撞,邊界碰撞,全體碰撞)
// UICollisionBehaviorModeItems(元素碰撞),
// UICollisionBehaviorModeBoundaries(邊界碰撞),
// UICollisionBehaviorModeEverything(全體碰撞).
@property (nonatomic, readwrite) UICollisionBehaviorMode collisionMode;
// 是否已參照視圖的bounds為邊界
@property (nonatomic, readwrite) BOOL translatesReferenceBoundsIntoBoundary;
// 所有的碰撞邊界
@property (nullable, nonatomic, readonly, copy) NSArray<id <NSCopying>> *boundaryIdentifiers;
// 代理對(duì)象,可以監(jiān)聽(tīng)碰撞的過(guò)程
@property (nullable, nonatomic, weak, readwrite) id <UICollisionBehaviorDelegate> collisionDelegate;

常用方法


// 初始化一個(gè)碰撞行為,items:代表碰撞行為作用的所有仿真元素
- (instancetype)initWithItems:(NSArray<id <UIDynamicItem>> *)items;
// 添加一個(gè)仿真元素到碰撞行為
- (void)addItem:(id <UIDynamicItem>)item;
// 移除碰撞行為上的一個(gè)仿真元素
- (void)removeItem:(id <UIDynamicItem>)item;
// 設(shè)置碰撞行為參照視圖的邊界,并且設(shè)置內(nèi)邊距
- (void)setTranslatesReferenceBoundsIntoBoundaryWithInsets:(UIEdgeInsets)insets;
// 添加一個(gè)路徑作為碰撞行為的邊界 identifier:邊界ID bezierPath:使用UIBezierPath描述的一個(gè)邊界
- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier forPath:(UIBezierPath *)bezierPath;
// 添加一個(gè)從p1到p2的邊界 identifier:邊界ID
- (void)addBoundaryWithIdentifier:(id <NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2;
// 根據(jù)指定ID返回一個(gè)使用UIBezierPath描述的路徑
- (nullable UIBezierPath *)boundaryWithIdentifier:(id <NSCopying>)identifier;
// 移除碰撞行為上指定ID為identifier的邊界
- (void)removeBoundaryWithIdentifier:(id <NSCopying>)identifier;
// 移除碰撞行為上的所有邊界
- (void)removeAllBoundaries;

(三)UICollisionBehaviorDelegate

// 仿真元素和仿真元素碰撞開(kāi)始 item1:仿真元素1 item2:仿真元素2 p:碰撞點(diǎn)
- (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2 atPoint:(CGPoint)p;
// 仿真元素和仿真元素碰撞結(jié)束 item1:仿真元素1 item2:仿真元素2
- (void)collisionBehavior:(UICollisionBehavior *)behavior endedContactForItem:(id <UIDynamicItem>)item1 withItem:(id <UIDynamicItem>)item2;
// 仿真元素和邊界碰撞開(kāi)始 item:仿真元素 identifier:邊界ID p:碰撞點(diǎn)
- (void)collisionBehavior:(UICollisionBehavior*)behavior beganContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(nullable id <NSCopying>)identifier atPoint:(CGPoint)p;
// 仿真元素和邊界碰撞結(jié)束  item:仿真元素 identifier:邊界ID
- (void)collisionBehavior:(UICollisionBehavior*)behavior endedContactForItem:(id <UIDynamicItem>)item withBoundaryIdentifier:(nullable id <NSCopying>)identifier;

示例代碼:


// 控制器View
@interface RBView : UIView
@property (nonatomic, assign) CGRect rectR;

@end

@implementation RBView

- (void)drawRect:(CGRect)rect{
    UIBezierPath *path = [[UIBezierPath alloc] init];
    [path moveToPoint:CGPointMake(0, 300)];
    [path addLineToPoint:CGPointMake(200, 350)];
    [path stroke];
    [[UIBezierPath bezierPathWithRect:self.rectR] stroke];
}

@end

@interface RView : UIView
@property (nonatomic, assign) CGRect rectR;

@end

@implementation RView

- (void)drawRect:(CGRect)rect{
    [[UIBezierPath bezierPathWithRect:self.rectR] stroke];
}

@end


@interface ViewController ()<UICollisionBehaviorDelegate>
@property (nonatomic, weak) RView *redView;
@property (nonatomic, weak) UIView *blueView;
@property (nonatomic, strong) UIDynamicAnimator *animator;
@end

@implementation ViewController

- (void)loadView{
    self.view = [[RBView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    RView *redView = [[RView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(180, [UIScreen mainScreen].bounds.size.height - 150, 50, 50)];
    blueView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:blueView];

    self.redView = redView;
    self.blueView = blueView;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    // 1.創(chuàng)建仿真器
    self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
    
    // 2.創(chuàng)建物理仿真行為
    // 重力行為
    UIGravityBehavior *gravity = [[UIGravityBehavior alloc] initWithItems:@[self.redView]];
    // 碰撞行為
    UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.redView,self.blueView]];
    // 設(shè)置邊界碰撞
    collision.translatesReferenceBoundsIntoBoundary = YES;
    
    // 碰撞的action屬性 實(shí)時(shí)監(jiān)聽(tīng)碰撞過(guò)程
    collision.action = ^{
        // 需要強(qiáng)轉(zhuǎn)
        RBView *rbView = (RBView *)self.view;
        rbView.rectR = self.redView.frame;
        [self.view setNeedsDisplay];
        NSLog(@"%@", NSStringFromCGRect(self.redView.frame));
        // 判斷如果碰撞view的高大于105將顏色變成brownColor顏色 可以做一些加分什么的邏輯
        if (self.redView.frame.size.height > 105) {
            self.redView.backgroundColor = [UIColor brownColor];
        }else{
            self.redView.backgroundColor = [UIColor redColor];
        }
    };
    // 碰撞的模式
    collision.collisionMode = UICollisionBehaviorModeEverything;
    CGPoint startp = CGPointMake(0, 300);
    CGPoint endp = CGPointMake(200, 350);
    
    // 使用兩點(diǎn)創(chuàng)建碰撞邊界
    [collision addBoundaryWithIdentifier:@"key1" fromPoint:startp toPoint:endp];
    
    // 使用UIBezierPath創(chuàng)建碰撞邊界
    UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.blueView.frame];
    [collision addBoundaryWithIdentifier:@"key" forPath:path];
    
    // 碰撞設(shè)置代理
    collision.collisionDelegate = self;
    
    // 3.將仿真行為添加到仿真器
    [self.animator addBehavior:gravity];
    [self.animator addBehavior:collision];
    
}
// 碰撞代理
- (void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier atPoint:(CGPoint)p{
// 需要強(qiáng)制類型轉(zhuǎn)化
    NSString *key = (NSString *)identifier;
    if ([key isEqualToString:@"key1"]) {
        self.redView.backgroundColor = [UIColor yellowColor];
    }else{
        self.redView.backgroundColor = [UIColor redColor];
    }
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虹菲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腐碱,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘶居,死亡現(xiàn)場(chǎng)離奇詭異峻黍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晃琳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門讯检,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卫旱,你說(shuō)我怎么就攤上這事人灼。” “怎么了顾翼?”我有些...
    開(kāi)封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵投放,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我暴构,道長(zhǎng)跪呈,這世上最難降的妖魔是什么段磨? 我笑而不...
    開(kāi)封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮耗绿,結(jié)果婚禮上苹支,老公的妹妹穿的比我還像新娘。我一直安慰自己误阻,他們只是感情好债蜜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著究反,像睡著了一般寻定。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上精耐,一...
    開(kāi)封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天狼速,我揣著相機(jī)與錄音,去河邊找鬼卦停。 笑死向胡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惊完。 我是一名探鬼主播僵芹,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼小槐!你這毒婦竟也來(lái)了拇派?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凿跳,失蹤者是張志新(化名)和其女友劉穎件豌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拄显,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苟径,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躬审。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟆盐,死狀恐怖承边,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情石挂,我是刑警寧澤博助,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站痹愚,受9級(jí)特大地震影響富岳,放射性物質(zhì)發(fā)生泄漏蛔糯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一窖式、第九天 我趴在偏房一處隱蔽的房頂上張望蚁飒。 院中可真熱鬧,春花似錦萝喘、人聲如沸淮逻。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爬早。三九已至,卻和暖如春启妹,著一層夾襖步出監(jiān)牢的瞬間筛严,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工饶米, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桨啃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓咙崎,卻偏偏與公主長(zhǎng)得像优幸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褪猛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理网杆,服務(wù)發(fā)現(xiàn),斷路器伊滋,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)碳却、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • D 啟航 他們的工作室成立了------安心舟工作室笑旺。 老周負(fù)責(zé)客戶資源昼浦;安翎負(fù)責(zé)客戶公共關(guān)系、策劃兼設(shè)計(jì)筒主;而小新...
    CPNcappuccino閱讀 1,487評(píng)論 6 6
  • 尋 極地雪 藍(lán)綠交映 迸射四裂 蒼涼如洪荒 如玄黃 播下 遠(yuǎn)古的種子 那一縷輕羽 匯聚 人的模樣 ...
    蘭兮閱讀 364評(píng)論 16 19
  • 大學(xué)已經(jīng)過(guò)了五分之四关噪,在感慨速度快的同時(shí),也會(huì)回憶曾經(jīng)美好卻淺薄的宿舍情誼乌妙。 說(shuō)它美好使兔,因?yàn)樽蠲啦贿^(guò)初相見(jiàn)。結(jié)束了...
    艾書書哇閱讀 234評(píng)論 4 1