2011-12-14 9 views
1

テキストフィールド(またはそれに似ているもの)を数値で作るにはどうしたらいいですか?タッチしたり指をスワイプして増減できます増加)または減少(減少)。iPhone - スワイプに応答する浮動小数点数のテキストフィールドを作成する

どのように動作するのですか:0.0のtexfieldがあります。あなたはそれに触れ、指を下に動かします。次に、指をさらに動かすと値が減少するのがわかります。指の動きを止めると、値は変わりません。

これはObjective-Cでどうすればできますか?

+0

/透明隠されている 'UISlider'は、トリック – jrturton

+0

を行う必要があります。しかし、それはwithiからのみ触れることができるだろうnテキストフィールド(またはビュー?)は、それも可能ですか?私はそれがインターフェイスの残りの部分と干渉しないようにしたいので、 – laarsk

答えて

2

この回答はかなり大きいので、私はgithubにサンプルコードを入れることにしました。

複数のラベルに対応するには、まずUILabelのサブクラスを作成し、draggingというプロパティを追加します。私たちはクラスDragLabelを呼ぶのが大好きです。

DragLabel.h

#import <Foundation/Foundation.h> 

@interface DragLabel : UILabel { 
    BOOL dragging; 
} 

@property (assign) BOOL dragging; 

@end 

DragLabel.m

#import "DragLabel.h" 

@implementation DragLabel 
@synthesize dragging; 

@end 

Interface Builderの

今あなたが必要IBのビューに3つのラベルをドラッグし、すべてのクラスをDragLabelに変更します。アウトレットを作成する前に、の前にを作成してください。

Class Change in IB

これを実行した後、あなたの.mと.hのまでのすべてのコンセントをフック。私の例では、label1、label2、label3の名前を付けました。


ここでラベルクラスとインターフェイスが設定され、ビューコントローラのコードを記述する時間があります。

Controller.hは次のようになります。私は次のようになります。 ​​

あなたController.m DragViewController.h

それ と呼ばれます。私はそれをDragViewControllerと呼んだ。メートル

#import "DragViewController.h" 

@implementation DragViewController 
@synthesize label1; 
@synthesize label2; 
@synthesize label3; 

- (void)dealloc 
{ 
    [label1 release]; 
    [label2 release]; 
    [label3 release]; 
    [draglabels release]; 
    [super dealloc]; 
} 

- (void)viewDidLoad 
{ 
    draglabels = [[NSArray alloc] initWithObjects:label1, label2, label3, nil]; 
    for (DragLabel *label in draglabels) { 
     label.dragging = NO; 
    } 

    [super viewDidLoad]; 
} 

- (void)movedLabel:(DragLabel *)label touchloc:(CGPoint)touchloc { 
    float val = (label.center.y - touchloc.y)/10; 
    label.text = [NSString stringWithFormat:@"%g",val]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    CGPoint touchloc = [[touches anyObject] locationInView:self.view]; 
    for (DragLabel *label in draglabels) { 
     if (CGRectContainsPoint(label.frame, touchloc)) { 
      label.dragging = YES; 
      [self movedLabel:label touchloc:touchloc]; 
     } 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    for (DragLabel *label in draglabels) { 
     if (label.dragging) { 
      CGPoint touchloc = [[touches anyObject] locationInView:self.view]; 
      [self movedLabel:label touchloc:touchloc]; 
     } 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    for (DragLabel *label in draglabels) { 
     label.dragging = NO; 
    } 
} 

- (void)viewDidUnload 
{ 
    [self setLabel1:nil]; 
    [self setLabel2:nil]; 
    [self setLabel3:nil]; 
    [super viewDidUnload]; 
} 

@end 

一つ、それはこのような再実装movedLabel、ユーザーがラベルの上にドラッグした場合にのみ、0から1の範囲にあるように、規模を調整する最後のもの

- (void)movedLabel:(DragLabel *)label touchloc:(CGPoint)touchloc { 
    float ydif = label.center.y-touchloc.y; 
    float maxheight = 100; 
    if (ydif > 0) { 
     if (ydif <= maxheight) label.text = [NSString stringWithFormat:@"%g",ydif/maxheight]; 
     else label.text = [NSString stringWithFormat:@"%g",maxheight]; 
    } 
    else label.text = @"0.0"; 
} 
+0

これは本当に良いようですが、3つのテキストフィールドでも可能でしょうか? – laarsk

+0

驚くばかり!ありがとうございました! – laarsk

+0

うーん、それは私に与え続けます:宣言されていない識別子 'ラベル'の使用... また、私はどのようにUILabelをサブクラス化するのですか?私はそれをする方法がわかりません...私はそれが 'UILabel * MyLabel = [[UILabel alloc] init];のようなものでなければならないと思います。 – laarsk

関連する問題