en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

7.19.2011

取得點擊特定 View 時的相對座標

 

Touch Panel 事件是在 iOS 上最常被使用的事件之一,在觸發事件時除了可以取得全畫面的座標位置外,也可以針對對應的 View 取得相對應的座標,而上圖就是絕對座標和相對座標的比較。

在開始之前,如果您對 Touch Panel 事件還不熟悉,可以參考 Touch Panel / 觸碰螢幕 / 壓力感應器的基本使用方式一文。

首先是產生一個 UIImageView,接下來我們要取得在點擊這個 View 時的對相應座標。

theImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0.0, 0.0, 256.0, 256.0)];
theImageView.center = CGPointMake(160.0, 340.0);
[theImageView setImage:[UIImage imageNamed:@"icon.png"]];

[self.view addSubview:theImageView];

從上述程式碼可以得知,我們將 UIImageView的大小設定在 256 x 256 大小,因此以該 View 為主所得出的座標必需在這個大小之內,以點擊畫面時所觸發的事件為例,取得座標方式的程式瑪如下。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    float x, y;

    //分別針對在一定時間量內所點擊的所有點做運算
    for (UITouch *touch in touches) {

        //取得相對應的座標
        x = [touch locationInView:theImageView].x;
        y = [touch locationInView:theImageView].y;

        //設定在view的範圍內才show出座標
        if ((x >= 0) && (x <= theImageView.frame.size.width) && (y >= 0) && (y <= theImageView.frame.size.height)) {
            NSLog(@"X: %f Y: %f", x, y);
        }
    }
}

在上述程式碼中雖然已取得相對應的座標,但是基於是對所有觸碰事件都做偵測的動作,所以座標還是有可能會出現負數,或是超過 View 大小的可能,當然除了上述這種寫法之外,也可以修改先前的文章的方法取得對應 View 的座標。

UITouch *touchs =[[event allTouches] anyObject];
NSLog(@"X: %f Y: %f", [touchs locationInView:theImageView].x, [touchs locationInView:theImageView].y);






沒有留言:

張貼留言