确定重叠的UIImageViews并交换它们的位置

时间:2011-11-20 09:15:45

标签: objective-c uiimageview

我有大约16个UIImage视图,可以通过触摸移动。我可以将UIImage放在另一个UIImage上,然后UIImages会交换它们的位置。作为ObjectiveC编程的新手,我正在努力弄清楚UIImageViews并交换他们的位置。直到现在我试图在touchesEnded方法中实现

    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
[self.superview exchangeSubviewAtIndex:[[self.superview subviews] indexOfObject:self] withSubviewAtIndex:[[self.superview subviews] indexOfObject:[touch view]]];
}

但这不起作用。任何帮助,将不胜感激。

UIImages are created by following code
TouchImageView *touchImageView = [[TouchImageView alloc]initWithImage:displayImage];
        touchImageView.identy = [NSString stringWithFormat:@"Image ID %d",i]; 

因此每个触摸图像都与一些字符串相关联以描述自己。

在触控端,我刚刚添加了以下代码来了解图像视图的ID

UITouch *touch = [touches anyObject];
    TouchImageView *dragImage = (TouchImageView*)[touch view];
    NSLog(@"Ended  %a%a",[dragImage identy],[self identy]);

但我得到的o / p是完全不同的

2011-11-21 11:50:34.404 OrganizeMe[882:f803] Ended  0x1.6d96006a6d96p-9170x1.807p-1022

最终代码

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

    __block int tag = -1;
    __block float distance = 100000.0;

    [[self.superview subviews] enumerateObjectsUsingBlock:^(UIView *view, NSUInteger index, BOOL *stop) {
        BOOL interSect = CGRectIntersectsRect([self frame], [view frame]);

        if(interSect && ([self tag]!=[view tag])){
            [self.image CGImage];
            CGPoint currPoint = [[touches anyObject]locationInView:[self superview]];
            CGPoint underPoint = view.center;

            if(distance >= [self distanceBetweenPoint1:currPoint Point2:underPoint]){
                distance =  [self distanceBetweenPoint1:currPoint Point2:underPoint] ;
                tag = [view tag];
            }

        }
    }];
    NSLog(@"Tag and Distance %d,%f",tag,distance);
    TouchImageView* imageView1 = (TouchImageView*)[self.superview viewWithTag:tag];
    CGRect point1 = [imageView1 frame];
    CGRect point2 = [self frame];

    if(tag != -1){
        [imageView1 setFrame:point2];
        [self setFrame:point1];
    }else{
        CGPoint lastTouch = [[touches anyObject]previousLocationInView:[self superview]];
        self.center = lastTouch;
    }
    [self.superview setNeedsLayout];

}

1 个答案:

答案 0 :(得分:0)

索引只是UIView在子视图数组中的位置。它没有在superview中设置位置。

根据子视图的索引重新布局超级视图。

在上述方法中,也请调用setNeedsLayout以重新布局超级视图。

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    [self.superview exchangeSubviewAtIndex:[[self.superview subviews] indexOfObject:self] withSubviewAtIndex:[[self.superview subviews] indexOfObject:[touch view]]];
    [self.superview setNeedsLayout]; // Should call the method below
}

为superview实现以下方法:

- (void)layoutSubviews
{
    // Iterate over all subviews
    [self.subviews enumerateObjectsUsingBlock:^(UIView *view, NSUInteger index, BOOL *stop) {
        // This block will be executed for each subview. You have the subview's index.
        // Now set the subview's position accordingly to the index.
        // I don't know your layout logic, but let's assume you have 14 subviews spread over 4 columns, this will be the subviews' position:
        /*  0  1  2  3
            4  5  6  7
            8  9 10 11
           12 13         */
        int col = index % 4; // Column from 0 to 3
        int row = (int)(index / 4); // Row starting from 0
        int w = view.frame.size.width;
        int h = view.frame.size.height;
        CGPoint p = CGPointMake(col * w + w / 2, row * h + h / 2);
        [view setCenter:p];
    }];
}

我上次使用Cocoa touch已经很久了,所以我无法保证代码正常运行。