iPhoneФорумПрограммирование

Drag'n'Drop между NSView

#0
12:24, 11 ноя 2011

Структура(разметка) приложения:
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 она точно также не ловит события уже начавшегося касания.

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

#1
12:36, 11 ноя 2011

> сразу скажу проект не мой (и уже довольно большой) и вмешиваться в архитектуру, менять много существующего кода или подключать дополнительные модули я не хочу. Меня устраивает вариант когда я создаю кнопку и назначаю ей обработчиков событий, и я хотел бы его и оставить.
Сразу отвечу что архитектура приложения весьма часто продумана криво, и ее приходится ломать/переписывать на ходу.
Данный случай как раз этот. Конкретно для твоего случая я делал такое решение.

Вешаем на 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; // здесь свой протокол

Делегат здесь нужен для создания вида, помещения его на себя, и движения.

После отпускания соответсвенно перекидываем кнопку.

На мой взгляд, весьма удобно. Сделали так два проекта, все работает как часы. Если нужны исходники, скинь мыло в личку, вечером закину нужные файлы.

#2
12:37, 11 ноя 2011

clipsToBounds = NO; ?

#3
12:54, 11 ноя 2011

Leshik
Изображение
Тооочноооо... Гениально

#4
13:29, 11 ноя 2011

привет, можно на код взглянуть, если не жалко ))

#5
15:07, 11 ноя 2011

Leshik
> clipsToBounds = NO

kZUraX
> кнопка теряет своё событие касания (UIControlEventTouchCancel)

Неужто не теряет?

#6
15:39, 11 ноя 2011

CasDev
ну теряет, не терят, но она больше не полазет за пальцем так резво, как бало когда-то... (до removeFromSuperview)

IgorChe
неее) проект не мой, я просто разме.. его доделываю

и п.с. задачу уже закончил) спс

iPhoneФорумПрограммирование

Тема в архиве.