2012-03-05 10 views
4

私はカスタムスクロールビューを持ち、UIScrollViewをサブクラス化しています。 viewcontroller nibファイルにスクロールビューを追加し、そのクラスをCustomScrollViewに変更しました。さて、このカスタムスクロールビュー(xibから作成)は、self.viewのサブビューとして追加されます。UIScrollView内に配置されたUIViewで呼び出されないメソッドに触れます

このスクロールビューでは、xibから3つのテキストフィールドと1つのUIImageView(signImageViewという名前)が追加されています。 UIImageViewTapGestureRecogniserを追加)をクリックすると、カスタムスクロールビューにsignViewというUIViewが追加されます。私は、ユーザーが、このビューに署名できるようにしたい、だから私はUIViewをサブクラス、クラスSignature.mと.Hを作成し、タッチ方式(touchesBegan、touchesMovedとtouchesEnded)を実装し、次のようにsignViewを初期化している:

signView = [[Signature alloc]initWithFrame:signImageView.frame]; 
    [customScrollView addSubview:signView]; 

しかし、signViewで署名を開始すると、ビューがスクロールされ、touchメソッドが呼び出されません。

カスタムスクロールビューの代わりにself.viewにsignViewを追加しようとしましたが、その場合、スクロールを開始するときにビューが固定位置に接着されたままになります。

答えて

7

scrollViewNOdelaysContentTouchesYEScanCancelContentTouchesを設定してみてください。

EDIT:

私は似質問が(答えはまったく同じです)Drag & sweep with Cocoa on iPhoneここに答えたことがわかります。

ユーザー(約0.3〜0.5秒)signViewをタップ-N-保持している場合touchesEnded:が呼び出されるまで、ビューのtouchesBegan:方法はsignViewに発射し、外出先でのその瞬間からすべてのイベントを取得します。

ユーザーがsignViewをすばやくスワイプすると、UIScrollViewが引き継ぎます。すでにUIViewが実装touchesBegan:方法でサブクラス化していますので

は、多分あなたは何とか彼が(「緑色の光」と同等)を署名するために、あなたのアプリが用意され、ユーザに知らせることができます。

touchesEnded:を使用して、緑色のライトをオフにすることもできます。

あなたが(代わりにcustomScrollViewへの)signViewsubViewなどとしてsignImageViewを追加し、touchesBegan:が発射されたときにそれを隠す場合、それは良いかもしれません)。 signViewcustomScrollviewに追加する場合は、代わりにsignImageViewを既存のコードに追加します。

このようにすれば、効果的にタッチパネルの効率を上げるために、その場所にsubViewが有効に1つだけ存在することになります。このアプリ-行動(0.3-0.5s遅延)が受け入れられない場合、あなたは、あなたがまたUIScrollViewをサブクラス化する必要があると思いtouchesBegan:/touchesEnded:

における非隠れsignImageViewによってその緑色の光効果を達成することができました。 VigneshがUIScrollViewtouchesShouldBegin:を無効にする方法は、救助になる可能性があります。タッチがsignViewに入っているかどうかを検出し、すぐにそのビューに渡すことができます。

+0

Thanx rokjarc。ビューに署名しようとしたときに、ビューがスクロールされることがありますが、ビューに短い線を描画することができなかった以前の状態よりも優れています。あなたが署名をより良くする方法を知っているなら、これを達成するために必要な変更を私に提案してください。 – anshul

+0

@anshul:私はこの瞬間にマックではないので、何もテストできません。私はできるだけ早く返信します –

+0

確かに仲間....あなたの編集された答えを待っています.... Thanx a lot – anshul

3

ビューの階層にスクロールビューを追加すると、すべてのタッチが呑み込まれます。タッチが始まらない場合は、サインオンビューにタッチするには、サインオンビューにタッチする必要があります。 Thisのやり方です。

0

UIScrollViewサブクラスを使用してこれを実現しました。このサブクラスでは、提供するビューのリストに対してパンジェスチャ認識機能を無効にします。

class PanGestureSelectiveScrollView: UIScrollView { 

    var disablePanOnViews: [UIView]? 

    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
    guard let disablePanOnViews = disablePanOnViews else { 
     return super.gestureRecognizerShouldBegin(gestureRecognizer) 
    } 

    let touchPoint = gestureRecognizer.location(in: self) 
    let isTouchingAnyDisablingView = disablePanOnViews.first { $0.frame.contains(touchPoint) } != nil 

    if gestureRecognizer === panGestureRecognizer && isTouchingAnyDisablingView { 
     return false 
    } 
    return true 
    } 
}