2010-12-29 7 views
3

私のプロジェクトでは、「美しい」テキストフィールドを作成するために角を丸くした白いUIButtonに埋め込まれたUITextFieldを使用しています。このコードはさまざまなビューで数回使用されるので、私はこの目的のためにカスタムUIViewを作成することにしました。このカスタムUIViewのためのコード:UIViewに埋め込まれたUITextFieldがタッチイベントに反応しません

BSCustomTextField.h

#import <Foundation/Foundation.h> 

@interface BSCustomTextField : UIView { 
    UIButton* btnTextFieldContainer; 
    UITextField* textField; 
    NSString* text; 
} 

@property (retain, nonatomic) UIButton* btnTextFieldContainer; 
@property (retain, nonatomic) UITextField* textField; 
@property (retain, nonatomic) NSString* text; 

-(id)initWithPosition:(CGPoint)position; 
@end 

BSCustomTextField.m

#import "BSCustomTextField.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation BSCustomTextField 
@synthesize btnTextFieldContainer, textField, text; 

-(id)initWithPosition:(CGPoint)position{ 
    if (self == [super init]) { 
     btnTextFieldContainer = [[UIButton alloc] initWithFrame:CGRectMake(position.x, position.y, 260, 50)]; 
     btnTextFieldContainer.backgroundColor = [UIColor whiteColor]; 
     [[btnTextFieldContainer layer] setCornerRadius:3.]; 
     [[btnTextFieldContainer layer] setMasksToBounds:YES]; 
     [[btnTextFieldContainer layer] setBorderWidth:0.]; 

     textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 240, 30)]; 

     textField.backgroundColor = [UIColor whiteColor]; 
     textField.clearButtonMode = UITextFieldViewModeAlways; 
     textField.returnKeyType = UIReturnKeySend; 
     textField.keyboardType = UIKeyboardTypeEmailAddress; 
     textField.font    = [UIFont fontWithName:@"Helvetica-Bold" size:20.]; 

     [btnTextFieldContainer addSubview:textField]; 
     [self addSubview:btnTextFieldContainer]; 
    } 
    return self; 
} 

-(void)dealloc{ 
    [btnTextFieldContainer release]; 
    [textField release]; 
    [super dealloc]; 
} 
@end 

ので、コンテナビューののviewDidLoadでこのビューを使用した場合(以下のコードを参照してください)ビューは適切な位置に正しくレンダリングされ、指定されたとおりに表示されますが、タッチイベントに反応しないため、タッチ時に最初のレスポンダにはなりません。

コード:

searchTextField = [[BSCustomTextField alloc] initWithPosition:CGPointMake(30, 150)]; 
searchTextField.textField.placeholder  = NSLocalizedString(@"lsUserName", @""); 
[[(BSPlainHeaderWithBackButtonView*)self.view contentView] addSubview:searchTextField]; 

プログラムで正常に動作すると表示されるキーボードを作る[searchTextField.textField becomeFirstResponder]を呼び出します。

UIButton* btnTextFieldContainer = [[UIButton alloc] initWithFrame:CGRectMake(30, 150, 260, 50)]; 
btnTextFieldContainer.backgroundColor = [UIColor whiteColor]; 
[[btnTextFieldContainer layer] setCornerRadius:3.]; 
[[btnTextFieldContainer layer] setMasksToBounds:YES]; 
[[btnTextFieldContainer layer] setBorderWidth:0.]; 

searchTextField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 240, 30)]; 

searchTextField.backgroundColor = [UIColor whiteColor]; 
searchTextField.clearButtonMode = UITextFieldViewModeAlways; 
searchTextField.returnKeyType = UIReturnKeySend; 
searchTextField.keyboardType = UIKeyboardTypeEmailAddress; 
searchTextField.font   = [UIFont fontWithName:@"Helvetica-Bold" size:20.]; 
searchTextField.placeholder  = NSLocalizedString(@"lsUserName", @""); 

