IOS: xác minh nếu một điểm nằm trong trực tràng


141

Có cách nào để xác minh nếu một CGPointbên trong cụ thể CGRect.

Một ví dụ sẽ là: Tôi đang kéo UIImageViewvà tôi muốn xác minh xem điểm trung tâm của nó CGPointcó nằm trong điểm khác khôngUIImageView

Câu trả lời:


303

Swift 4

let view = ...
let point = ...
view.bounds.contains(point)

Mục tiêu-C

Sử dụng CGRectContainsPoint():

bool CGRectContainsPoint(CGRect rect, CGPoint point);

Thông số

  • rect Các hình chữ nhật để kiểm tra.
  • point Các điểm để kiểm tra. Giá trị trả về true nếu hình chữ nhật không rỗng hoặc rỗng và điểm nằm trong hình chữ nhật; mặt khác, sai

Một điểm được xem xét bên trong hình chữ nhật nếu tọa độ của nó nằm bên trong hình chữ nhật hoặc trên cạnh X tối thiểu hoặc Y tối thiểu.



Có thể kiểm tra CGPoint trong bối cảnh dòng (CGContext) không?
Avijit Nagare

6
trong Swift 3.0 sử dụng như: orth = frame của một khung nhìn, và sau đó isContain = orth.contains (point)
nfinfu

38

Trong Swift trông như thế này:

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

Phiên bản Swift 3:

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

Liên kết đến tài liệu . Hãy nhớ kiểm tra ngăn chặn nếu cả hai nằm trong cùng một hệ tọa độ nếu không thì cần phải chuyển đổi ( một số ví dụ )


12

Quan điểm của UIView: withEvent: có thể là một giải pháp tốt. Sẽ trả về giá trị boolean cho biết thời tiết hay không CGPoint đã cho trong trường hợp UIView bạn đang sử dụng. Thí dụ:

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

10

Trong swift bạn có thể làm điều đó như thế này:

let isPointInFrame = frame.contains(point)

"khung" là CGRect và "điểm" là CGPoint


5

Trong mục tiêu c, bạn có thể sử dụng 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{

}}

Trong 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{

    }

}

3

Rất đơn giản, bạn có thể sử dụng phương pháp sau để thực hiện loại công việc này: -

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

Trong trường hợp của bạn, bạn có thể vượt qua fantView.center dưới dạng điểm và một fantView.frame khác dưới dạng trực tiếp trong phương thức about.

Bạn cũng có thể sử dụng phương pháp này trong Phương pháp UITouch dưới đây :

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

0

Tôi đang bắt đầu tìm hiểu cách viết mã với Swift và cũng đang cố gắng giải quyết vấn đề này, đây là điều tôi nghĩ ra trên sân chơi của Swift:

// 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")
}

Nó in bên trong


0
- (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");
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.