Drag-n-Drop из UIPopoverController в другой UIView
Как бы я реализовать перетаскивание UIView из UIPopoverController
в спину UIView
,
Это функциональность, которую Pages предоставляют в своем всплывающем окне для вставки мультимедиа, где вы можете перетащить фигуру из UIPopoverController
и поместите его в основной документ.
Я на самом деле запутался с кастрюлей UIGestureRecognizers
и где они будут реализованы.
Спасибо,
Umer
2 ответа
Вы должны иметь дело с двумя контроллерами представления, один из которых находится в фоновом режиме, называемый mainController, который представлен с использованием UIPopoverViewController
называется popoverController. Ваш popoverController может добавить UIPanGestureRecognizer
на представления, которые пользователь может перетащить. Целью действия gestRecognizer может быть метод в popoverController.
Как только пользователь начинает операцию перетаскивания, ваш метод действия вызывается с параметром gestRecognizer в качестве аргумента, где состояние UIGestureRecognizerStateBegan
, Вы могли бы затем сохранить текущий кадр представления, чтобы иметь возможность анимировать его обратно, когда сбрасывание не удастся. Возможно, потребуется переместить представление в другое суперпредставление (например, в окно), потому что я не уверен, что UIPopoverViewController clipsToBounds ограничивает его представление.
Как пользователь перетаскивает, ваш метод действия вызывается снова и снова с gestRecognizer в состоянии UIGestureRecognizerStateChanged
, Использовать translationInView:
метод на UIPanGestureRecognizer
чтобы определить, насколько сильно пользователь перетянул, и соответствующим образом обновить центр / кадр / преобразование перетаскиваемых видов
Как только пользователь поднимает палец, последний раз вызывается метод действия с состоянием gestRecoginzers, установленным в UIGestureRecognizerStateEnded
, Теперь пришло время узнать, было ли перетаскивание успешным. Например, popoverController может запросить mainController через делегирование, есть ли цель перетаскивания под текущей позицией представлений, если это так, mainController может предпринять действие, иначе popoverController будет анимировать перетаскиваемое представление обратно в исходное состояние и добавить его обратно как Подвид это мнение.
Я надеюсь, что это как-то понятно и полезно.
Согласно документации по UIPopoverController, когда представлен поповер, он представлен в специальном "окне". Из-за этого простого добавления подпредставления к контроллеру представления контента контроллера представления всплывающего окна недостаточно, чтобы иметь возможность перетаскивать представление за пределы представления контроллера представления всплывающего окна.
Самым простым решением здесь является создание собственного окна, добавление вашего перетаскиваемого вида в окно при перетаскивании. Сделайте окно видимым на время перетаскивания, а затем отпустите его, когда закончите.
Как упомянуто выше, распознаватели жестов (GR) лучше всего подходят для функции перетаскивания. Как только состояние GR изменится на "Начало", GR будет контролировать все касания, пока не будет достигнуто состояние "Завершено" или "Отменено", что делает его идеальным для перетаскивания видов между контроллерами представления и окнами:)
Пример:
@interface MySplitViewController : UISplitViewController {
UIView *dragView;
UIWindow *dragWindow;
}
Реализация:ПРИМЕЧАНИЕ. Нам не нужно вызывать makeKeyAndVisible в нашем окне. Нам просто нужно установить его скрытое свойство
От Apple в отношении метода makeKeyAndVisible: // удобство. большинство приложений вызывают это, чтобы показать главное окно и сделать его ключевым. в противном случае используйте вид скрытого свойства
-(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];
}