#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 ползунков и других кнопок для точной настройки. Это очень просто, просто постоянно устанавливая рамку целевой кнопки на новые значения. Я не делал этого с помощью перетаскивания, потому что кнопка может стать слишком маленькой для пальца.