Как создать подкласс UITextView: реализовать горизонтальное перелистывание - PullRequest
2 голосов
/ 18 апреля 2011

Я пытаюсь реализовать горизонтальную прокрутку в UITextView.Я нашел здесь объясненное .

Однако я не понимаю, как я могу «подклассить» UITextView.Код, который приведен и который я попытался реализовать, следующий:

@interface SwipeableTextView : UITextView {
}

@end

@implementation SwipeableTextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    [self.superview touchesBegan:touches withEvent:event];

}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];

    [self.superview touchesMoved:touches withEvent:event];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];

    [self.superview touchesEnded:touches withEvent:event];
} 

@end

Очевидно, это должно переопределить нормальный UITextView, который я затем могу вызвать, ссылаясь на SwipeableTextView (например, SwipeableTextView.text = @"Some Text";).У меня вопрос, куда мне поместить этот кусок кода?В моем файле .m или .h?Я попытался поместить его под секцию реализации моего m-файла, но это не сработает, поскольку у меня уже есть секции @interface и @implementation.Любая помощь будет принята с благодарностью.


РЕДАКТИРОВАТЬ: Это работает сейчас:

//
//  SwipeTextView.h
//  Swipes
//

#import <Foundation/Foundation.h>

@interface SwipeTextView : UITextView {
    CGPoint     gestureStartPoint;
}

@property CGPoint gestureStartPoint;


@end

M File

//
//  SwipeTextView.m
//  Swipes
//

#import "SwipeTextView.h"
#define kMinimumGestureLength    10
#define kMaximumVariance         5

@implementation SwipeTextView
@synthesize gestureStartPoint;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    UITouch *touch =[touches anyObject];
    gestureStartPoint = [touch locationInView:self.superview];

    [self.superview touchesBegan:touches withEvent:event];

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    [super touchesMoved:touches withEvent:event];
    [self.superview touchesMoved:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    CGPoint currentPosition = [touch locationInView:self.superview];

    CGFloat deltaXX = (gestureStartPoint.x - currentPosition.x); // positive = left, negative = right
    //CGFloat deltaYY = (gestureStartPoint.y - currentPosition.y); // positive = up, negative = down

    CGFloat deltaX = fabsf(gestureStartPoint.x - currentPosition.x); // will always be positive
    CGFloat deltaY = fabsf(gestureStartPoint.y - currentPosition.y); // will always be positive

    if (deltaX >= kMinimumGestureLength && deltaY <= kMaximumVariance) {
        if (deltaXX > 0) {
            NSLog (@"Horizontal Left swipe detected");
        }
        else {
            NSLog(@"Horizontal Right swipe detected");
        }

    }

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];

    [self.superview touchesEnded:touches withEvent:event];
} 




@end

И, наконец, вот как ясоздайте подкласс этого пользовательского UITextView в моем ViewController:

// UITextView
CGRect aFrame = CGRectMake(0, 100, 320, 200);
aSwipeTextView = [[SwipeTextView alloc] initWithFrame:aFrame];
aSwipeTextView.text = @"Some sample text. Some sample text. Some sample text.";
[self.view addSubview:aSwipeTextView];

1 Ответ

5 голосов
/ 18 апреля 2011

Хорошо, это то, что вы делаете.

Когда вы хотите создать подкласс объекта, вы создаете для него файлы .h и .m.

Создайте файл с именем SwipeableTextView.h и вставьте этот код внутрь:

#import <Foundation/Foundation.h>

    @interface SwipeableTextView : UITextView {

    }

@end

Затем создайте файл SwipeableTextView.m и вставьте в него:

#import "SwipeableTextView.h"

@implementation SwipeableTextView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    [self.superview touchesBegan:touches withEvent:event];

}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];

    [self.superview touchesMoved:touches withEvent:event];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];

    [self.superview touchesEnded:touches withEvent:event];
} 

@end

Чтобы использовать этот новый подкласс в вашем проекте, выполните следующие действия.

импортируйте заголовок:

#import "SwipeableTextView.h"

, а затем вместо обычного создания UITextView создайте SwipeableTextView следующим образом:

SwipeableTextView *sTextView = [[SwipeableTextView alloc] init];

Вот и все.Надеюсь, это поможет.

...