0

Пожалуйста, обратитесь к изображению ниже для следующего вопроса: Синие и оранжевые круги, которые вы видите, это UIView. Я хотел бы иметь возможность перетащить синий UIView, у которого есть UIPanGestureRecognizer, и соответствующим образом перевести оранжевый круг и оставаться на том же расстоянии от синего круга, что и сейчас. Значение, если я перетаскиваю синий круг вниз, оранжевый UIView должен оставаться параллельным синему кругу и переводить вниз. Если я перетаскиваю синий круг вправо, оранжевый круг должен также перевести вправо, и останется на таком же расстоянии от синего круга, как сейчас.Перевести UIView, перетащив другой UIView

Image

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

-(void)dragging:(UIPanGestureRecognizer *)p { 


UIView *newView = p.view; 
if (p.state == UIGestureRecognizerStateBegan) { 
    self.origC = newView.center; 
} 
self.delta = [p translationInView:newView.superview]; 
CGPoint c = self.origC; 

c.x +=self.delta.x; 
c.y +=self.delta.y; 

newView.center = c; 

[self.delegate refreshView]; 
} 

В классе UIPanGestureRecognizer, я могу получить перевод панорамирования жеста в системе заданного представления координат с:

self.delta = [p translationInView:newView.superview];

Я думаю, что это дельта, мне нужно подать заявку на перевод оранжевого круга, но я не уверен, как бы я это сделал? Любая помощь будет оценена по достоинству. Спасибо!

+0

Не можете ли вы просто добавить 'delta' в центр другого представления? –

+0

Таким образом, оба эти представления добавляются как подпункты в другой UIView (обозначается фиолетовым фоном). В этом супервиде, в 'drawRect:', я попытался добавить эту дельта к центру другого представления следующим образом: 'self.fp2.center = CGPointMake (self.fp2.center.x + self.deltaDrag.x, self. fp2.center.y + self.deltaDrag.y); ' Это приводит к тому, что оранжевый вид вылетает из окна при первом перетаскивании синего изображения. – DanielRak

+0

вы добавляете дельту в исходный центр оранжевого или текущего центра? Поскольку дельта - это полный перевод с течением времени. –

ответ

0

Сделайте это точно так же, как вы делаете это для прямой перетаскивания точки.

if (p.state == UIGestureRecognizerStateBegan) { 
    self.origC = newView.center; // your code 
    self.origD = otherView.center; // new code 
} 
CGPoint c = self.origC; // your code 
c.x +=self.delta.x; // your code 
c.y +=self.delta.y; // your code 
newView.center = c; // your code 
CGPoint d = self.origD; // new code 
d.x +=self.delta.x; // new code 
d.y +=self.delta.y; // new code 
otherView.center = d; // new code 
+0

Мэтт, спасибо! Вы сделали пару небольших ошибок, но я отредактировал ваш ответ в случае, если ему нужны другие люди. Вы очень помогли. Большое спасибо! – DanielRak

0

Насколько я понимаю, вставляемый код работает, однако вы хотите найти способ «одной строки», верно? Я думаю, что вы ищете что-то подобное.

orangeView.transform = CGAffineTransformMakeTranslation(delta.x,delta.y); 
Смежные вопросы