iOS 7.0에 추가된 UIKit의 Dynamics에 대한 데모 코드를 작성해 보자! | 조회 : 150 |
나의 폴더 > 아이폰 | 2013-09-24 (Tue) 09:13 | http://blog.dreamwiz.com/papasmf1/13992924 |
UIKit Dynamics 데모
중력이나 충돌에 대한 처리를 담당하는 새로운 클래스들이 추가되었다. 1. File->New->Project를 선택하고 싱글뷰 애플리케이션 템플릿을 선택한다. 프로젝트이름은 DemoDynamics로 한다.
2. ViewController.m파일에 다음의 코드를 추가한다.
뷰에 정사각형을 하나 올려놓고 하단으로 자연스럽게 내려가도록 한다.
#import"Dynamics2ViewController.h"
@interfaceDynamics2ViewController () <UICollisionBehaviorDelegate>
{
UIDynamicAnimator *_animator;
UIGravityBehavior *_gravity;
UICollisionBehavior *_collision;
BOOL _firstContact;
}
@end
@implementation Dynamics2ViewController
- (void)viewDidLoad
{
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIView *square = [[UIViewalloc] initWithFrame:
CGRectMake(100, 100, 100, 100)];
square.backgroundColor = [UIColorgrayColor];
[self.viewaddSubview:square];
충돌한 경우 처리할 장벽에 해당되는 객체를 뷰객체로 생성합니다.
UIView *barrier = [[UIViewalloc] initWithFrame:
CGRectMake(0, 300, 130, 20)];
barrier.backgroundColor = [UIColorredColor];
[self.viewaddSubview:barrier];
_animator = [[UIDynamicAnimatoralloc] initWithReferenceView:self.view];
_gravity = [[UIGravityBehavioralloc] initWithItems:@[square]];
[_animatoraddBehavior:_gravity];
여기까지의 코드를 통해 자연스럽게 떨어지는 물체에 중력도를 더할 수 있다.
UIDynamicAnimator: 이 클래스는 UIKit 물리 엔진이라고 할 수 있다. 이 클래스는 전반적인 작업 목록을 제공하는 중력과 같이 엔젠에 다양한 행위들을 추적할 수 있도록 한다.
UIGravityBehavior: 하나 또는 그 이상의 아이템들에 중력의 행위를 모델링한다. 행위의 인스턴스를 생성했을 때, 아이템들과 연결되도록 한다. 이 방법은 행위에 의해 영향을 받은 아이템들을 선택할 수 있고 이러한 경우 아이템들은 중력의 영향을 받을 수 있다.
_collision = [[UICollisionBehavioralloc] initWithItems:@[square]];
[_collisionaddBoundaryWithIdentifier:@"barrier"fromPoint:barrier.frame.origintoPoint:CGPointMake
(barrier.frame.origin.x + barrier.frame.size.width, barrier.frame.origin.y)];
_collision.translatesReferenceBoundsIntoBoundary = YES;
_collision.collisionDelegate = self;
윈래의 코드는 바닥(경계선) 없이 지속적으로 떨어지기 때문에 위의 코드를 통해 바운더리를 만들어 주면 바닥에서 사각형이 멈추는 것을 볼 수 있다.
좌표계에 해당하는 바운더리를 만들어주는 경우에는 translatesReferenceBoundsIntoBoundary속성을 YES로 지정하면 된다.
UIDynamicItemBehavior *itemBehaviour = [[UIDynamicItemBehavioralloc] initWithItems:@[square]];
itemBehaviour.elasticity = 0.5;
[_animatoraddBehavior:itemBehaviour];
[_animatoraddBehavior:itemBehaviour];
[_animatoraddBehavior:_collision];
}
-(void)collisionBehavior:(UICollisionBehavior *)behavior beganContactForItem:(id<UIDynamicItem>)item withBoundaryIdentifier:(id<NSCopying>)identifier atPoint:(CGPoint)p
{
UIView *view = (UIView *)item;
view.backgroundColor = [UIColoryellowColor];
[UIViewanimateWithDuration:0.3animations:^{
view.backgroundColor = [UIColorgrayColor];
}];
if(!_firstContact)
{
_firstContact = YES;
UIView *square = [[UIViewalloc] initWithFrame:CGRectMake(30, 0, 100, 100)];
square.backgroundColor = [UIColorgrayColor];
[self.viewaddSubview:square];
[_collisionaddItem:square];
[_gravityaddItem:square];
UIPushBehavior *push = [[UIPushBehavioralloc] initWithItems:@[view]
mode:UIPushBehaviorModeInstantaneous];
[pushsetAngle:-M_PI/2magnitude:8.0f];
[_animatoraddBehavior:push];
UIAttachmentBehavior *attach = [[UIAttachmentBehavioralloc] initWithItem:viewattachedToItem:square];
[_animatoraddBehavior:attach];
}
}
- (void)didReceiveMemoryWarning
{
[superdidReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
|
댓글 없음:
댓글 쓰기
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.