iPhone - Сделать текстовое поле с плавающим числом, которое реагирует на пролистывания - PullRequest
1 голос
/ 14 декабря 2011

Как создать текстовое поле (или нечто похожее) с числом в нем, которое можно увеличить или уменьшить, коснувшись его и проведя пальцем вверх (увеличивая) или уменьшая (уменьшая).

Как это будет работать: есть текстовое поле с 0.0. Вы касаетесь его и опускаете палец вниз. Затем вы увидите уменьшение значения при перемещении пальца дальше. Когда вы перестаете двигать пальцем, значение не меняется.

Как это можно сделать в Objective-C?

1 Ответ

2 голосов
/ 14 декабря 2011

Этот ответ довольно большой, поэтому я решил поместить пример кода на 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

Интерфейсный Разработчик

Теперь вам нужно перетащить три метки в представление в IB и изменить все их классы на DragLabel. Убедитесь, что вы делаете это до создания торговых точек.

Class Change in IB

После этого подключите все розетки к своим .m и .h. В моем случае я дал им имена label1, label2 и label3.


Теперь у нас настроены класс меток и интерфейс, самое время написать код для контроллера представления.

Ваш Controller.h должен выглядеть следующим образом. Я назвал это DragViewController.h

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

@interface DragViewController : UIViewController {
    DragLabel *label1;
    DragLabel *label2;
    DragLabel *label3;

    NSArray *draglabels;        
}

@property (nonatomic, retain) IBOutlet DragLabel *label1;
@property (nonatomic, retain) IBOutlet DragLabel *label2;
@property (nonatomic, retain) IBOutlet DragLabel *label3;

Ваш Controller.m должен выглядеть следующим образом. Я назвал это DragViewController.m

#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

Последняя вещь

Чтобы настроить шкалу таким образом, чтобы она варьировалась от 0 до 1, только когда пользователь перетаскивает над меткой, повторно внедрите movedLabel следующим образом:

- (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";
}
...