uiview - IOS: verify if a point is inside a rect


Translate

Is there a way to verify if a CGPoint is inside a specific CGRect.

An example would be: I'm dragging a UIImageView and I want to verify if its central point CGPoint is inside another UIImageView



All Answers
  • Translate

    Swift

    Use CGRect.contains(_: CGPoint):

    let rect = ...
    let point = ...
    rect.containsPoint(point)
    

    Objective-C

    Use CGRectContainsPoint():

    bool CGRectContainsPoint(CGRect rect, CGPoint point);

    Parameters

    • rect The rectangle to examine.
    • point The point to examine. Return Value true if the rectangle is not null or empty and the point is located within the rectangle; otherwise, false.

    A point is considered inside the rectangle if its coordinates lie inside the rectangle or on the minimum X or minimum Y edge.


  • Translate

    In Swift that would look like this:

    let point = CGPointMake(20,20)
    let someFrame = CGRectMake(10,10,100,100)
    let isPointInFrame = CGRectContainsPoint(someFrame, point)
    

    Swift 3 version:

    let point = CGPointMake(20,20)
    let someFrame = CGRectMake(10,10,100,100)
    let isPointInFrame = someFrame.contains(point)
    

    Link to documentation . Please remember to check containment if both are in the same coordinate system if not then conversions are required (some example)


  • Translate

    UIView's pointInside:withEvent: could be a good solution. Will return a boolean value indicating wether or not the given CGPoint is in the UIView instance you are using. Example:

    UIView *aView = [UIView alloc]initWithFrame:CGRectMake(0,0,100,100);
    CGPoint aPoint = CGPointMake(5,5);
    BOOL isPointInsideView = [aView pointInside:aPoint withEvent:nil];
    

  • Translate

    In swift you can do it like this:

    let isPointInFrame = frame.contains(point)
    

    "frame" is a CGRect and "point" is a CGPoint


  • Translate

    In objective c you can use CGRectContainsPoint(yourview.frame, touchpoint)

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UITouch* touch = [touches anyObject];
    CGPoint touchpoint = [touch locationInView:self.view];
    if( CGRectContainsPoint(yourview.frame, touchpoint) ) {
    
    }else{
    
    }}
    

    In swift 3 yourview.frame.contains(touchpoint)

     override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let touch:UITouch = touches.first!
        let touchpoint:CGPoint = touch.location(in: self.view)
        if wheel.frame.contains(touchpoint)  {
    
        }else{
    
        }
    
    }
    

  • Translate

    It is so simple,you can use following method to do this kind of work:-

    -(BOOL)isPoint:(CGPoint)point insideOfRect:(CGRect)rect
    {
        if ( CGRectContainsPoint(rect,point))
            return  YES;// inside
        else
            return  NO;// outside
    }
    

    In your case,you can pass imagView.center as point and another imagView.frame as rect in about method.

    You can also use this method in bellow UITouch Method :

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
    }
    

  • Translate

    I'm starting to learn how to code with Swift and was trying to solve this too, this is what I came up with on Swift's playground:

    // Code
    var x = 1
    var y = 2
    var lowX = 1
    var lowY = 1
    var highX = 3
    var highY = 3
    
    
    if (x, y) >= (lowX, lowY) && (x, y) <= (highX, highY ) {
        print("inside")
    } else {
        print("not inside")
    }
    

    It prints inside


  • Translate
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
                UITouch *touch = [[event allTouches] anyObject];
                CGPoint touchLocation = [touch locationInView:self.view];
                CGRect rect1 = CGRectMake(vwTable.frame.origin.x, 
                vwTable.frame.origin.y, vwTable.frame.size.width, 
                vwTable.frame.size.height);
                if (CGRectContainsPoint(rect1,touchLocation))
                NSLog(@"Inside");
                else
                NSLog(@"Outside");
        }