UIViews перекрываются после добавления гравитации и столкновения

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

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-й башни. Любые указатели / помощь приветствуется. Заранее спасибо:).

1 ответ

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

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

Другие вопросы по тегам