Как получить уведомление об отмене выбора на UILabel - PullRequest
3 голосов
/ 08 октября 2010

У меня есть UILabel, и мне нужно, чтобы он мог поддерживать копирование и вставку (на самом деле только копирование, поскольку оно доступно только для чтения).Я подкласс UILabel для поддержки копирования, и он работает нормально.Я также добавил выделение текста, чтобы пользователь знал, что именно он копирует, когда нажимает на ярлык.

Моя проблема в том, что я не знаю, как отменить эту подсветку, когда пользователь щелкает в другом месте.Копия исчезает, но я не получаю никакого обратного вызова, поэтому текст остается выделенным.Есть ли специальный обратный вызов, который я пропустил, который я могу использовать, или я должен придумать какой-нибудь грязный хак?Или, может быть, есть более стандартный способ выделения текста в UILabel, о котором я не знаю, который будет обрабатываться автоматически, как Копировать пузырь?

Вот мой пользовательский код UILabel:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
    if(action == @selector(copy:)) {
        return YES;
    }
    else {
        return [super canPerformAction:action withSender:sender];
    }
}

- (BOOL)becomeFirstResponder {
    if([super becomeFirstResponder]) {
        self.highlighted = YES; 

        UIMenuController *menu = [UIMenuController sharedMenuController];
        [menu setTargetRect:self.bounds inView:self];
        [menu setMenuVisible:YES animated:YES];

        return YES;
    }
    return NO;
}

- (BOOL)resignFirstResponder {
    if([super resignFirstResponder]) {
        self.highlighted = NO;

        UIMenuController *menu = [UIMenuController sharedMenuController];
        [menu setMenuVisible:NO animated:YES];
        [menu update];

        return true;
    }
    return false;
}

- (void)copy:(id)sender {
    UIPasteboard *board = [UIPasteboard generalPasteboard];
    [board setString:self.text];
    self.highlighted = NO;
    [self resignFirstResponder];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    if([self isFirstResponder]) {
        //UIMenuController *menu = [UIMenuController sharedMenuController];
        //[menu setMenuVisible:NO animated:YES];
        //[menu update];
        [self resignFirstResponder];
    }
    else if([self becomeFirstResponder]) {
        //UIMenuController *menu = [UIMenuController sharedMenuController];
        //[menu setTargetRect:self.bounds inView:self];
        //[menu setMenuVisible:YES animated:YES];
    }
}

- (void)setHighlighted:(BOOL)hl {
    [super setHighlighted:hl];

    [self setNeedsLayout];
}

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];

    if(self.highlighted) {
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextSetRGBFillColor(ctx, 0.3, 0.8, 1.0, 0.3);
        CGContextAddRect(ctx, CGRectMake(0, 0, [self textRectForBounds:self.frame limitedToNumberOfLines:1].size.width, self.frame.size.height));
        CGContextFillPath(ctx);
    }
}

Любая помощьоценили!

1 Ответ

2 голосов
/ 11 октября 2010

Лично я бы использовал UITextView с опцией редактирования, установленной на NO.

В противном случае, если вы хотите больше контроля, создайте подкласс для своего верхнего полноэкранного представления (или окна), к которому относится ваша UILabel.

переопределение - (UIView *) hitTest: (CGPoint) указывает на событие с событием: (UIEvent *);

и если представление попаданий не является вашей UILabel, создайте NSNotification, которое вы обрабатываете в своем подклассе UILabel, и отмените выбор.

Кстати, вы ВСЕГДА должны обрабатывать касания Отменено также!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...