2017-03-08 12 views
1

シンプルなサインイン画面を構築しています。いくつかの動的フィールドを作成し、ボタンにリスナーを添付しましたが、要素をタップしてユーザー名とパスワードの入力を開始することはできません。 Tabキーを押すと、入力にフォーカスが移りますが、クリックは使用できません。何が間違っているのですか?iOSで動的に作成されたフィールドやボタンはクリックできません

以下のコードとスクリーンショットを参照してください。赤で強調表示されている領域は解除不可能です。アクセシビリティインスペクタがあります。私の要素は決して示されません。

@interface PRLoginController() <UITextFieldDelegate> 

@property (nonatomic) UIView *inputView; 
@property (nonatomic) UITextField *usernameTextField; 
@property (nonatomic) UITextField *passwordTextField; 
@property (nonatomic) UIButton *loginButton; 
@property (nonatomic) UIButton *cancelButton; 
- (void)doLogin; 
- (void)doCancel; 

- (void)initializeUserInput; 

+ (UIViewController *)getTopViewController; 

@end 


@implementation PRLoginController 


- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor whiteColor]; 
    self.navigationItem.title = @"Login"; 
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:nil action:nil]; 

    [self initializeUserInput]; 
} 


- (void)initializeUserInput { 

    UIView *inputView = [[UIView alloc] init]; 
    inputView.translatesAutoresizingMaskIntoConstraints = NO; 

    CGFloat inputViewMargin = 50.0; 
    CGFloat inputElementTopMargin = 20.0; 

    [self.view addSubview:inputView]; 
    [self.view addConstraints:@[ 
           [NSLayoutConstraint constraintWithItem:inputView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0], 
           [NSLayoutConstraint constraintWithItem:inputView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0], 
           [NSLayoutConstraint constraintWithItem:inputView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:inputViewMargin], 
           [NSLayoutConstraint constraintWithItem:inputView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:-inputViewMargin] 
           ]]; 

    _inputView = inputView; 

    CGFloat textFieldHeight = 30.0; 

    UITextField *topTextField = [[UITextField alloc] init]; 
    topTextField.translatesAutoresizingMaskIntoConstraints = NO; 

    [inputView addSubview:topTextField]; 
    [inputView addConstraints:@[ 
           [NSLayoutConstraint constraintWithItem:topTextField attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0], 
           [NSLayoutConstraint constraintWithItem:topTextField attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0], 
           [NSLayoutConstraint constraintWithItem:topTextField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0], 
           [NSLayoutConstraint constraintWithItem:topTextField attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:textFieldHeight], 
           ]]; 

    UITextField *bottomTextField = [[UITextField alloc] init]; 
    bottomTextField.translatesAutoresizingMaskIntoConstraints = NO; 

    [inputView addSubview:bottomTextField]; 
    [inputView addConstraints:@[ 
           [NSLayoutConstraint constraintWithItem:bottomTextField attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:topTextField attribute:NSLayoutAttributeBottom multiplier:1.0 constant:inputElementTopMargin], 
           [NSLayoutConstraint constraintWithItem:bottomTextField attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0], 
           [NSLayoutConstraint constraintWithItem:bottomTextField attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0.0], 
           [NSLayoutConstraint constraintWithItem:bottomTextField attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1.0 constant:textFieldHeight] 
           ]]; 

    topTextField.borderStyle = UITextBorderStyleRoundedRect; 
    bottomTextField.borderStyle = UITextBorderStyleRoundedRect; 

    topTextField.autocapitalizationType = UITextAutocapitalizationTypeNone; 
    bottomTextField.autocapitalizationType = UITextAutocapitalizationTypeNone; 

    topTextField.autocorrectionType = UITextAutocorrectionTypeNo; 
    bottomTextField.autocorrectionType = UITextAutocorrectionTypeNo; 

    topTextField.returnKeyType = UIReturnKeyDone; 
    bottomTextField.returnKeyType = UIReturnKeyDone; 

    topTextField.delegate = self; 
    bottomTextField.delegate = self; 

    topTextField.placeholder = @"Username"; 
    bottomTextField.placeholder = @"Password"; 

    _usernameTextField = topTextField; 
    _passwordTextField = bottomTextField; 

    UIButton *leftButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    leftButton.translatesAutoresizingMaskIntoConstraints = NO; 

    [inputView addSubview:leftButton]; 
    [inputView addConstraints:@[ 
           [NSLayoutConstraint constraintWithItem:leftButton attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:150], 
           [NSLayoutConstraint constraintWithItem:leftButton attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0], 
           [NSLayoutConstraint constraintWithItem:leftButton attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:-5.0], 
           ]]; 

    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    rightButton.translatesAutoresizingMaskIntoConstraints = NO; 

    [inputView addSubview:rightButton]; 
    [inputView addConstraints:@[ 
           [NSLayoutConstraint constraintWithItem:rightButton attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:150], 
           [NSLayoutConstraint constraintWithItem:rightButton attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0.0], 
           [NSLayoutConstraint constraintWithItem:rightButton attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:inputView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:5.0], 
           ]]; 

    leftButton.backgroundColor = [UIColor grayColor]; 
    rightButton.backgroundColor = leftButton.backgroundColor; 

    leftButton.layer.cornerRadius = 4.0; 
    rightButton.layer.cornerRadius = leftButton.layer.cornerRadius; 


    [leftButton setTitle:@"Login" forState:UIControlStateNormal]; 
    [rightButton setTitle:@"Cancel" forState:UIControlStateNormal]; 


    [leftButton addTarget:self action:@selector(doLogin) forControlEvents:UIControlEventTouchUpInside]; 
    [rightButton addTarget:self action:@selector(doCancel) forControlEvents:UIControlEventTouchUpInside]; 

    _loginButton = leftButton; 
    _cancelButton = rightButton; 

} 

enter image description here enter image description here enter image description here

EDIT

私は、ジェスチャ認識を削除したが、それは助けにはなりませんでした。 uiをクリックしても何もしません。私は特にそのハンドラに興味はありません、それは別のビューからコピーされましたが、それを削除することも役に立たなかった。

+1

なぜルートビューにタップジェスチャ認識機能がありますか? – NRitH

+0

@NRitHタップレコグナイザーは、テキストフィールドの外にタップしてキーボードを閉じることが表示されます。 @ caiocpricci2あなたはrecognisersハンドラにログを追加できますか?それはタッチを傍受しており、テキストフィールドへの通過を許可していないと思います。テキストフィールドをタップして、タップ認識ツールのログが有効かどうかを確認します。また、 'inputView'を追加してその制約を2回設定する必要もありません。 –

+0

タップレコグナイザを削除して、テキストフィールドで適切な動作が得られるかどうかを確認してください。もしそうなら、 'UIGestureRecignizerDelegate'を見て適切に解決することができます。 –

答えて

2

あなたのinputViewは、間違ったサイズになっている可能性があります。すべてのタッチがその範囲外になるため、サブビューに渡されません。これらの制約を追加してみてください

[NSLayoutConstraint constraintWithItem:inputView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute: NSLayoutAttributeTop multiplier:1.0 constant:-inputViewMargin], 
[NSLayoutConstraint constraintWithItem:inputView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute: NSLayoutAttributeBottom multiplier:1.0 constant:-inputViewMargin] 

が垂直inputViewを持っている、それはコンテナの記入します。先頭と末尾(左端と右端)をすでに拘束しているようですが、上端と下端も行う必要があります。

関連する問題