0

Я пытаюсь установить uiviews одним нажатием кнопки. Я также добавил Gravity & Поведение при столкновении с использованием динамики UIKit. Проблема, которую вы видите на изображении (http://pho.to/7nVJI), - это самый нижний самый зеленый блок, а блок поверх этого, кажется, перекрывается. Вот метод ViewDidLoad: `- (void) viewDidLoad { [super viewDidLoad]; // Выполняйте какие-либо дополнительные настройки после загрузки представления, как правило, из наконечника.UIViews Overlap после добавления поведения Gravity and Collision

UIButton *moveIt = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
moveIt.frame = CGRectMake(200, 50, 70, 30); 
[moveIt addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchDown]; 
[self.view addSubview:moveIt]; 
moveIt.titleLabel.text = @"Hit it"; 
moveIt.titleLabel.textColor = [UIColor whiteColor]; 
moveIt.backgroundColor = [UIColor blueColor]; 


UIButton *addBlockButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
addBlockButton.frame = CGRectMake(20, 50, 70, 30); 
[addBlockButton addTarget:self action:@selector(addBlock:) forControlEvents:UIControlEventTouchDown]; 
[self.view addSubview:addBlockButton]; 
addBlockButton.backgroundColor = [UIColor orangeColor]; 

animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 

newBlockYCoordiante = self.view.bounds.size.height-BLOCKHEIGHT; 

    UIView *basicBlock = [[UIView alloc] initWithFrame:CGRectMake(64, newBlockYCoordiante, BLOCKWIDTH, BLOCKHEIGHT)]; 
    basicBlock.layer.borderWidth = 1; 
    basicBlock.tag = 100; 
    basicBlock.layer.borderColor = [UIColor greenColor].CGColor; 
    basicBlock.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:basicBlock]; 
newBlockYCoordiante = newBlockYCoordiante - BLOCKHEIGHT; 


    if (collisonBehaviour == nil) { 
     collisonBehaviour = [[UICollisionBehavior alloc] initWithItems:@[basicBlock]]; 
     collisonBehaviour.translatesReferenceBoundsIntoBoundary = YES; 
     collisonBehaviour.collisionDelegate = self; 
     [animator addBehavior:collisonBehaviour]; 
    } 


    if (gBehaviour == nil) { 
     gBehaviour = [[UIGravityBehavior alloc] initWithItems:@[basicBlock]]; 
     [animator addBehavior:gBehaviour]; 
    } 

} `

А вот как я добавляю новые блоки поверх предыдущих блоков:

- (void) addBlock :(id)sender 
{ 
    UIView *basicBlock = [[UIView alloc] initWithFrame:CGRectMake(64, newBlockYCoordiante, BLOCKWIDTH, BLOCKHEIGHT)]; 
    basicBlock.layer.borderWidth = 1; 
    basicBlock.layer.borderColor = [UIColor orangeColor].CGColor; 
    basicBlock.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:basicBlock]; 
    newBlockYCoordiante = newBlockYCoordiante - BLOCKHEIGHT; 

    [gBehaviour addItem:basicBlock]; 
    [collisonBehaviour addItem:basicBlock]; 
} 

Как я гарантировать, что эти блоки не перекрываются, а до укладки. Это перекрытие вызывает еще одну проблему, когда я добавляю другую башню, подобную этой, рядом с ней справа, и добавляю поведение пота к зеленому блоку, чтобы переместить его вправо, вместо того, чтобы перемещать только соседний блок со второй башни, он также перемещает вторую последнюю блок от 2-й башни. Любые указатели/помощь оцениваются. Заранее спасибо :).

+0

Это перекрытие не происходит, когда я просто добавляю представления друг к другу, не добавляя при этом поведение гравитации/столкновения. – DesignThought

ответ

0

Я считаю, что UIDynamics добавляет немного «дарить» объектам и трениям, чтобы при столкновении и движении они действовали более реалистично. Вы можете уменьшить это, используя UIDynamicItemBehavior и уменьшая elasticity и bounce, но я не уверен.

Краткая информация Краткая информация UIDynamics имеет тенденцию быть неточной системой, и если вы ищете элементы анимации интерфейса, я бы рекомендовал использовать динамику только до тех пор, пока элементы не достигнут желаемого местоположения, а затем удалили бы их поведение и установили их точное местоположение:)

 Смежные вопросы

  • Нет связанных вопросов^_^