Этот ответ довольно большой, поэтому я решил поместить пример кода на 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
. Убедитесь, что вы делаете это до создания торговых точек.
После этого подключите все розетки к своим .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";
}