2014-04-01 1 views
3

"떨어지는"요소 (회색/UIView * 사각형)가 넘어져 장벽과 상호 작용할 수있는 동안 빨간색 요소 인 "장애물"이 움직이지 않도록하려면 어떻게해야합니까? (에스)?UIKit 다이내믹스 충돌 - 장애물 요소 고정

많은 회색 요소, 많은 붉은 장벽이 있습니다 ...

enter image description here

당신은 당신의 동역학 코드에이를 추가 할 필요가
@interface MainViewController() 
{ 
      UIDynamicAnimator* _animator; 
      UIGravityBehavior* _gravity; 
      UICollisionBehavior* _collision; 
      // 
      NSMutableArray *collisionArray; 
} 

@end 

@implementation MainViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
      self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
      if (self) { 
       // 
      } 
      return self; 
} 



- (void)viewDidLoad 
{ 
      [super viewDidLoad]; 
      // 

      collisionArray = [[NSMutableArray alloc] init]; 
      _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 
      [self addTheBarrier]; 


} 


-(void)addTheBarrier 
{ 
      for (int i=0; i<20; i++) { 
       UIView* barrier = [[UIView alloc] initWithFrame:CGRectMake(i*16, 250, 10, 10)]; 
       barrier.backgroundColor = [UIColor redColor]; 
       [self.view addSubview:barrier]; 


       CGPoint rightEdge = CGPointMake(barrier.frame.origin.x + 
               barrier.frame.size.width, barrier.frame.origin.y); 
       [_collision addBoundaryWithIdentifier:@"barrier" 
              fromPoint:barrier.frame.origin 
               toPoint:rightEdge]; 
       [collisionArray addObject:barrier]; 
      } 
      [self startDynamic]; 
     } 



    #pragma mark - Dynamics 

    -(void)startDynamic 
     { 
       UIView* square = [[UIView alloc] initWithFrame:CGRectMake((arc4random()%250)+10, 100, 10, 10)]; 
       square.backgroundColor = [UIColor grayColor]; 

       [self.view addSubview:square]; 
       [collisionArray addObject:square]; 

       _collision = [[UICollisionBehavior alloc] initWithItems:collisionArray]; 


       _gravity = [[UIGravityBehavior alloc] initWithItems:@[square]]; 
       [_animator addBehavior:_gravity]; 
       // 
       UIDynamicItemBehavior* itemBehaviour = [[UIDynamicItemBehavior alloc] initWithItems:@[square]]; 
       itemBehaviour.elasticity = 0.85; 
       [_animator addBehavior:itemBehaviour]; 

       // 
       UIPushBehavior *push = [[UIPushBehavior alloc] initWithItems:@[ square ] mode:UIPushBehaviorModeContinuous]; 
       [push setPushDirection:CGVectorMake(0, 0)]; 

       [_animator addBehavior:push]; 
       [_collision setTranslatesReferenceBoundsIntoBoundary:NO]; 
       [_animator addBehavior:_collision]; 

      [self performSelector:@selector(startDynamic) withObject:nil afterDelay:0.3 ]; 

} 


@end 
+1

지금 전체 답변을 작성할 시간이 없지만 UIAttachmentBehavior를 살펴보십시오. – Undo

+0

감사합니다. 실행 취소, 부분적으로 작동 중입니다. 이제 빨간색 녀석은 잠겨 있지만 여전히 중심점 주위를 회전합니다 ... (멋진 효과에도 불구하고)) – chewy

+0

지금까지 작성한 코드를 게시 할 수 있습니까? 나는 당신이 그것을 보여 주면 그들이 회전에서 그들을 유지하는 방법을 알아낼 수있을 것 같아요. – Undo

답변

2

:

//Attachment behavior that you figured out: 

UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:barrier attachedToAnchor:barrier.center]; 
[_animator addBehavior:attachment]; 

// To keep the views from spinning: 

UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior alloc] initWithItems:@[barrier]]; 
itemBehavior.allowsRotation = NO; 
[_animator addBehavior:itemBehavior]; 

우리는 만들고있어 첨부 파일 동작을 사용하여 화면에서 화면이 튀는 것을 방지 한 다음 UIDynamicItemBehavior을 사용하여 해당 항목의 동작을 세부적으로 조정할 수 있습니다. 특히 k 회전하지 못하게하십시오.