Я делаю простое приложение, в котором различные виды динамически добавляются (кнопки, ползунки, метки и т. Д.) В представление контейнера.Это уже работает, но следующим шагом будет возможность переместить (перетащить) эти созданные виды чтобы разместить их в нужном месте на экране. Для этого я поместил кнопку на панели навигации с двойной функциональностью, Редактировать и Выполнить. Я не знаю, как получить это в режиме запуска, представления реагируют нормально (если это кнопка, чтобы иметь возможность сделать нажмите, если это ползунок, чтобы иметь возможность изменить его положение ...), но в режиме редактирования реагируйте только на жест Pan, чтобы иметь возможность перетаскивать их, и даже если касание было сделано, они не реагировали на свои обычные события, только на панорамирование, пока кнопка в Edit.I думал, что нужно поместить панель (UIView), которая переместится в первую позицию (.bringToFront ()), но представления ниже продолжают реагировать на прикосновение. Если я установил .userInteraction () панели в false, представления не отвечают но панель тоже ... я бы оценил любую ори ntacion.
Хороший в конце концов я сделал одна pequeГ±a халтуру, которая ввиду отсутствия чего-то лучшего кажется, что оно функционирует. Сначала прозрачный view того же самого tamaГ±o, что view contenedora:
let frame = container.frame
let panel = UIView(frame: frame);panel.tag = -1000
let panGesture = UIPanGestureRecognizer (target: self, action:#selector(pan(sender:)))
panel.addGestureRecognizer(panGesture)
view.addSubview(panel)
Потом я пробегаю все совещания, чтобы видеть, содержит ли какая-то ту же точку, что захваченный в прозрачной панели в начало panGesture (.began)
@IBAction func pan(sender: UIPanGestureRecognizer) {
switch sender.state {
case .began :
let p: CGPoint = sender.location(in: view.viewWithTag(-1000))
for v in container.subviews {
if v.frame.contains(p){
selected = v
difference.x = p.x - selected!.center.x
difference.y = p.y - selected!.center.y
}
}
case .changed :
let location = sender.location(in: view.viewWithTag(-1000))
selected?.center.x = location.x - (difference.x)
selected?.center.y = location.y - (difference.y)
case .ended :
selected = nil
default:
print("Gesture indefinido")
}
Чтобы делать этот тип 'drags' возможно использовать UICollectionView, который позволяет двигать ячейки и в часть работать с ними, потом через boleanos уже ты показал бы, когда они могут двигаться, и когда нет.
Если не, как ты комментируешь проблему, он состоит в том, что пока ты издаешь переключатель оно например продолжает функционировать равно, для этого, может быть, ты мог бы пытаться способствования тому, чтобы пока ты был в способе редактирование объекты, которые были, не были interactuables, с switch.enabled или чем-то из этого.
Прощение, но у меня не было время раньше. Я думаю, что ты хочешь смочь двигать элементы, где ты хотел внутри экрана, и которые ты подпираешь, функционируйте, когда ты делаешь tap. У меня есть что-то, что я сделал однажды, но эта в ObjC, я надеюсь, что это было то, что ты хочешь, и что подал тебя. Главным образом ты должен добавлять жест хлеб в поле зрения чтобы мочь двигать то, что есть в ней. Ты должен иметь доступ к статьям, которые есть в виде, Я использовал singleton, чтобы сохранять, так как могли быть у 2 ó 30, также ты мог бы пробегать статьи вида
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(hacenPan:)];
[self.view addGestureRecognizer:pan];
Сейчас ты должен делать действие хлеба. Для этого ты будешь должен распознавать состояния и сохранять статью, которую ты двигаешь
-(void)hacenPan:(UIPanGestureRecognizer *)pan{
static Figura *f;
//compruebo los estados del pan para saber si esta comenzando o terminando...
if ( pan.state == UIGestureRecognizerStateChanged) {
//se esta moviendo
CGPoint currentPosition = [pan locationInView:self.view];
if ( f ) {
CGRect fr=f.shape.frame;
fr.origin.x=currentPosition.x;
fr.origin.y=currentPosition.y;
f.shape.frame=fr;
}
} else if ( pan.state == UIGestureRecognizerStateBegan) {
//comienza el pan, busco la figura que hay debajo
CGPoint inicio =[pan locationInView:self.view];
//comprobar si el punto pertenece a alguna vista existente
f=[ArraySingleton buscaFiguraConElPunto:inicio];
} else if ( pan.state == UIGestureRecognizerStateEnded) {
//termino el pan, elimino la fogura que tuviera guardada
f=nil;
}
}
Это, что он делает, когда он начинает распознавать хлеб, ищет, где он начался, и если есть Фигура в этих координатах. Ты будешь должен сохранять в каком-то сайте, где - каждая фигура. Это у меня есть в singleton, потому что я это решил так, но ты можешь быть array в драйвере, или как ты хотел, и с этого времени я должен оставлять себе Фигуру, которую ты хочешь двинуть, так как это событие будет называться часто, так что, когда ты двинешь палец гнев из-за UIGestureRecognizerStateChanged, и именно там ты двигаешь статью в новое положение пальца, с этим ты сможешь тащить статьи из-за экрана и они останутся, где ты поднял палец. Я в моем случае всегда использовал тот же тип, который является Фигурой.
Я надеюсь, что то, что ты искал, и, что он подал тебя