İOS: bir noktanın rektifteki olup olmadığını kontrol edin


141

A'nın CGPointbelirli bir içinde olup olmadığını doğrulamanın bir yolu var mı CGRect?

Bir örnek: Bir sürükleme UIImageViewve merkezi noktasının CGPointbaşka bir içinde olup olmadığını doğrulamak istiyorumUIImageView

Yanıtlar:


303

Hızlı 4

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

Objective-C

Kullanım CGRectContainsPoint():

bool CGRectContainsPoint(CGRect rect, CGPoint point);

Parametreler

  • rect İncelenecek dikdörtgen.
  • point İncelenecek nokta. Dikdörtgen null veya boş değilse ve nokta dikdörtgenin içinde bulunuyorsa true Değeri; aksi takdirde yanlış.

Koordinatları dikdörtgenin içinde veya minimum X veya minimum Y kenarındaysa, dikdörtgenin içinde bir nokta dikkate alınır.



CGPoint'in satır bağlamında (CGContext) olup olmadığını kontrol etmek mümkün mü?
Avijit Nagare

6
Swift 3.0'da şöyle kullanın: rect = görünümün çerçevesi ve sonra isContain = rect.contains (point)
nfinfu

38

Swift'te bu şöyle görünecektir:

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

Swift 3 sürümü:

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

Belgelere bağlantı . Lütfen her ikisinin de aynı koordinat sisteminde olup olmadığını kontrol etmeyi unutmayın, bu durumda dönüşümler gerekmez ( bazı örnek )


12

UIView'in noktasıInside: withEvent: iyi bir çözüm olabilir. Belirtilen CGPoint'in kullandığınız UIView örneğinde olup olmadığını gösteren bir boole değeri döndürür. Misal:

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

10

Hızlı bir şekilde bunu yapabilirsiniz:

let isPointInFrame = frame.contains(point)

"frame" bir CGRect ve "point" bir CGPoint


5

Hedef c'de CGRectContainsPoint'i (görünüm çerçeveniz, temas noktası) kullanabilirsiniz

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

}else{

}}

Hızlı 3'te yourview.frame.contains (temas noktası)

 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

Çok basit, bu tür işleri yapmak için aşağıdaki yöntemi kullanabilirsiniz: -

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

Sizin durumunuzda imagView.center'ı nokta ve başka bir imagView.frame olarak geçirebilirsiniz rect olarak about yöntemiyle .

Bu yöntemi aşağıdaki UITouch Yöntemi'nde de kullanabilirsiniz :

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

1
- (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");
    }

0

Swift ile nasıl kod yazacağımı öğrenmeye başladım ve bunu da çözmeye çalışıyordum, Swift'in oyun alanında bulduğum şey:

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

İçine yazdırır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.