Drag-n-Drop из UIPopoverController в другой UIView - PullRequest
5 голосов
/ 30 июня 2010

Как мне реализовать перетаскивание UIView из UIPopoverController в конец UIView.

Это - функциональность, которую Страницы предоставляют в их всплывающем окне вставки мультимедиа, где вы можете перетащить фигуру из UIPopoverController и поместить ее в основной документ.

Я на самом деле запутался с панорамированием UIGestureRecognizers и где они будут реализованы.

Спасибо

Умеров

Ответы [ 2 ]

7 голосов
/ 16 февраля 2011

Согласно документации на UIPopoverController, при представлении всплывающего окна оно отображается в специальном «окне».Из-за этого простого добавления подпредставления к контроллеру представления контента контроллера представления всплывающих окон недостаточно, чтобы иметь возможность перетаскивать представление за пределы представления контроллера представления всплывающих окон.

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

Как уже упоминалось выше, распознаватели жестов (GR) лучше всего подходят для функции перетаскивания.После изменения состояния GR на «Начало» GR будет управлять всеми касаниями, пока не будет достигнуто состояние «Завершено» или «Отменено», что делает его идеальным для перетаскивания видов между контроллерами представления и окнами:)

Пример:

@interface MySplitViewController : UISplitViewController {

    UIView *dragView;
    UIWindow *dragWindow;
}

Реализация: ПРИМЕЧАНИЕ нам не нужно вызывать "makeKeyAndVisible" в нашем окне.Нам просто нужно установить его свойство «Hidden»

От Apple в отношении метода makeKeyAndVisible: // удобство.большинство приложений вызывают это, чтобы показать главное окно и также сделать его ключевым.в противном случае используйте свойство view hidden

-(void)dragBegan{

    self.dragWindow = [[UIWindow alloc] initWithFrame:self.view.window.frame];
    [self.dragWindow addSubview:self.dragView];
    [self.dragWindow setHidden:NO];
}

Здесь мы обрабатываем состояние «Завершено» или «Отменено» в Gognure Recognizer. ПРИМЕЧАНИЕ : Важно убрать окно после завершения перетаскивания, иначе вы потеряете интерактивность пользователя с помощью представленных ниже представлений.

-(void)dragEnded{

    [self.dragView removeFromSuperview];

    [self.dragWindow setHidden:YES];
    [self.dragWindow release];

    [self.view addSubview:self.dragView];
}
6 голосов
/ 02 июля 2010

Вам приходится иметь дело с двумя контроллерами представления, один из которых находится в фоновом режиме, называемый mainController, и один, представленный с использованием UIPopoverViewController, называемый popoverController. Ваш popoverController может добавить UIPanGestureRecognizer к представлениям, которые пользователь может перетаскивать. Целью действия gestRecognizer может быть метод в popoverController.

Как только пользователь запускает операцию перетаскивания, ваш метод действия вызывается с параметром gestRecognizer в качестве аргумента, где состояние gestRecognizer равно UIGestureRecognizerStateBegan. Вы могли бы затем сохранить текущий кадр представления, чтобы иметь возможность анимировать его обратно, когда сбой не удастся. Возможно, потребуется переместить представление в другое суперпредставление (например, в окно), потому что я не уверен, что UIPopoverViewController clipsToBounds его представления.

Когда пользователь перетаскивает, ваш метод действия вызывается снова и снова с gestRecognizer в состоянии UIGestureRecognizerStateChanged. Используйте метод translationInView: для UIPanGestureRecognizer, чтобы определить, насколько пользователь перетянул, и соответственно обновите центр / кадр / преобразование перетаскиваемых изображений.

Как только пользователь поднимает палец, последний раз вызывается метод действия с состоянием gestRecoginzers, установленным на UIGestureRecognizerStateEnded. Теперь пришло время узнать, было ли перетаскивание успешным. Например, popoverController может запросить mainController через делегирование, есть ли цель перетаскивания под текущей позицией представлений, если это так, mainController может предпринять действие, иначе popoverController будет анимировать перетаскиваемое представление обратно в исходное состояние и добавить его обратно подвид его мнению.

Надеюсь, это как-то понятно и полезно.

...