web-dev-qa-db-ja.com

UILabelクリッカブルをカスタマイズする方法

私が欲しいもの:

IPhoneアプリでは、tableViewに情報を表示したいと思います。各セルのテキストは次のとおりです。Johnは最近、音楽abcdefg.mp3を聴きます。必要に応じて、テキストに2行を含めることができます。

テキストでは、ユーザーがabcdefg.mp3部分に触れると別のページが呼び出されるように、a.mp3がクリック可能である必要があります。ユーザーがabcdefg.mp3をタッチすると、ボタンをタッチするような効果もあります。

私がやること:

テキストのフレームを計算し、abcdefg.mp3にUIButtonを使用します。

私の問題:

時々abcdefg.mp3は次のように複数行になることがあります:

abcは最初の行の最後にあります

defg.mp3は2行目にあります。

この場合、どうすればよいですか?

私はすでに検索しました: ILabelのNSAttributedStringにタップ可能な「リンク」を作成しますか? ただし、サンプルではクリック可能なテキストがすべて1行であるため、ここでは適切ではないと思います。

29
scorpiozj

最も簡単な方法は、ジェスチャー認識機能を実際のビューに追加することです(UILabelまたは独自のカスタムビュー)。ジェスチャ認識エンジンが機能するためには、ビューをuserInteractionEnabledに設定する必要があります。

ラベルビュー(またはラベルビュー)がlabelViewと呼ばれると仮定した場合の例を次に示します。

_UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)];
// if labelView is not set userInteractionEnabled, you must do so
[labelView setUserInteractionEnabled:YES];
[labelView addGestureRecognizer:gesture];
_

この例では、アクションメッセージがselfに送信され、メッセージは次のように定義されます。

- (void)userTappedOnLink:(UIGestureRecognizer*)gestureRecognizer;

これは、ボタンなどの他のUIControlサブクラスを配線するのと同じように機能します。

その他のメモ:同じジェスチャー認識機能を複数のビューに追加しようとしないでください。動作しません。ジェスチャーレコグナイザーの複数のコピーを複数のビューに追加しないでください(それらを置き換えるのではなく、単にスタックしてメモリを浪費します)。ビューを最初に作成および構成するときに、ジェスチャレコグナイザーを追加する必要があります。

詳細については、 IGestureRecognizer のドキュメントを参照してください。

118
Jason Coco

Swift 4.2バージョン:

var labelView = UILabel()
let gesture = UITapGestureRecognizer(target: self, action: #selector(userTappedOnLink))
// if labelView is not set userInteractionEnabled, you must do so
labelView.isUserInteractionEnabled = true
labelView.addGestureRecognizer(gesture)


@objc func userTappedOnLink() {
    print("clicked!")
}
8
Esqarrouth

Swift 2.0バージョン:

  func userTappedOnLink() {
    print("clicked!")
  }

///tap and link to FB page
let gesture = UITapGestureRecognizer(target: self, action: "userTappedOnLink")
// if labelView is not set userInteractionEnabled, you must do so
lblStaff.userInteractionEnabled = true
lblStaff.addGestureRecognizer(gesture)
2
Bill Chan

Fancy UILabels でTwitterifficで達成したことに似ています。基本的に、Craig Hockenberryは独自のカスタム「データ検出器」を作成し、ラベルと複数行テキスト内にリンクを挿入できるようにしました。この質問を参照してください: カスタムUIDataDetectorTypesを作成する方法はありますか?

1
Reed Olsen

テキストや画像のないカスタムボタンを使用して、上記の「非表示ボタン」を配置することもできます。

enter image description here

1
Chris Conway

クリック可能なUILabelのこのソリューション。テキスト内の選択リンク用ではありません。 UIButtonのようなクリック可能なUILabelのための私の意見ではちょうどいい解決策:

#import <UIKit/UIKit.h>

@protocol ClickableLablelDelegate <NSObject>

@required
- (void)onClickLabel:(UILabel *) label;

@end

@interface ClickableLable : UILabel

@property (nonatomic, weak) id <ClickableLablelDelegate> delegate;

@end


#import "ClickableLable.h"

@implementation ClickableLable

-(void)awakeFromNib
{
    [super awakeFromNib];

    [self setUserInteractionEnabled:YES];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self setBackgroundColor:[UIColor lightGrayColor]];
}

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self setBackgroundColor:[UIColor clearColor]];

    if ([_delegate respondsToSelector:@selector(onClickLabel:)]) {
        [_delegate onClickLabel:self];
    }
}

-(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self setBackgroundColor:[UIColor clearColor]];
}
0
Alex P

UITapGestureRecognizerをラベルに追加して、UIlabelをクリック可能にします。

ラベルをタップジェスチャに追加する前に、UIlabelのユーザーインタラクションを有効にすることを忘れないでください

サンプルコードは次のとおりです。

//Tap Gesture
UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTapped:)];
//Adding userinteraction for label
[labelName setUserInteractionEnabled:YES];
//Adding label to tap gesture
[labelName addGestureRecognizer:gesture];
0
ashok

TextViewを使用してスクロールを無効にできると思います。ウェブサイトのアドレスを指す必要があるプロジェクトでも同じことをしました。インスペクタウィンドウの[スクロールビュー]セクションのスクリーンショットに示すように、すべてのチェックを外します。 disable scrolling

0
Alix