Iphone 如何获得;取消选择";关于标签的通知

Iphone 如何获得;取消选择";关于标签的通知,iphone,uilabel,Iphone,Uilabel,我有UILabel,我需要它能够支持复制和粘贴(实际上是只读的复制)。我将UILabel子类化以支持复制,它工作正常。我还添加了文本突出显示,以便用户在单击标签时知道他到底在复制什么 我的问题是,当用户单击其他地方时,我不知道如何取消突出显示。复制气泡消失,但我没有收到任何回调,所以文本仍然高亮显示。是否有我错过的特殊回调,我可以使用,或者我必须想出一些肮脏的黑客?或者在UILabel中有没有更标准的高亮显示文本的方法,我不知道它会像复制气泡一样自动处理 这里是我的自定义UILabel代码: -

我有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);
    }
}

感谢您的帮助

就我个人而言,我会使用UITextView,并将可编辑选项设置为否

否则,如果您想要更多的控制,可以将UILabel所属的最顶端的全屏视图(或窗口)子类化

覆盖-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)事件

如果点击视图不是UILabel,则创建一个NSNotification,在UILabel子类中处理该通知,并执行取消选择


顺便说一句,你应该始终处理触摸被取消

谢谢你的提示。我认为我没有使用UITextView是有原因的,但我不记得它是什么。我会检查的。我不知道hittest方法,我也会尝试那个方法。关于touchesCancel,我想在大多数情况下,只做与touchesEnded相同的事情是可以的,对吗?是的,我认为只需要一份touchesEnded的副本就可以了。好的,覆盖hitTest有帮助。现在一切正常。非常感谢!我从中学到了很多:)顺便说一句,我可能没有使用UITextView,因为它在界面生成器中的可自定义性不如UILabel(字体、背景色…),不过,您可以通过编程非常轻松地设置所有这些!但是,很高兴为您服务。