2014-06-06 107 views
2

我得到了UITextField,我打算在用戶觸摸TextField並調出鍵盤時以編程方式在其右側添加UIButton無法更改UITextField的寬度

------------------------------ 
|--------------------------- | 
||  textfield   | | 
|--------------------------- | 
------------------------------ 

當鍵盤長大的

------------------------------ 
|------------------   | 
||  textfield | BUTTON | 
|------------------   | 
------------------------------ 

我用Storyboard與自動版式的界面建設,這些元素都連接好。

當我試圖改變UITextField的寬度,它並沒有改變所有,產生的Button被提「內部」的文本框,如下所示的截圖:

enter image description here

這裏是我的代碼:

// code to add the button 
- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    // dynamically add a "reply" button 
    button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [self.replyViewBox addSubview:button]; 
    [button setTitle:@"Reply" forState:UIControlStateNormal]; 
    // change button size & position 
    button.frame = CGRectMake(265.0, 10.0, 46.0, 30.0); 
// [button sizeToFit]; 
    // change replyText size 
    CGRect frameRct = replyText.frame; 
    frameRct.size.width = 248.0; 
    replyText.frame = frameRct; 

    [replyViewBox addSubview:button]; 

} 

我設置通過故事板的限制,所以是有反正讓我改變寬度編程,同時保持了自動版式?

+0

由於您使用的是自動佈局,因此您必須更改約束,而不是幀。這裏是關於這個主題的一個體面的答案:http://stackoverflow.com/questions/15893022/setting-constraints-programatically – danh

+0

@danh thx的鏈接。但是,在刪除了TextField的約束之後,我仍然無法更改其寬度。爲什麼? – dumbfingers

+0

你關閉了自動佈局嗎? – danh

回答

1

我想我會試試這個樂趣。下面是我所做的:

1)設置文本字段和按鈕父視圖,創建約束放置文本字段的右邊緣的距離不變,從它的父的右邊緣。看到這裏突出顯示的約束......

enter image description here

2)爲約束,按鈕和文本視圖創建網點:

@interface ViewController() 

@property (weak, nonatomic) IBOutlet UITextField *textField; 
@property (weak, nonatomic) IBOutlet UIButton *button; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textHorizontalTrailConstraint; 

@end 

3)加入,讓我們打聽的方法該約束的狀態。當該約束具有非零常數時,鍵盤模式開啓。

- (BOOL)keyboardModeIsOn { 
    return self.textHorizontalTrailConstraint.constant > 0; 
} 

4)最後,一種調整約束和隱藏/取消隱藏按鈕的方法基於布爾。爲了好玩,我添加了一個可選的布爾轉換動畫。從你的鍵盤通知中調用它。

- (void)setKeyboardModeOn:(BOOL)on animated:(BOOL)animated { 

    if (on == [self keyboardModeIsOn]) return; 

    CGFloat htrailConst = (on)? 132 : 0; 
    CGFloat alpha = (on)? 1.0 : 0; 
    NSTimeInterval duration = (animated)? 0.5 : 0; 

    [self.view layoutIfNeeded]; 
    [UIView animateWithDuration:duration animations:^{ 
     self.textHorizontalTrailConstraint.constant = htrailConst; 
     self.button.alpha = alpha; 
     [self.view layoutIfNeeded]; 
    }]; 
} 

我測試了這個,它看起來不錯。