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, как правило, является неточной системой, и если вы хотите анимировать элементы интерфейса, я бы рекомендовал использовать динамику только до тех пор, пока элементы не достигнут желаемого местоположения, а затем удалить их поведение и установить их точное местоположение:)