Довольно общий вопрос это, на которое у меня есть несколько ответов и я почти там. У меня есть кнопка, которая при нажатии создаст изображение (код следующим образом)
(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];
}
Это работает, в этом я получаю вывод тега для каждого изображения, поскольку я нажимаю на них. Но когда я перетаскиваю, это высвечивает... какие-либо идеи?
В ответ на свой вопрос - я решил создать класс для работы с изображениями, которые я помещаю на вид.
Код если кому интересно....
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];
Обычно при смене центра получается неявная анимация
. Вы случайно не шутите с -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
.