2010-01-02 3 views
8

Довольно распространенный вопрос, на который у меня есть несколько ответов, и я почти там. У меня есть кнопка, которая при нажатии будет создавать изображение (код следующим образом)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]; 

У меня тогда есть метод touchhesBegan, который обнаружит, что коснулся. Мне нужно, чтобы пользователь мог перетащить вновь созданный образ. Он почти работает, но изображение мерцает повсюду, когда вы его перетаскиваете. Я могу получить доступ к изображению, на которое вы нажимаете, поскольку я могу получить его TAG, но я просто не могу его перетащить.

- (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]; 
} 

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

ответ

34

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

код, если кто заинтересован ....

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]; 
+4

приведенный выше код происходит от http://www.iphoneexamples.com/ –

+0

спасибо за публикацию этого, но я получаю эффект дрожания во время этого, как его можно избежать? – itsaboutcode

+0

спасибо человеку! работая как шарм :) – soupdiver

1

Обычно вы получаете неявную анимацию при изменении center. Вы возитесь с -contentMode или звоните -setNeedsDisplay, если это возможно?

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

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

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

BTW, вы просачиваетесь tmpImage.

+0

спасибо за ответ , Я пробовал то, что вы предлагали, и это все еще происходит. Я думаю, что это как-то связано с кодом, который я использую, чтобы установить изображение? Когда я помещаю изображение в представление в Interface Builder и устанавливаю его как IBOutlet UIImageView в файле .h, он отлично перемещается. Я что-то упустил при настройке каждого из моих изображений? (ps) спасибо за наконечник tmpImage - пропустил этот! –

+0

Я подумал, что это может быть проблема с тегом. Но теперь я думаю, что это может быть проблема с представлениями. Когда я помещаю изображение, используя первый бит кода, он переходит в 0,0. Кажется, он всегда хочет вернуться туда, когда я его перетаскиваю. Так что это вызывает мерцание. Текущее положение, затем он возвращается туда ... его сводит меня с ума! –