Определите перекрывающиеся UIImageViews и поменяйте их местоположение - PullRequest
0 голосов
/ 20 ноября 2011

У меня около 16 видов UIImage, их можно перемещать касанием.Я могу сбросить UIImage поверх другого UIImage, и тогда UIImage поменяется своей позицией.Будучи новичком в программировании 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]; 

Таким образом, каждое сенсорное изображение связано с какой-то строкой, чтобы описать себя.

В конце касания я только что добавил следующий код, чтобы узнать идентификатор просмотров изображения

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

Но полученное мной совершенно другое значение

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 голосов
/ 20 ноября 2011

Индекс - это просто позиция UIView в массиве subview.Он не устанавливает местоположение в суперпредставлении.

Передача суперпредставления на основе индекса подпредставления.

В указанном выше методе также вызовите 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
}

Реализуйте следующий метод для суперпредставления:

- (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 в последний раз, поэтому не могу гарантировать, что код работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...