ここSOには、これらの線に正確に沿った質問がすでにあることを認めますが、実装の詳細、有効な回答が不足しており、より具体的にしたいので、新しい質問が適切であると思います. 明らかに、私が間違っている場合はお知らせください。そこでスレッドを再開することができます。
基本的に、ユーザーがラベルを押したときに UILabel のテキストをペーストボードにコピーしたいと考えています。正直なところ、難しいことではありません。ただし、視覚的なフィードバックを提供する最善の方法は、ユーザーに から [コピー] メニュー オプションを表示させることだと思いますUIMenuController
。
iPhone アプリケーション プログラミング ガイドのイベント処理セクション、具体的にはCopy, Cut, and Paste Operationsのセクションによると、カスタム ビューからコピー、カット、および/または貼り付け操作を提供できるはずです。
したがって、ガイドで説明されているように、次の実装で UILabel をサブクラス化しましたが、UIMenuController は表示されません。ガイドには、これを行うために他に必要なものがあることは示されておらず、NSLog ステートメントはコンソールに出力され、ラベルを押したときにセレクターが実行されていることを示しています。
//
// CopyLabel.m
// HoldEm
//
// Created by Billy Gray on 1/20/10.
// Copyright 2010 Zetetic LLC. All rights reserved.
//
#import "CopyLabel.h"
@implementation CopyLabel
- (void)showCopyMenu {
NSLog(@"I'm tryin' Ringo, I'm tryin' reeeeal hard.");
// bring up editing menu.
UIMenuController *theMenu = [UIMenuController sharedMenuController];
// do i even need to show a selection? There's really no point for my implementation...
// doing it any way to see if it helps the "not showing up" problem...
CGRect selectionRect = [self frame];
[theMenu setTargetRect:selectionRect inView:self];
[theMenu setMenuVisible:YES animated:YES]; // <-- doesn't show up...
}
// obviously, important to provide this, but whether it's here or not doesn't seem
// to change the fact that the UIMenuController view is not showing up
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
BOOL answer = NO;
if (action == @selector(copy:))
answer = YES;
return answer;
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self performSelector:@selector(showCopyMenu) withObject:nil afterDelay:0.8f];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCopyMenu) object:nil];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCopyMenu) object:nil];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showCopyMenu) object:nil];
}
@end
では、これを実現するために他に何をしなければならないのでしょうか?
フォローしていてこれをやろうとしている人も、ラベルに「User Interaction Enabled」を設定する必要があります
編集:
わかりやすくするために、これは、特定のiPhoneビューで画像を押したときに画像の上に表示される小さな[コピー]メニュー項目に似ている必要があることを付け加えておきます. -B