как изменить размер пользовательского интерфейса с помощью угловых маркеров — аналогично ‘Pages’, ‘Keynote’

#objective-c #cocoa-touch #ios #uiview

#objective-c #cocoa-touch #iOS #пользовательский интерфейс

Вопрос:

Мне нужно добавить маркеры (в углы) представления, чтобы пользователь мог изменять размер этого представления с их помощью. Что-то похожее на редактирование графики в приложениях Apple ‘pages’ или ‘keynote’. (или в любом другом графическом приложении). Я пытался добавить дескрипторы вложенных представлений к заданному представлению, но эти представления получили касания только в том месте, где оба перекрываются, внутри заданных границ представления. Мне нужно иметь возможность перетаскивать любые угловые маркеры, которые изменят рамку или границы данного вида. (над этой частью я уже работаю).

любые предложения, руководства, ссылки будут оценены 🙂

Я новичок, поэтому не могу: (размещать изображения, поэтому, пожалуйста, взгляните на ссылку

Ответ №1:

Я бы создал UIGripView, который наследуется от UIView, который находится поверх нужного вам представления.

Это было бы:

  1. Получить представление для манипулирования и соответствующего размера (немного больше, но с тем же центром)
  2. Нарисовать себя (ручки и границы) — реализовать -(void) drawRect:(CGRect)rect
  3. Зарегистрируйте распознаватели жестов
  4. При перемещении ручки измените размер базового вида и себя соответственно
  5. Когда центр перемещается, переместите центр базового вида и себя.

Возможно, вам будет проще работать с жестами, если вы также сделаете каждый захват 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);
    }
}