Структура(разметка) приложения:
NSViewController как основное окно (xib), в нем ImageView на всю площадь экрана и ScrollView полосой внизу экрана(по глубине выше ImageView) и , и внутри ScrollView размещаются кнопочки, которые прокручиваются и их нужно выбирать.
Задача сделать эти кнопочки перетягиваемыми из ScrollView на ImageView.
Я уже сделал удобное перетаскивание через отлавливание событий кнопки
[button addTarget:self action:@selector(buttonMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
оно работает идеально.
Только проблема в том, что кнопка рисуется внутри ScrollView контрола, и когда я тащу ее вверх на ImageView она становится невидимой т.к. выходит за рамки(bounds) родительского View. Вторая часть проблемы состоит в том, что когда я меняю родителя кнопки например на NSViewController.view(что б она рисовалась выше всех элементов) кнопка теряет своё событие касания (UIControlEventTouchCancel). Т.е. я продолжаю двигать пальцем, но кнопка на него уже не реагирует, она остается на своем месте в новом NSView. Что б она сново схватилась мне приходится делать новое какание на кнопке.
Еще если я просто создаю новую кнопку во время касания в NSViewController.view она точно также не ловит события уже начавшегося касания.
сразу скажу проект не мой (и уже довольно большой) и вмешиваться в архитектуру, менять много существующего кода или подключать дополнительные модули я не хочу. Меня устраивает вариант когда я создаю кнопку и назначаю ей обработчиков событий, и я хотел бы его и оставить.
> сразу скажу проект не мой (и уже довольно большой) и вмешиваться в архитектуру, менять много существующего кода или подключать дополнительные модули я не хочу. Меня устраивает вариант когда я создаю кнопку и назначаю ей обработчиков событий, и я хотел бы его и оставить.
Сразу отвечу что архитектура приложения весьма часто продумана криво, и ее приходится ломать/переписывать на ходу.
Данный случай как раз этот. Конкретно для твоего случая я делал такое решение.
Вешаем на scrollView наследник UIControl'а, у которого переопределяем методы
- (void)touchesBegan:( NSSet *)touches withEvent:( UIEvent *)event; - ( void)touchesCancelled:( NSSet *)touches withEvent:( UIEvent *)event; - ( void)touchesEnded:( NSSet *)touches withEvent:( UIEvent *)event; - ( void)touchesMoved:( NSSet *)touches withEvent:( UIEvent *)event; @property ( nonatomic, assign) id <TouchableViewDelegate> delegate; // здесь свой протокол
Делегат здесь нужен для создания вида, помещения его на себя, и движения.
После отпускания соответсвенно перекидываем кнопку.
На мой взгляд, весьма удобно. Сделали так два проекта, все работает как часы. Если нужны исходники, скинь мыло в личку, вечером закину нужные файлы.
clipsToBounds = NO; ?
Leshik
Тооочноооо... Гениально
привет, можно на код взглянуть, если не жалко ))
Leshik
> clipsToBounds = NO
kZUraX
> кнопка теряет своё событие касания (UIControlEventTouchCancel)
Неужто не теряет?
CasDev
ну теряет, не терят, но она больше не полазет за пальцем так резво, как бало когда-то... (до removeFromSuperview)
IgorChe
неее) проект не мой, я просто разме.. его доделываю
и п.с. задачу уже закончил) спс
Тема в архиве.