web-dev-qa-db-ja.com

ユーザーがコピーするUILabelからテキストを選択できるようにする

UILabelはありますが、ユーザーがそのテキストの一部を選択できるようにする方法を教えてください。ユーザーがテキストを編集したり、ラベル/テキストフィールドを編集して境界線を表示したりしたくない。

53
Jonathan.

UILabelでは使用できません。

そのためにUITextFieldを使用する必要があります。 textFieldShouldBeginEditingデリゲートメソッドを使用して編集を無効にします。

57
Yuras

UITextViewを作成して、その.editableからNO。次に、(1)ユーザーが編集できない(2)境界線がなく、(3)ユーザーがそこからテキストを選択できるテキストビューがあります。

30
kennytm

テキストビューを使用できない場合、またはテキストビューを使用する必要がない場合、コピーアンドペーストの貧乏人向けのバージョンは、ジェスチャレコグナイザーをラベルに追加し、テキスト全体をペーストボードにコピーすることです。 UITextViewを使用しない限り、一部だけを実行することはできません

コピーされたことをユーザーに知らせ、シングルタップジェスチャと長押しの両方をサポートしていることを確認してください。テキストの一部を強調表示しようとするユーザーをピックアップします。開始するためのサンプルコードを次に示します。

ラベルを作成するときに、ジェスチャレコグナイザーをラベルに登録します。

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textTapped:)];
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(textPressed:)];
                [myLabel addGestureRecognizer:tap];
                [myLabel addGestureRecognizer:longPress];
                [myLabel setUserInteractionEnabled:YES];

次に、ジェスチャーを処理します。

- (void) textPressed:(UILongPressGestureRecognizer *) gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateRecognized &&
        [gestureRecognizer.view isKindOfClass:[UILabel class]]) {
        UILabel *someLabel = (UILabel *)gestureRecognizer.view;
        UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
        [pasteboard setString:someLabel.text];
        ...
        //let the user know you copied the text to the pasteboard and they can no paste it somewhere else
        ...
    }
}

- (void) textTapped:(UITapGestureRecognizer *) gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateRecognized &&
        [gestureRecognizer.view isKindOfClass:[UILabel class]]) {
            UILabel *someLabel = (UILabel *)gestureRecognizer.view;
            UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
            [pasteboard setString:someLabel.text];
            ...
            //let the user know you copied the text to the pasteboard and they can no paste it somewhere else
            ...
    }
}
24
Michael Gaylord