Изменение размера uiview из его углов - PullRequest
2 голосов
/ 03 января 2012

Как изменить размер uiview, используя касания по углам uiview. Например, его левый верхний угол касается и перетаскивается вверх, его координата y и высота должны увеличиваться; если перетаскивать нижний правый угол, то его начало должно быть таким же, но высота и ширина должны быть изменены.

Ответы [ 2 ]

4 голосов
/ 03 января 2012

Вы можете сделать это, изменив точку привязки view.layer.

Вы можете прочитать об этом здесь: Геометрия слоя

Чтобы получить углы UIView, вы можетеиспользуйте -

CGRect topLeftCorner = CGRectMake(CGRectGetMinX(self.view),CGRectGetMinY(self.view),20,20); //Will define the top-left corner of the view with 20 pixels inset. you can change the size as you wish.

CGRect topRightCorner  =  CGRectMake(CGRectGetMaxX(self.view),CGRectGetMinY(self.view),20,20); //Will define the top-right corner.

CGRect bottomRightCorner  =   CGRectMake(CGRectGetMinX(self.view),CGRectGetMaxY(self.view),20,20); //Will define the bottom-right corner.

CGRect bottomLeftCorner  = CGRectMake(CGRectGetMinX(self.view),CGRectGetMinY(self.view),20,20); //Will define the bottom-left corner.

Тогда вы можете щеку, если точка касания находится внутри одного из углов.и установите layer.anchorPoint в соответствии с

  BOOL isBottomLeft =  CGRectContainsPoint(bottomLeftCorner, point);
  if(isLeft) view.layer.anchorPoint = CGPoint(0,0);
   //And so on for the others (off course you can optimize this code but I wanted to make the explanation simple).

Затем, когда вы измените размер представления, он изменит размер от точки привязки.

Удачи

1 голос
/ 03 января 2012

#define TOUCH_OFFSET 20 //distance from rectangle edge where it can be touched

UITouch* touch = [... current touch ...];

CGRect rectagle = [... our rectangle ... ];
CGPoint dragStart = [touch previousLocationInView:self.view];
CGPoint dragEnd = [touch locationInView:self.view];

//this branch is not necessary if we let users resize the rectangle when they tap its border from the outside
if (!CGRectContainsPoint(rectangle, dragStart)) {
  return;
}

if (abs(dragStart.x - CGRectGetMinX(rectangle)) < TOUCH_OFFSET) {
   //modify the rectangle appropiately, e.g.
   rectangle.origin.x += (dragEnd.x - dragStart.x);
   rectangle.size.width -= (dragEnd.x - dragStart.x);

   //TODO: you have to handle situation when width is zero or negative - flipping the rectangle or giving it a minimum width
}
else if (abs(dragStart.x - CGRectGetMaxX(rectangle)) < TOUCH_OFFSET) {
}

if (abs(dragStart.y - CGRectGetMinY(rectangle)) < TOUCH_OFFSET) {
}
else if (abs(dragStart.y - CGRectGetMaxY(rectangle)) < TOUCH_OFFSET) {
}

...