IPhoneアプリでは、tableViewに情報を表示したいと思います。各セルのテキストは次のとおりです。Johnは最近、音楽abcdefg.mp3を聴きます。必要に応じて、テキストに2行を含めることができます。
テキストでは、ユーザーがabcdefg.mp3部分に触れると別のページが呼び出されるように、a.mp3がクリック可能である必要があります。ユーザーがabcdefg.mp3をタッチすると、ボタンをタッチするような効果もあります。
テキストのフレームを計算し、abcdefg.mp3にUIButtonを使用します。
時々abcdefg.mp3は次のように複数行になることがあります:
abcは最初の行の最後にあります
defg.mp3は2行目にあります。
この場合、どうすればよいですか?
私はすでに検索しました: ILabelのNSAttributedStringにタップ可能な「リンク」を作成しますか? ただし、サンプルではクリック可能なテキストがすべて1行であるため、ここでは適切ではないと思います。
最も簡単な方法は、ジェスチャー認識機能を実際のビューに追加することです(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 のドキュメントを参照してください。
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!")
}
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)
Fancy UILabels でTwitterifficで達成したことに似ています。基本的に、Craig Hockenberryは独自のカスタム「データ検出器」を作成し、ラベルと複数行テキスト内にリンクを挿入できるようにしました。この質問を参照してください: カスタムUIDataDetectorTypesを作成する方法はありますか?
テキストや画像のないカスタムボタンを使用して、上記の「非表示ボタン」を配置することもできます。
クリック可能な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]];
}
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];
TextViewを使用してスクロールを無効にできると思います。ウェブサイトのアドレスを指す必要があるプロジェクトでも同じことをしました。インスペクタウィンドウの[スクロールビュー]セクションのスクリーンショットに示すように、すべてのチェックを外します。