Перетаскивание элементов управления в Objective C (iOS)

#objective-c #ios

#objective-c #iOS

Вопрос:

Это мой первый вопрос о переполнении стека после прочтения многих результатов поиска в Google различных проблем программирования.

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

Вот мой addButton: метод:

 -(IBAction)addButton:(id)sender{
CGRect frame = CGRectMake(5.0, 25.0, 40.0, 40.0);
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self action:@selector(moveButton:) forControlEvents:UIControlEventTouchDragInside];
[button setTitle:@"Test Button" forState:UIControlStateNormal];
button.frame = frame;
[myView addSubview:button];
  

}

И что я ввел в метод touchesMoved::

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [[event allTouches] anyObject];
CGPoint location = [touch locationInView:touch.view];
  

}

Я довольно новичок в разработке iOS, поэтому я не совсем уверен, как это решить.

Ответ №1:

Вы должны сделать вторую кнопку свойством вашего класса. Сначала объявите свойство в файле .h .m точно так же, как первое свойство было автоматически введено xCode. Затем в конце вашего примера кода добавьте self.secondButtonPropertyNameHere = кнопка;

Если это свойство класса, любой метод может задать его свойства.

Редактировать:

Вместо свойства UIButton создайте свойство NSMutableArray. Затем просто добавьте новую кнопку в массив, чтобы вы могли сохранить ссылку на них. Просто помните, что если вы перейдете к удалению одного вызова [buttonToRemove removeFromSuperview] и удалению из массива.

Редактировать (2):

Ваш первоначальный вопрос был о создании второй кнопки и ее перемещении. Свойство UIButton будет хорошо работать для этого. Потому что вы перемещаете один объект в представлении, получающем события touches *. На вашем месте я бы придерживался этого подхода, пока вы не освоитесь с событиями touches *.

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

1) В touchesBegan: вашего контроллера представления выполните итерацию по вашему массиву кнопок, чтобы увидеть, возможно ли прикосновение к одному из них, а затем отслеживайте прикосновение до вызова touchesEnded: .

2) Подкласс UIView и пусть он обрабатывает свои собственные касания * события.

Вторым гораздо проще управлять.

Редактировать (3): вам нужно будет установить [button setUserInteractionEnabled:NO] , хотите ли вы, чтобы супервизор обрабатывал события касаний * вместо кнопок.

Комментарии:

1. Это похоже на то, что я искал. Хотя одна проблема, которую я вижу, заключается в том, что, если я попытаюсь создать более одной новой кнопки одним и тем же методом, она снова установит то же свойство вместо создания нового. Есть ли какой-нибудь способ автоматически увеличивать имя свойства?

2. Редактировать в ответ на комментарий OP.

3. (Я не мог отредактировать свой предыдущий комментарий, он продолжал говорить, что я могу редактировать только каждые 5 секунд …) Я добавил его в массив, но теперь я не уверен, как его переместить. Я установил метод для TouchDragInside (и назвал его moveButton), но я не уверен, куда идти дальше. Я думаю, что мне нужно как-то использовать метод touchesMoved, но как мне передать отправителя из метода moveButton в метод touchesMoved?

4. Редактировать (2) в ответ на комментарий OP

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

Ответ №2:

Я сделал нечто подобное, но по-другому: вы можете создавать кнопки, затем перемещать их в прямоугольнике (фактически масштабированный вид более позднего реального размера), а также изменять размер с помощью 4 ползунков и других кнопок для точной настройки. Это очень просто, просто постоянно устанавливая рамку целевой кнопки на новые значения. Я не делал этого с помощью перетаскивания, потому что кнопка может стать слишком маленькой для пальца.