[btnTextFieldContainer addSubview:searchTextField]; 
[[(BSPlainHeaderWithBackButtonView*)self.view contentView] addSubview:btnTextFieldContainer]; 
[btnTextFieldContainer release]; 

すべてが期待どおりに動作し、テキストフィールドがタッチに反応する:私はちょうどこのように私のコンテナ内BSCustomTextFieldインラインのコードを埋め込む場合

しかし、興味深い部分は、です。 searchTextFieldのタイプは、各ケースのヘッダーファイルに適切に設定されています。唯一の違いは、最初のケースではUIButtonとUITextFiledにUIViewを追加ラッピングしていることです。テキストフィールドを最初のレスポンダーにするために何をすべきかわかりません。

事前にどうもありがとう、 ローマ

+0

[[btnTextFieldContainer層] setBorderWidth:0。];浮動小数点値を含まない – raaz

+0

申し訳ありませんが、正確に何を意味するのかよくわかりません。 "0"浮動小数点値で、私が期待しているのとまったく同じ効果があります。つまり、UIButtonレイヤの境界をゼロに設定します。 – Romanticus

答えて

1

このクラスはインスタンスメソッドbecomeFirstResponder: & isFirstResponder:

はまたYES

0

ああにテキストフィールドeditingプロパティを設定することを忘れないでください持っているUIResponder class

を参照してください。あなたはこのようにするのはまったく間違っています。伸縮可能な画像をUIImageViewに追加し、UITextFieldの下に配置する必要があります。

UIImage *backgroundImage = [[UIImage imageNamed:@"fieldBackground.png"] stretchableImageWithLeftCapWidth:12.0 topCapHeight:0.0]; 

また、UIButtonでuserInteractionを無効にすることもできます。

+0

丸みのあるコーナーの背景として「ダミー」ボタンを使用することは、私が望む結果を得る最良の方法ではないことを知っていますが、上記のように、コンテナビューでインラインで同じコードを使用すると、 Btw。 UIButtonでのユーザー操作を無効にしても効果はありません。テキストフィールドはまだ応答しません。 – Romanticus

4

私は解決策を得ました。 UIResponderクラスへのraazの指摘は、レスポンダーチェーンに何か間違っているはずであるという考えに私を導いたので、ちょっと研究して、このトピック:正確に同じ問題が議論されているAllowing interaction with a UIView under another UIViewを見つけました。
ここにBSCustomTextFieldの新しい作業コードがあります。withEvent:クリック可能な領域は、我々は単にpointInsideにYESを返すことができます全体BSCustomTextFieldビューを記入するのでメートル

#import "BSCustomTextField.h" 
#import <QuartzCore/QuartzCore.h> 


@implementation BSCustomTextField 
@synthesize btnTextFieldContainer, textField, text; 

-(id)initWithPosition:(CGPoint)position{ 
    if (self == [super init]) { 
    btnTextFieldContainer = [[UIButton alloc] initWithFrame:CGRectMake(position.x, position.y, 260, 50)]; 
    btnTextFieldContainer.backgroundColor = [UIColor whiteColor]; 
    [[btnTextFieldContainer layer] setCornerRadius:3.]; 
    [[btnTextFieldContainer layer] setMasksToBounds:YES]; 
    [[btnTextFieldContainer layer] setBorderWidth:0.]; 

    textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 240, 30)]; 

    textField.backgroundColor = [UIColor whiteColor]; 
    textField.clearButtonMode = UITextFieldViewModeAlways; 
    textField.returnKeyType = UIReturnKeySend; 
    textField.keyboardType = UIKeyboardTypeEmailAddress; 
    textField.font    = [UIFont fontWithName:@"Helvetica-Bold" size:20.]; 

    [btnTextFieldContainer addSubview:textField]; 
    [self addSubview:btnTextFieldContainer]; 
    } 
    return self; 
} 

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    // UIView will be "transparent" for touch events if we return NO 
    return YES; 
} 

-(void)dealloc{ 
    [btnTextFieldContainer release]; 
    [textField release]; 
    [super dealloc]; 
} 
@end 

は正しい方向に私を指してありがとうございました。

関連する問題