2014년 11월 9일 일요일

아이폰 - iOS 7.0에 추가된 UIKit의 Dynamics에 대한 데모 코드를 작성해 보자!

iOS 7.0에 추가된 UIKit의 Dynamics에 대한 데모 코드를 작성해 보자! 조회 : 150
나의 폴더 > 아이폰 | 2013-09-24 (Tue) 09:13http://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 = [[UIViewallocinitWithFrame:
       CGRectMake(100100100100)];
    square.backgroundColor = [UIColorgrayColor];
    [self.viewaddSubview:square];

충돌한 경우 처리할 장벽에 해당되는 객체를 뷰객체로 생성합니다.

    UIView *barrier = [[UIViewallocinitWithFrame:
       CGRectMake(030013020)];
    barrier.backgroundColor = [UIColorredColor];
    [self.viewaddSubview:barrier];

    _animator = [[UIDynamicAnimatorallocinitWithReferenceView:self.view];
    _gravity = [[UIGravityBehaviorallocinitWithItems:@[square]];
    [_animatoraddBehavior:_gravity];

여기까지의 코드를 통해 자연스럽게 떨어지는 물체에 중력도를 더할 수 있다.
UIDynamicAnimator: 이 클래스는  UIKit 물리 엔진이라고 할 수 있다이 클래스는 전반적인 작업 목록을 제공하는 중력과 같이 엔젠에 다양한 행위들을 추적할 수 있도록 한다.
UIGravityBehavior: 하나 또는 그 이상의 아이템들에 중력의 행위를 모델링한다행위의 인스턴스를 생성했을 때아이템들과 연결되도록 한다이 방법은 행위에 의해 영향을 받은 아이템들을 선택할 수 있고 이러한 경우 아이템들은 중력의 영향을 받을 수 있다.

    _collision = [[UICollisionBehaviorallocinitWithItems:@[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 = [[UIDynamicItemBehaviorallocinitWithItems:@[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 = [[UIViewallocinitWithFrame:CGRectMake(300100100)];
        square.backgroundColor = [UIColorgrayColor];
        [self.viewaddSubview:square];

        [_collisionaddItem:square];
        [_gravityaddItem:square];

        UIPushBehavior *push = [[UIPushBehaviorallocinitWithItems:@[view]
          mode
:UIPushBehaviorModeInstantaneous];
        [pushsetAngle:-M_PI/2magnitude:8.0f];
        [_animatoraddBehavior:push];

        UIAttachmentBehavior *attach = [[UIAttachmentBehaviorallocinitWithItem:viewattachedToItem:square];
        [_animatoraddBehavior:attach];
    }
}

- (void)didReceiveMemoryWarning
{
    [superdidReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.

Xcode 26의 새로운 기능들

 애플의 AI준비에 대한 골든타임이 지나가고 있다는 말이 많이 들립니다. ㅎㅎ  애플의 그동안의 패쇄적인 환경을 생각하면 온디바이스AI나 LLM환경에서 다소 아쉬운 부분이 많이 있습니다. 다른 빅테크들과 전혀 다른 방향의 목소리를 내고 있어서 좀 우려...