2013-02-20 2 views
1

У меня есть подкласс UIView, содержащий несколько подзаголовков, которые я хочу перетащить & в один из нескольких UIView, которые содержатся в UICollectionView. Когда начинается перетаскивание, я хотел бы масштабировать перетаскиваемый вид от его текущего размера до чего-то меньшего на время перетаскивания (оригинал слишком велик, чтобы удобно разрешить выбор целевой цели без его первоначального масштабирования). Пока что, у меня есть это:IOS Перетаскивание с масштабированием

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    self.transform = CGAffineTransformMakeScale(0.3f, 0.3f); 
    startLocation = ([[touches anyObject] locationInView:self]); 
    startLocation = CGPointApplyAffineTransform(startLocation, self.transform); 
} 

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint pt = [[touches anyObject] locationInView:self]; 
    float dx = pt.x - startLocation.x; 
    float dy = pt.y - startLocation.y; 
    CGPoint newCenter = CGPointApplyAffineTransform (CGPointMake(self.center.x + dx, self.center.y + dy), self.transform); 
    self.center = newCenter; 
} 

Это начало, как весы перетаскиваемую UIView, как я хочу его, и позволит мне перетащить его; однако перетаскиваемый UIView не перемещается напрямую с указателем мыши (я запускаю симулятор). Когда изображение находится рядом с верхним левым углом экрана симулятора, указатель мыши & перетаскивает вид; но когда я отхожу от верхнего правого угла экрана, вид больше не перемещается непосредственно с указателем мыши; указатель мыши, по-видимому, перемещается примерно в соотношении 2: 1 к перемещению вытащенного UIView.

Вторичная проблема заключается в том, что когда перетаскивание заканчивается, если элемент не отбрасывается, мне нужно вернуть UIView до его первоначальной шкалы, прежде чем присоединять его к его супервину, и не совсем поняли, как это сделать ,

Цените любую помощь, в том числе предложения относительно лучшего подхода, если я полностью отслежу здесь. (Я знаю, что есть еще кое-что, что нужно сделать, чтобы изолировать цель падения и сбросить, но я думаю, что знаю, что там нужно сделать).

Спасибо за любые рекомендации.

регулярное выражение

ответ

0

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

Когда выполняется перетаскивание, выполняйте изменение размера. Сначала начните перетаскивание, а затем - падение. Сделайте это пошагово, это поможет вам лучше понять, чего вы пытаетесь достичь.

Относительно соотношения 2: 1 У меня есть ощущение, что это касается преобразования, которое вы не изменяли в целом по общему виду, но я могу ошибаться. Но убедитесь, что вы уменьшаете вид перетаскивания, а середина указывает на точку перетаскивания.

Некоторые ссылки, которые могут помочь являются:

http://www.edumobile.org/iphone/iphone-programming-tutorials/simple-drag-and-drop-on-iphone/ http://bynomial.com/blog/?p=77

+0

Хорошо, я понял, и я подумал, что отправлю код, в котором я оказался, если кому-то это понадобится. Я нашел еще одну статью с аналогичной проблемой: – RegularExpression

2

Хорошо, я получил ответ & думал, что я должен опубликовать здесь в случае, если кто-то нуждается. Спасибо за более ранний ответ. Я наткнулся на следующую статью:

How to move a UIImageView after applying CGAffineTransformRotate to it?

и это привело меня к следующему решению. В моем исходном коде я применял преобразование к исходному местоположению, но я не применял его к точке касания. Итак, вот что я в конечном итоге с этим решил проблему:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    self.transform = CGAffineTransformMakeScale(0.2f, 0.2f); 
    startLocation = ([[touches anyObject] locationInView:self]); 
    startLocation = CGPointApplyAffineTransform(startLocation, self.transform); 
} 

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGPoint pt = [[touches anyObject] locationInView:self]; 
    if (!CGAffineTransformIsIdentity(self.transform)) 
     pt = CGPointApplyAffineTransform(pt, self.transform); 
    float dx = pt.x - startLocation.x; 
    float dy = pt.y - startLocation.y; 
    CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy); 
    self.center = newCenter; 
} 

Таким образом, преобразование, необходимое для применения к точке касания, если и только если преобразование было применено к UIView. В какой-то момент я применил преобразование к точке касания, но без условного - в этом случае вся операция перетаскивания сошла на плохой старт, потому что преобразование было применено к точке касания, возможно, до того, был перемещен.Во всяком случае, вышеприведенный код, похоже, решил проблему.

+0

Кроме того, точка нового центра не нуждается в преобразовании. – RegularExpression

Смежные вопросы