21909


すみません、swift及びプログラミング初心者です。  
独学でスタンプカメラアプリの作成にチャレンジしています。

現在、ViewController.swiftというファイルとは別にStamp.swiftというファイルを用意しています。  
Stamp.swiftには、下記のようなコードを書いています。

[code]

    import UIKit
    
    class Stamp: UIImageView {
        override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
            self.superview?.bringSubviewToFront(self)
        }
    
        override func touchesMoved(touches: Set, withEvent event: UIEvent?) {
            let touch = touches.first!
            let dx = touch.locationInView(self.superview).x - touch.previousLocationInView(self.superview).x
            let dy = touch.locationInView(self.superview).y - touch.previousLocationInView(self.superview).y
            self.center = CGPointMake(self.center.x+dx, self.center.y+dy)
        }
    
[/code]

Stamp.swiftでは、画面上で指を動かした時の最終的なx.y座標が取得できていると思います。  
ViewController.swiftでは、画像を移動した際の最終的なx.y座標に画像の縮小率をかける  
などをして、新たなx.y座標を求める必要があります。

Stamp.swiftで取得した、画像を移動した際の最終的なx.y座標をViewController.swiftで  
使用したいのですがどのようなコーディングをすべきなのかご教示いただけますでしょうか。  
加えまして、画面にスタンプ画像を沢山配置した場合、全てのスタンプ画像のx.y座標を一度に取得できるものなのでしょうか。  
以上、よろしくおねがいいたします。


CC BY-SA 3.0
2016-02-08T10:44:29.810
21855
2016-02-09T12:34:37.357
2016-02-08T12:29:44.413
7459
14329
question
swift xcode iphone xcode7 swift2
座標の情報を取得するにはどうしたらいいですか？


ViewControllerでどんな風にStampを管理しているのかがわからないので、subviewの中から該当するものを探して処理する方法を紹介します。

以下のような処理を、ViewControllerでStampを処理したい部分に書くことで対応できるかと思われます。

[code]

    // subviewの中からStampのものを探す
    for vi in view.subviews {
        if let stamp = vi as? Stamp {
    
            // 見つけたStampの値を使ってなにか処理
            print("center: \(stamp.center.x), \(stamp.center.y)")
        }
    }
    
[/code]

この他にも、tagを設定しておいてviewWithTag()を使う方法や、filter()を使う方法などが考えられます。


CC BY-SA 3.0
2016-02-09T09:57:28.493
21901
2016-02-09T09:57:28.493
7459
21855
answer


おそらく ViewController の中に 大量の Stamp(StampViewのほうが一般的な命名かも)がある設計だと思うので

[code]

    protocol ViewDelegate {
        func viewMoved(x,y)
    }
    
[/code]

みたいなdelegate を作って、

[code]

    class Stamp: UIImageView {
        var delegate:ViewDelegate!
    
        override func touchesEnded(touches: Set, withEvent event: UIEvent?) {
            delegate.viewMoved(self,x,y)  // delegate に通知
        }
        :
        :
    }
    
    
    class ViewController: SuperClass, ViewDelegate{
    
        func viewMoved(stamp, x,y){
            // Stamp が移動し終わったらここに処理が来る
        }   
    }
    
[/code]

という感じでしょうか。ViewController にすべてのStampインスタンス配列をもたせるといろいろと便利かもしれませんね。


CC BY-SA 3.0
2016-02-09T12:27:48.583
21909
2016-02-09T12:34:37.357
2016-02-09T12:34:37.357
3457
3457
21855
answer