7

ここ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

4

1 に答える 1

7

事前に私はアワーを持っていないと言いますが、私はいくつかの突っ込みをして、より多くを見つけました。あなたはすでにこれを見たと確信しています:CopyPasteTile

そのコードは私のシミュレーターで機能し、次のようになります。

CGRect drawRect = [self rectFromOrigin:currentSelection inset:TILE_INSET];
[self setNeedsDisplayInRect:drawRect];

UIMenuController *theMenu = [UIMenuController sharedMenuController];
[theMenu setTargetRect:drawRect inView:self];
[theMenu setMenuVisible:YES animated:YES];

ここにはいくつかの違いがあります。

  • drawRectは、巨大なビュータイルとタップポイントの計算から計算されます
  • setNeedsDisplayInRect呼ばれています
  • selfは大画面サイズのビューであるため、ローカル座標の代わりに画面座標が必要になる場合があります(おそらく、self.superviewから取得できます)。

最初に例に一致するようにこれらの調整を行って、どのような進歩が得られるかを確認してみます。

于 2010-01-21T16:51:13.133 に答える