UIImage, обнаруживающий касание и перетаскивание

Довольно общий вопрос это, на которое у меня есть несколько ответов и я почти там. У меня есть кнопка, которая при нажатии создаст изображение (код следующим образом)

(numImages установлен на загрузке в НУЛЬ и используется в качестве количества для номеров тега всех созданных изображений),

UIImage *tmpImage = [[UIImage imageNamed:[NSString stringWithFormat:@"%i.png", sender.tag]] retain];
UIImageView *myImage = [[UIImageView alloc] initWithImage:tmpImage];

numImages += 1;

myImage.userInteractionEnabled = YES;
myImage.tag = numImages;
myImage.opaque = YES;
[self.view addSubview:myImage];
[myImage release];

У меня тогда есть touchesBegan метод, который обнаружит то, что затронуто. То, что мне нужен он, чтобы сделать, должно позволить пользователю перетаскивать недавно созданное изображение. Это почти работает, но мерцания изображения повсеместно при перетаскивании его. Я могу получить доступ к изображению, на которое Вы нажимаете, поскольку я могу добраться, это - ТЕГ, но я просто не могу перетащить его приятно.

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

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint location = [touch locationInView:touch.view];

    if (touch.view.tag > 0) {
        touch.view.center = location;
    }

    NSLog(@"tag=%@", [NSString stringWithFormat:@"%i", touch.view.tag]);

}

- (void) touchesMoved:(NSSet *)touches withEvent: (UIEvent *)event {
    [self touchesBegan:touches withEvent:event];
}

Это работает, в этом я получаю вывод тега для каждого изображения, поскольку я нажимаю на них. Но когда я перетаскиваю, это высвечивает... какие-либо идеи?

8
задан Matt Facer 2 January 2010 в 15:28
поделиться

2 ответа

В ответ на свой вопрос - я решил создать класс для работы с изображениями, которые я помещаю на вид.

Код если кому интересно....

Draggable.h

#import <Foundation/Foundation.h>
@interface Draggable : UIImageView {
    CGPoint startLocation;
}
@end

Draggable. m

#import "Draggable.h"
@implementation Draggable

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    // Retrieve the touch point
    CGPoint pt = [[touches anyObject] locationInView:self];
    startLocation = pt;
    [[self superview] bringSubviewToFront:self];
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
    // Move relative to the original touch point
    CGPoint pt = [[touches anyObject] locationInView:self];
    CGRect frame = [self frame];
    frame.origin.x += pt.x - startLocation.x;
    frame.origin.y += pt.y - startLocation.y;
    [self setFrame:frame];
}
@end

и назвать его

UIImage *tmpImage = [[UIImage imageNamed:"test.png"] retain];
UIImageView *imageView = [[UIImageView alloc] initWithImage:tmpImage];

CGRect cellRectangle;
cellRectangle = CGRectMake(0,0,tmpImage.size.width ,tmpImage.size.height );
UIImageView *dragger = [[Draggable alloc] initWithFrame:cellRectangle];
[dragger setImage:tmpImage];
[dragger setUserInteractionEnabled:YES];

[self.view addSubview:dragger];
[imageView release];
[tmpImage release];
34
ответ дан 5 December 2019 в 05:03
поделиться

Обычно при смене центра получается неявная анимация . Вы случайно не шутите с -contentMode или вызываете -setNeedsDisplay?

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

if (touch.view.tag > 0) {
    [UIView beginAnimations:@"viewMove" context:touch.view];
    touch.view.center = location;
    [UIView commitAnimations];
}

Обратите внимание, что NSLog() может быть очень медленным (намного медленнее, чем вы ожидали; это намного сложнее, чем простое printf), и это может вызвать проблемы в чем-то, вызываемом так часто, как touchchesMoved:withEvent:.

BTW, вы протекаете tmpImage.

.
1
ответ дан 5 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: