2016-10-06 6 views
1

私はiOSで新しく、私はビューでサインするための問題に直面しています。私は図に示すSign.Asのビューを作成した enter image description hereObjective cのUIViewのタッチでScrollViewを無効にして有効にする方法

enter image description here

しかし、ScrollViewでビューを追加したときにサインオンできませんでした。私の質問は、ビュータッチでスクロールビューを無効にする方法です。私はこのリンクと同じコードを使用しました How to draw Signature on UIView答えはuser3182143です。あなたがlabelまたはviewまたは直接何scrollview上のように、すべてのコントロールを追加するべきではありません事前

+0

あなたは自動レイアウト使用していますか? – Lion

+0

@Lionはい私はAutolayoutを使用しています。 – Muju

+0

スクロールビューと署名ビューの制約は何ですか? – Lion

答えて

1

ここでお聞きしたところで回答を試みました。

私はビュー内にスクロールを設定しました。その後、ビューに書き込もうとしましたが、できませんでした。今それは動作します。

SignatureDrawView.h

#import <UIKit/UIKit.h> 

@interface SignatureDrawView : UIView 

@property (nonatomic, retain) UIGestureRecognizer *theSwipeGesture; 
@property (nonatomic, retain) UIImageView *drawImage; 
@property (nonatomic, assign) CGPoint lastPoint; 
@property (nonatomic, assign) BOOL mouseSwiped; 
@property (nonatomic, assign) NSInteger mouseMoved; 




- (void)erase; 
- (void)setSignature:(NSData *)theLastData; 
- (BOOL)isSignatureWrite; 

@end 

SignatureDrawView.m

#import "SignatureDrawView.h" 

@implementation SignatureDrawView 

@synthesize theSwipeGesture; 
@synthesize drawImage; 
@synthesize lastPoint; 
@synthesize mouseSwiped; 
@synthesize mouseMoved; 

#pragma mark - View lifecycle 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
    // Initialization code 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder*)coder 
{ 
    if ((self = [super initWithCoder:coder])) 
    { 
     drawImage = [[UIImageView alloc] initWithImage:nil]; 
     drawImage.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
     [self addSubview:drawImage]; 
     self.backgroundColor = [UIColor whiteColor]; 
     mouseMoved = 0; 


    } 
    return self; 
} 

#pragma mark touch handling 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
for (UITouch *touch in touches) 
{ 
    NSArray *array = touch.gestureRecognizers; 
    for (UIGestureRecognizer *gesture in array) 
    { 
     if (gesture.enabled & [gesture isMemberOfClass:[UISwipeGestureRecognizer class]]) 
     { 
      gesture.enabled = NO; 
      self.theSwipeGesture = gesture; 
     } 
     } 
    } 

    mouseSwiped = NO; 
    UITouch *touch = [touches anyObject]; 

    lastPoint = [touch locationInView:self]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"stopscroll" object:self]; 

} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    mouseSwiped = YES; 

    UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:self]; 

    UIGraphicsBeginImageContext(self.frame.size); 
    [drawImage.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    lastPoint = currentPoint; 

    mouseMoved++; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"stopscroll" object:self]; 


    if (mouseMoved == 10) { 
    mouseMoved = 0; 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if(!mouseSwiped) 
    { 
     UIGraphicsBeginImageContext(self.frame.size); 
     [drawImage.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
     CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
     CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0); 
     CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); 
     CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
     CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
     CGContextStrokePath(UIGraphicsGetCurrentContext()); 
     CGContextFlush(UIGraphicsGetCurrentContext()); 
     drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
    } 
    self.theSwipeGesture.enabled = YES; 
    mouseSwiped = YES; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"stopscroll" object:self]; 

} 

#pragma mark Methods 

- (void)erase 
{ 
    mouseSwiped = NO; 
    drawImage.image = nil; 
} 

- (void)setSignature:(NSData *)theLastData 
{ 
    UIImage *image = [UIImage imageWithData:theLastData]; 
    if (image != nil) 
    { 
     drawImage.image = [UIImage imageWithData:theLastData]; 
     mouseSwiped = YES; 
    } 
} 

- (BOOL)isSignatureWrite 
{ 
    return mouseSwiped; 
} 

@end 

私が上記に追加して、私はview.Itがある上、私は署名に触れたときにスクロールを停止するためのポストの通知を作成しただけですstart、moving、endメソッドで実装されています。

