#objective-c #cocoa-touch #ios #uiview
#objective-c #cocoa-touch #iOS #пользовательский интерфейс
Вопрос:
Мне нужно добавить маркеры (в углы) представления, чтобы пользователь мог изменять размер этого представления с их помощью. Что-то похожее на редактирование графики в приложениях Apple ‘pages’ или ‘keynote’. (или в любом другом графическом приложении). Я пытался добавить дескрипторы вложенных представлений к заданному представлению, но эти представления получили касания только в том месте, где оба перекрываются, внутри заданных границ представления. Мне нужно иметь возможность перетаскивать любые угловые маркеры, которые изменят рамку или границы данного вида. (над этой частью я уже работаю).
любые предложения, руководства, ссылки будут оценены 🙂
Я новичок, поэтому не могу: (размещать изображения, поэтому, пожалуйста, взгляните на ссылку
Ответ №1:
Я бы создал UIGripView, который наследуется от UIView, который находится поверх нужного вам представления.
Это было бы:
- Получить представление для манипулирования и соответствующего размера (немного больше, но с тем же центром)
- Нарисовать себя (ручки и границы) — реализовать
-(void) drawRect:(CGRect)rect
- Зарегистрируйте распознаватели жестов
- При перемещении ручки измените размер базового вида и себя соответственно
- Когда центр перемещается, переместите центр базового вида и себя.
Возможно, вам будет проще работать с жестами, если вы также сделаете каждый захват UIView, но нетрудно создать несколько зон в вашем представлении и проверить, в какой из них находится касание.
(Не забудьте сделать сенсорные зоны достаточно большими)
Комментарии:
1.Я тоже пробовал этот подход, но с этим методом есть другая проблема. Когда я добавляю вложенные просмотры в (допустим) resizableView и пытаюсь изменить его размер с помощью ‘gripview’, все вложенные просмотры перепутались. примеры до и после изменения размера с помощью ‘gripView’imageshack.us/photo/my-images/29/beforey.png imageshack.us/photo/my-images/560/afterv.png
2. Я не представлял себе взаимосвязь вложенного представления между видом захвата и другим представлением. Я бы хотел, чтобы у них был один и тот же родительский элемент и просто обновил центры и размеры обоих в распознавателе жестов.
Ответ №2:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [[event allTouches] anyObject];
touchStart = [[touches anyObject] locationInView:self];
isResizingLR = (self.bounds.size.width - touchStart.x < kResizeThumbSize amp;amp; self.bounds.size.height - touchStart.y < kResizeThumbSize);
isResizingUL = (touchStart.x <kResizeThumbSize amp;amp; touchStart.y <kResizeThumbSize);
isResizingUR = (self.bounds.size.width-touchStart.x < kResizeThumbSize amp;amp; touchStart.y<kResizeThumbSize);
isResizingLL = (touchStart.x <kResizeThumbSize amp;amp; self.bounds.size.height -touchStart.y <kResizeThumbSize);
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
CGPoint touchPoint = [[touches anyObject] locationInView:self];
CGPoint previous=[[touches anyObject]previousLocationInView:self];
float deltaWidth = touchPoint.x-previous.x;
float deltaHeight = touchPoint.y-previous.y;
if (isResizingLR) {
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y,touchPoint.x deltaWidth, touchPoint.y deltaWidth);
}
if (isResizingUL) {
self.frame = CGRectMake(self.frame.origin.x deltaWidth, self.frame.origin.y deltaHeight, self.frame.size.width - deltaWidth, self.frame.size.height - deltaHeight);
}
if (isResizingUR) {
self.frame = CGRectMake(self.frame.origin.x ,self.frame.origin.y deltaHeight, self.frame.size.width deltaWidth, self.frame.size.height - deltaHeight);
}
if (isResizingLL) {
self.frame = CGRectMake(self.frame.origin.x deltaWidth ,self.frame.origin.y , self.frame.size.width - deltaWidth, self.frame.size.height deltaHeight);
}
if (!isResizingUL amp;amp; !isResizingLR amp;amp; !isResizingUR amp;amp; !isResizingLL) {
self.center = CGPointMake(self.center.x touchPoint.x - touchStart.x,self.center.y touchPoint.y - touchStart.y);
}
}