UILabel 子類別(如 CopyableLabel)。self.userInteractionEnabled = YES;。UILongPressGestureRecognizer。canBecomeFirstResponder 回傳 YES。canPerformAction:withSender: 僅回傳 copy: 為 YES。copy: 將 self.text 寫入 [UIPasteboard generalPasteboard]。[self becomeFirstResponder],顯示 UIMenuController。@implementation CopyableLabel
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) [self setup];
return self;
}
- (void)awakeFromNib { [super awakeFromNib]; [self setup]; }
- (void)setup {
self.userInteractionEnabled = YES;
UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
[self addGestureRecognizer:lpgr];
}
- (BOOL)canBecomeFirstResponder { return YES; }
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
return action == @selector(copy:);
}
- (void)copy:(id)sender {
[[UIPasteboard generalPasteboard] setString:self.text];
}
- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
if (gesture.state == UIGestureRecognizerStateBegan) {
[self becomeFirstResponder];
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setTargetRect:self.bounds inView:self];
[menu setMenuVisible:YES animated:YES];
}
}
@end
// Storyboard/XIB 中將 Label 類別設為 CopyableLabel
// 或程式碼建立
CopyableLabel *label = [[CopyableLabel alloc] initWithFrame:CGRectMake(20, 100, 280, 40)];
label.text = @"長按我可以複製";
[self.view addSubview:label];
需實作 UITextInput 協定或改用 UITextView(editable=NO, selectable=YES)以獲得完整選取體驗。