我們常見的碰撞都是矩形碰撞,即使修改了view的cornerRadius,讓圖片看上去像圓形,但碰撞的時候,依然是矩形碰撞。
UIDynamics 的第一個版本帶有碰撞系統(在 UICollisionBehavior 中)只支持矩形。這可以理解,因爲UIViews都是矩形架構,但是圓形的卻不常見,更不用說優化一個自定義的貝塞爾曲線。在iOS 9中,UIDynamicItem協議里加了一個新屬性:UIDynamicItemCollisionBoundsType,支持以下枚舉類型:
-
Rectangle
-
Ellipse
-
Path
但這個屬性是隻讀的,需要進行以下修改:
//1. 在UIDynamicItemGroup類中,有一個collisionBoundsType的屬性,可以修改屬性值,進而修改控件的碰撞邊緣。(應該是ios9.0纔有的)
NS_CLASS_AVAILABLE_IOS(9_0) @interface UIDynamicItemGroup : NSObject <UIDynamicItem>
@property (nonatomic, readonly) UIDynamicItemCollisionBoundsType collisionBoundsType NS_AVAILABLE_IOS(9_0);
//2.但是,這個collisionBoundsType是隻讀的,所以需要創建一個繼承自UIView的類,改寫這個屬性:
@interface DZView : UIView
@property (nonatomic) UIDynamicItemCollisionBoundsType collisionBoundsType;
@end
@implementation DZView
@synthesize collisionBoundsType; //一定要寫上這句代碼
@end
//3. 然後用這個類創建一個View,設置其collisionBoundsType屬性就可以了。
DZView * basketBallView = [[DZView alloc]init];
basketBallView.collisionBoundsType = UIDynamicItemCollisionBoundsTypeEllipse;
接下來,你就可以實現如下情景了: