1

MarqueeLabelUILabelテキストが含まれているビューに対して長すぎる場合に、サブビューUILabel ivarをマーキー方式でアニメーション化するUIViewサブクラス(私が呼び出している)の作成に取り組んでいます。

UILabel ivar のすべての標準 UILabel (テキスト、フォント、色など) インスタンス変数を設定/取得するためだけMarqueeLabelに、クラスにメソッドを記述する必要なく、クリーンな実装を望んでいました。メッセージ転送でこれを行う方法を見つけました。送信された認識されていないメソッドはすべて、UILabel ivar に渡されます。私の場合、認識されないメソッドは、UILabel で通常使用されるメソッドです。MarqueeLabelMarqueeLabel

ただし、このアプローチにはいくつかの問題があります
。 1.[marqueeLabel setText:@"Label here"]ではなく、を使用する必要がありますmarqueeLabel.text

「MarqueeLabel」は「-setText:」に応答しない場合があります

私は無視することを知っていますが、他の人を苛立たせます。

これらの問題を回避するために、メソッドを ivar に「持ち込む」方法はありますか?

ありがとう!

注:これを設定した方法も、最適な方法ではない可能性があります。UILabel のサブクラス化またはクラス継続の方がよいのかもしれませんが、これらのメソッドを使用して、アニメーション + クリッピング (スクロールするテキストが UIView を含む領域から移動して消えるとき) をどのように行うことができるかを把握できませんでした。

注2:サブビューUILabelのmarqueeLabel.subLabel.text場所を使用できることはわかっています。subLabelそして、これは私がとる方向かもしれませんが、より良い解決策があるかどうかを確認することもできます!

4

1 に答える 1

1

プロパティの場合、インターフェイスでプロパティを定義し、実装で@dynamicを使用して、スタブ実装を作成する必要がないようにすることができます。また、ラベルを上書きvalueForUndefinedKey:して転送することも忘れないでください。setValue:forUndefinedKey:

プロパティの一部ではないメソッドの場合、カテゴリを使用して、メソッドを実装せずにメソッドを宣言できます。これにより警告は削除されますが、組み込みの転送は引き続き使用されます。

//MarqueeLabel.h
#import <UIKit/UIKit.h>
@interface MarqueeLabel : UIView {}
@property (nonatomic, copy) NSString *text;
@end
@interface MarqueeLabel (UILabelWrapper)
- (void)methodToOverride;
@end

//MarqueeLabel.m
#import "MarqueeLabel.h"
@implementation MarqueeLabel
@dynamic text;
- (id)valueForUndefinedKey:(NSString *)key {
    return [theLabel valueForKey:key];
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    [theLabel setValue:value forKey:key];
}
@end
于 2011-02-04T03:26:20.200 に答える