¿Cómo cambiar el tamaño de UIView arrastrando desde sus bordes?

En mi aplicación iPad, quiero que los usuarios puedan cambiar el tamaño de una UIView arrastrando la vista desde sus bordes. Usaré el SDK de iOS 5, ¿cuál es el enfoque más limpio para hacer esto? ¿Hay alguna alternativa para lograr esto sin tener que lidiar con touchesBegan, touchesMoved, … etc?

Supongo que su interfaz de usuario implica algún tipo de identificadores en los lados de la vista, y adjuntar un UIPanGestureRecognizer simple a los controles de control hace que todo el problema sea bastante fácil.

En el método de acción del gestor reconocedor, simplemente obtenga -translationInView: relación con la vista que está networkingimensionando, guarde el marco original cuando el estado del reconocedor de gestos sea UIGestureRecognizerStateBegan , y ajuste el marco de la vista continuamente mientras el estado sea UIGestureRecognizerStateChanged .

Puede hacer esto marcando el punto de inicio táctil. Si golpea una de sus cuatro esquinas puede cambiar el tamaño en function de la distancia entre ese punto de inicio de toque y el punto de toque actual. (Si el punto de inicio táctil no llegó a una esquina, simplemente moveremos la vista en lugar de cambiar el tamaño).

Defina el tamaño de sus esquinas arrastrables.

 CGFloat kResizeThumbSize = 45.0f; 

Agregue estas variables de instancia a su class para realizar un seguimiento del estado del tacto y de qué manera networkingimensionamos.

 @interface MY_CLASS_NAME : UIView { BOOL isResizingLR; BOOL isResizingUL; BOOL isResizingUR; BOOL isResizingLL; CGPoint touchStart; } 

Maneje los events de inicio / cambio de toque.

 - (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 && self.bounds.size.height - touchStart.y < kResizeThumbSize); isResizingUL = (touchStart.x <kResizeThumbSize && touchStart.y <kResizeThumbSize); isResizingUR = (self.bounds.size.width-touchStart.x < kResizeThumbSize && touchStart.y<kResizeThumbSize); isResizingLL = (touchStart.x <kResizeThumbSize && 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]; CGFloat deltaWidth = touchPoint.x - previous.x; CGFloat deltaHeight = touchPoint.y - previous.y; // get the frame values so we can calculate changes below CGFloat x = self.frame.origin.x; CGFloat y = self.frame.origin.y; CGFloat width = self.frame.size.width; CGFloat height = self.frame.size.height; if (isResizingLR) { self.frame = CGRectMake(x, y, touchPoint.x+deltaWidth, touchPoint.y+deltaWidth); } else if (isResizingUL) { self.frame = CGRectMake(x+deltaWidth, y+deltaHeight, width-deltaWidth, height-deltaHeight); } else if (isResizingUR) { self.frame = CGRectMake(x, y+deltaHeight, width+deltaWidth, height-deltaHeight); } else if (isResizingLL) { self.frame = CGRectMake(x+deltaWidth, y, width-deltaWidth, height+deltaHeight); } else { // not dragging from a corner -- move the view self.center = CGPointMake(self.center.x + touchPoint.x - touchStart.x, self.center.y + touchPoint.y - touchStart.y); } } 

Versión rápida de la solución @Prerna Chavan, la solución Prerna no detecta si el usuario toca bordes, solo detecta esquinas, sin embargo, el código debajo detecta todos

 class OverlayView: UIView { /* // Only override draw() if you perform custom drawing. // An empty implementation adversely affects performance during animation. override func draw(_ rect: CGRect) { // Drawing code } */ static var kResizeThumbSize:CGFloat = 44.0 private typealias `Self` = OverlayView var imageView = UIImageView() var isResizingLeftEdge:Bool = false var isResizingRightEdge:Bool = false var isResizingTopEdge:Bool = false var isResizingBottomEdge:Bool = false var isResizingBottomRightCorner:Bool = false var isResizingLeftCorner:Bool = false var isResizingRightCorner:Bool = false var isResizingBottomLeftCorner:Bool = false //Define your initialisers here override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { let currentPoint = touch.location(in: self) isResizingBottomRightCorner = (self.bounds.size.width - currentPoint.x < Self.kResizeThumbSize && self.bounds.size.height - currentPoint.y < Self.kResizeThumbSize); isResizingLeftCorner = (currentPoint.x < Self.kResizeThumbSize && currentPoint.y < Self.kResizeThumbSize); isResizingRightCorner = (self.bounds.size.width-currentPoint.x < Self.kResizeThumbSize && currentPoint.y < Self.kResizeThumbSize); isResizingBottomLeftCorner = (currentPoint.x < Self.kResizeThumbSize && self.bounds.size.height - currentPoint.y < Self.kResizeThumbSize); isResizingLeftEdge = (currentPoint.x < Self.kResizeThumbSize) isResizingTopEdge = (currentPoint.y < Self.kResizeThumbSize) isResizingRightEdge = (self.bounds.size.width - currentPoint.x < Self.kResizeThumbSize) isResizingBottomEdge = (self.bounds.size.height - currentPoint.y < Self.kResizeThumbSize) // do something with your currentPoint } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { let currentPoint = touch.location(in: self) // do something with your currentPoint } } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { let currentPoint = touch.location(in: self) // do something with your currentPoint isResizingLeftEdge = false isResizingRightEdge = false isResizingTopEdge = false isResizingBottomEdge = false isResizingBottomRightCorner = false isResizingLeftCorner = false isResizingRightCorner = false isResizingBottomLeftCorner = false } }