Переместить динамически созданные виды

Я делаю простое приложение, в котором различные виды динамически добавляются (кнопки, ползунки, метки и т. Д.) В представление контейнера.Это уже работает, но следующим шагом будет возможность переместить (перетащить) эти созданные виды чтобы разместить их в нужном месте на экране. Для этого я поместил кнопку на панели навигации с двойной функциональностью, Редактировать и Выполнить. Я не знаю, как получить это в режиме запуска, представления реагируют нормально (если это кнопка, чтобы иметь возможность сделать нажмите, если это ползунок, чтобы иметь возможность изменить его положение ...), но в режиме редактирования реагируйте только на жест Pan, чтобы иметь возможность перетаскивать их, и даже если касание было сделано, они не реагировали на свои обычные события, только на панорамирование, пока кнопка в Edit.I думал, что нужно поместить панель (UIView), которая переместится в первую позицию (.bringToFront ()), но представления ниже продолжают реагировать на прикосновение. Если я установил .userInteraction () панели в false, представления не отвечают но панель тоже ... я бы оценил любую ори ntacion. Pantalla par elegir view

Pantalla donde se añaden las vistas elegidas dinamicamente

0
задан 20.09.2016, 13:57
3 ответа

Хороший в конце концов я сделал одна 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")
}
0
ответ дан 24.11.2019, 13:21

Чтобы делать этот тип 'drags' возможно использовать UICollectionView, который позволяет двигать ячейки и в часть работать с ними, потом через boleanos уже ты показал бы, когда они могут двигаться, и когда нет.

Если не, как ты комментируешь проблему, он состоит в том, что пока ты издаешь переключатель оно например продолжает функционировать равно, для этого, может быть, ты мог бы пытаться способствования тому, чтобы пока ты был в способе редактирование объекты, которые были, не были interactuables, с switch.enabled или чем-то из этого.

0
ответ дан 24.11.2019, 13:21
  • 1
    поскольку я увидел CollectionView, это вид подмостков, но для совещаний, с этим я не думаю, что он может получать свободу движения каждого вида в любую часть view contenedora. – jose 23.09.2016, 00:01
  • 2
    С другой стороны, помещая в false enable, также он не получил бы хлеба gesture, кроме того, что совещания остаются полуудаленными, когда enable - в false и не идет, дает чувство, что не могут работать... идеальное, состоял бы в том, чтобы мочь помещать панель сверху, которую ловил tap, и мочь проверять, что вид находится внизу, беря Вашу ссылку, потом хлеб gesture был бы сделан также в этой же самой панели и вид двинулся бы в те же координаты хлеба gesture.... – jose 23.09.2016, 00:01
  • 3
    collection view мог бы быть этим view contenedora, для того, чтобы ты сделал себе идею, главный экран iphone - collection view и двигать значки и удалять их вызывает uiCollecton view. Хотя верно, что ты не хочешь использовать это, и жест enabled тебе не нравится, есть так называемое свойство и #39; userInteraction и # 39; или что-либо подобное, что аннулирует любой interacci и # 243; n с объектом, не делая прозрачного жеста Enabled. С моей точки зрения нужно избегать использовать UIViews, чтобы делать и #241; apas жестов и прозрачных слоев сверху и т.д.... – Alejandro 23.09.2016, 10:32

Прощение, но у меня не было время раньше. Я думаю, что ты хочешь смочь двигать элементы, где ты хотел внутри экрана, и которые ты подпираешь, функционируйте, когда ты делаешь 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, и именно там ты двигаешь статью в новое положение пальца, с этим ты сможешь тащить статьи из-за экрана и они останутся, где ты поднял палец. Я в моем случае всегда использовал тот же тип, который является Фигурой.

Я надеюсь, что то, что ты искал, и, что он подал тебя

0
ответ дан 24.11.2019, 13:21