How to resize UIView by dragging from its edges?

后端 未结 6 1144
-上瘾入骨i
-上瘾入骨i 2020-11-28 21:29

In my iPad app, I want the users to be able to resize a UIView by dragging the view from its edges. I\'ll be using iOS 5 SDK, so what\'s the cleanest approach t

6条回答
  •  醉酒成梦
    2020-11-28 21:37

    I updated above code using enum.

    class ResizableView: UIView {
    
        enum Edge {
            case topLeft, topRight, bottomLeft, bottomRight, none
        }
    
        static var edgeSize: CGFloat = 44.0
        private typealias `Self` = ResizableView
    
        var currentEdge: Edge = .none
        var touchStart = CGPoint.zero
    
        override func touchesBegan(_ touches: Set, with event: UIEvent?) {
            if let touch = touches.first {
    
                touchStart = touch.location(in: self)
    
                currentEdge = {
                    if self.bounds.size.width - touchStart.x < Self.edgeSize && self.bounds.size.height - touchStart.y < Self.edgeSize {
                        return .bottomRight
                    } else if touchStart.x < Self.edgeSize && touchStart.y < Self.edgeSize {
                        return .topLeft
                    } else if self.bounds.size.width-touchStart.x < Self.edgeSize && touchStart.y < Self.edgeSize {
                        return .topRight
                    } else if touchStart.x < Self.edgeSize && self.bounds.size.height - touchStart.y < Self.edgeSize {
                        return .bottomLeft
                    }
                    return .none
                }()
            }
        }
    
        override func touchesMoved(_ touches: Set, with event: UIEvent?) {
            if let touch = touches.first {
                let currentPoint = touch.location(in: self)
                let previous = touch.previousLocation(in: self)
    
                let originX = self.frame.origin.x
                let originY = self.frame.origin.y
                let width = self.frame.size.width
                let height = self.frame.size.height
    
                let deltaWidth = currentPoint.x - previous.x
                let deltaHeight = currentPoint.y - previous.y
    
                switch currentEdge {
                case .topLeft:
                    self.frame = CGRect(x: originX + deltaWidth, y: originY + deltaHeight, width: width - deltaWidth, height: height - deltaHeight)
                case .topRight:
                    self.frame = CGRect(x: originX, y: originY + deltaHeight, width: width + deltaWidth, height: height - deltaHeight)
                case .bottomRight:
                    self.frame = CGRect(x: originX, y: originY, width: width + deltaWidth, height: height + deltaWidth)
                case .bottomLeft:
                    self.frame = CGRect(x: originX + deltaWidth, y: originY, width: width - deltaWidth, height: height + deltaHeight)
                default:
                    // Moving
                    self.center = CGPoint(x: self.center.x + currentPoint.x - touchStart.x,
                                          y: self.center.y + currentPoint.y - touchStart.y)
                }
            }
        }
    
        override func touchesEnded(_ touches: Set, with event: UIEvent?) {
            currentEdge = .none
        }
    }
    

    currentEdge saves state of touch position of user.

提交回复
热议问题