繁体   English   中英

添加重力和碰撞行为后的UIViews重叠

[英]UIViews Overlap after adding Gravity and Collision behaviour

我试图在单击按钮时堆叠uiviews。 我还使用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];
}

我如何确保这些块在堆放时不会重叠。 这种重叠会导致另一个问题,当我在其旁边添加另一个与此塔类似的塔并将添加行为添加到绿色块以将其向右移动时,而不是仅从第二个塔移动相邻的块时,它还会移动第二个塔从第二座楼起。 任何指针/帮助表示赞赏。 提前致谢 :)。

我相信UIDynamics为物体和摩擦力增加了一些“弹力”,因此当它们碰撞和移动时,它们的动作更逼真。 您可以通过使用UIDynamicItemBehavior并减少elasticitybounce来减少这种情况,但是我不确定。

长话短说的UIDynamics往往是一个不精确的系统,如果您要为其中的界面项目设置动画,我建议您仅在项目到达其所需位置之前使用动态技术,然后删除其行为并设置其确切位置:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM