Ios Как заставить UITextView обнаружить один кран?
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"touchesBegan");
//test
UITouch *touch = [event allTouches] anyObject];
if ([touch tapCount] == 2) {
NSLog (@"tapcount 2");
[self.textview becomeFirstResponder];
}
else if ([touch tapCount] == 1) {
NSLog (@"tapcount 1");
[self.textview becomeFirstResponder];
[self.view performSelector:@selector(select:)];
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesBegan:touches withEvent:event];
NSLog(@"touchesMoved");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
NSLog(@"****touchesEnded");
[self.nextResponder touchesEnded: touches withEvent:event];
NSLog(@"****touchesEnded");
[super touchesEnded:touches withEvent:event];
NSLog(@"****touchesEnded");
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
[super touchesCancelled:touches withEvent:event];
NSLog(@"touchesCancelled");
}
МОЙ ВОПРОС:
Я хочу имитировать два крана, когда один раз нажимаю на UITextView, который является текстовым в этом коде. Но я не получаю NSLog от одного и двух кранов, когда я нажимаю один или два раза на textview, только вне его. Что делать, чтобы заставить его работать?
Ответы
Ответ 1
Вероятно, я бы использовал здесь два распознавателя жестов.
//...some stuff above here probably in you're controllers viewDidLoad
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapRecognized:)];
singleTap.numberOfTapsRequired = 1;
[someTextView addGestureRecognizer:singleTap];
[singleTap release];
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapRecognized:)];
doubleTap.numberOfTapsRequired = 2;
[someTextView addGestureRecognizer:doubleTap];
[doubleTap release];
И селектора будут просто такими:
- (void)singleTapRecognized:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"single tap");
// ...etc
}
- (void)doubleTapRecognized:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"double tap");
// ...etc
}
Ответ 2
У меня была такая же проблема, и другие ответы не сработали для меня. Так вот что я сделал.
Я приложил этот жест, как предложил другой ответ. Затем я убедился, что был вызван метод делегирования для выбора. Я попробовал просто выбрать ячейку, но это не вызвало метод делегата. Я считаю, что только взаимодействие с пользователем приводит к вызову метода делегата, поэтому этот код имитирует это поведение.
https://gist.github.com/brennanMKE/e89bf7a28d96812d6a22
@implementation TappableTextView
- (instancetype)init {
self = [super init];
if (self) {
[self setup];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
[self setup];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (void)setup {
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapRecognized:)];
singleTap.numberOfTapsRequired = 1;
[self addGestureRecognizer:singleTap];
}
- (void)singleTapRecognized:(id)sender {
UIView *superview = self.superview;
UICollectionViewCell *cell = nil;
NSIndexPath *indexPath = nil;
while (superview) {
if ([superview isKindOfClass:[UICollectionViewCell class]]) {
cell = (UICollectionViewCell *)superview;
}
if ([superview isKindOfClass:[UICollectionView class]] && cell) {
UICollectionView *collectionView = (UICollectionView *)superview;
indexPath = [collectionView indexPathForCell:cell];
NSAssert(collectionView.delegate, @"Delegate must be defined");
NSAssert([collectionView.delegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)], @"Selection must be supported");
if (indexPath && [collectionView.delegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)]) {
[collectionView.delegate collectionView:collectionView didSelectItemAtIndexPath:indexPath];
}
return;
}
superview = superview.superview;
}
}
@end
Ответ 3
У меня возникла аналогичная проблема, когда я хотел захватить краткий текст в textView без редактирования основного текста.
Этот ответ для Swift 3.0.
Для моего решения я внедрил метод textView делегата textViewShouldBeginEditing и вернул значение false для значения. Это позволяет мне захватывать краны на textView без каких-либо дополнительных накладных расходов.
extension ViewController: UITextViewDelegate {
func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
// Do something
return false
}
}
Просто не забудьте назначить textView для использования делегата в вашем классе ViewController.