[[NSNotificationCenter defaultCenter] postNotificationName:@ "stopscroll" 対象:自己];

SignatureDrawView.m

のViewControllerの次の私はUIViewのでscrollViewとUIImageViewを作成しました。上記viewDidLoadメソッドで

ViewController.h

#import <UIKit/UIKit.h> 
#import "SignatureDrawView.h" 

@interface ViewController : UIViewController 

@property (strong, nonatomic) IBOutlet UIScrollView *scroll; 

@property (strong, nonatomic) IBOutlet SignatureDrawView *drawSignView; 

@property (strong, nonatomic) IBOutlet UITextField *txtFldDesc; 

- (IBAction)actionSave:(id)sender; 

- (IBAction)actionClear:(id)sender; 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

@synthesize drawSignView,scroll,txtFldDesc; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
    scroll.contentSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height+200); 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopScroll:) name:@"stopscroll" object:nil]; 
} 

- (void)stopScroll:(NSNotification *)notification 
{ 
    if([[notification name] isEqualToString:@"stopscroll"]) 
     scroll.scrollEnabled = NO; 
} 

- (void)didReceiveMemoryWarning { 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 

- (IBAction)actionSave:(id)sender 
{ 
    scroll.scrollEnabled = YES; 
    // code for save the signature 
    UIGraphicsBeginImageContext(self.drawSignView.bounds.size); 
    [[self.drawSignView.layer presentationLayer] renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    NSData *postData = UIImageJPEGRepresentation(viewImage, 1.0); 
    ....Then do your stuff to save this in DB or server 
} 
- (IBAction)actionClear:(id)sender 
{ 
    scroll.scrollEnabled = YES; 
    //code for clear the signature 
    [self.drawSignView erase]; 
} 
@end 

IストップスクロールにaddObserverを追加しました。

[NSNotificationCenter defaultCenter] addObserver:自己 セレクタ:@selector(stopScroll :)名: "stopscroll" オブジェクト@:なし]。

は最後に、私はstopScroll:方法

を実施しても、私はactionSavescroll.scrollEnabled = YESactionclear方法

を設定し、私は私が試したし、うまくいった後にのみ、あなたのソリューションを与えました。

私のコードを確認し、適用してください。これは完璧に動作します。

出力結果

enter image description here

+0

SignatureViewをScrollViewに追加しました。あなたのコードは機能しません。 – Muju

+0

スクロールビューをシグネチャビューに追加します。 – user3182143

+0

私はスクロールで署名のビューを追加する必要があります。 – Muju

0

感謝。

あなたはscrollviewにし、あなたのsignature viewのようなあなたのすべてのラベルやビューを追加する必要がありますUIViewその上最初のUIViewを追加する必要があります。 top,bottom,leading,trailing, fixed height and center x (horizontally in container) - - これはあなたが水平scrolviewをしたい場合は、2つの制約が異なっている必要があり、垂直スクロールビューのためである - 代わりにfixed width and center yごscrolviewのためのあなたの制約がUIVIew - view in scrollviewため

top,bottom,leading,trailing

制約する必要があります

第二の事!

次に、signature viewまたはlabelをそのビューに追加する必要があります。そのような制約は-または必要に応じて設定できます。

セットアップが上記のシナリオと一致していることを確認してください!

+0

私はスクロールビューにSignatureviewを追加しました.SignviewのクリックでScrollviewを無効にし、どこでもクリックしてスクロールビューを有効にする方法はありますか。 – Muju

+0

[http://stackoverflow.com/questions/3410777/how-can-i-programmatically-force-stop-scrolling-in-a-uiscrollview](http://stackoverflow.com/questions/3410777/how-can -i-プログラム的に強制停止して強制的にスクロール・イン・アズ・ビューに)、それを見てください!これは標準的なアプローチではありません。私は上記のように管理する必要があります。もう1つの回避策は、画面の幅と高さの幅が署名ビューに等しいビューを追加することです!それをscrollviewに追加し、その上に署名ビューを追加してください! – Lion

0

クラスにUITapGestureRecognizerを実装して、ビューにアクションを追加してスクロールビューを表示することができます。

let tap = UITapGestureRecognizer(target :self,action :"handleTap:") 
tap.delegate = self 
tap.numberOfTapsRequired = 1 
yourView.addGestureRecognizer(tap) 

これが役立ちます。

関連する問題