2014-03-29 35 views
0

我有一個iPhone 6應用程序(六件事),我在iOS 6中編寫,其中有一個用戶將文本輸入到UITextView中的屏幕。顯示鍵盤時,UITextView的大小會自動縮短,以便在用戶鍵入時,光標不會隱藏在鍵盤後面(請參見圖片)。如何根據用戶操作在iOS 7中更改UIView(UITextView)的大小

enter image description here

我用下面的處理要做到這一點:

當被顯示的鍵盤:

- (void)keyboardDidShow:(id)sender 
{ 
    NSDictionary* info = [sender userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    _txtSizeBase = self._txtInfo.frame; 
    float offset = kbSize.height < kbSize.width?kbSize.height:kbSize.width; 
    _txtSizeKeyboard = CGRectMake(_txtSizeBase.origin.x, _txtSizeBase.origin.y, _txtSizeBase.size.width, _txtSizeBase.size.height-offset+60); 
    self._txtInfo.frame = _txtSizeKeyboard; 
... 
} 

當 「完成」 按鈕被按下,並且鍵盤被駁回:

- (void)keyboardDidHide:(id)sender 
{ 
    self._txtInfo.frame = _txtSizeBase; 
... 
} 

這在IOS 6中,但iOS的7效果很好,我不知道的方式來強制視圖以改變其大小的viewDidLoad中已經被調用。更改框架的大小不會導致它調整大小。

我已經關閉了此窗體上的自動佈局,因此我可以讓屏幕爲iOS 6/7(在界面構建器中使用deltas)正確調整元素(y位置)。

任何有幫助的建議,將不勝感激。

----------------------編輯方案------------------- ----------

因爲解決這個問題有點棘手,我認爲這將是有益的發佈它。

  1. 我添加iOS6的一個第二文件的.xib(I只釋放爲IOS 6+)與自動佈局關斷,並根據需要調整的位置。然後,我做到以下幾點:

    - (ID)initWithNibName:(![DeviceInfo isIOSAfter70):(的NSString *)nibNameOrNil束(一個NSBundle *)nibBundleOrNil { 如果 { 自我= [超級initWithNibName:@」 CreateRecordViewControllerIOS6「bundle:nibBundleOrNil]; } else { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; }}

**這是不是最完美的解決方案,但它的作品,我只是想支持iOS 6的用戶,而不是用iOS 6的開發前進,所以它是。**

  • 我開啓自動佈局形式:
  • enter image description here

  • 予設定的底部約束在文本視圖上並將其綁定到名爲_bottomConstraint的IBOutlet。

  • 我修改爲KeyboardDidShow /隱藏處理程序如下:

  • - (無效)keyboardDidHide:(ID)發送方 { ... 如果([DeviceInfo isIOSAfter70]) { if(_bottomConstraint!= nil) _bottomConstraint.constant = _bottomConstraintConstant; // IOS7 + if(_bottomConstraint!= nil) [self.view layoutIfNeeded]; } } ... }

    - (無效)keyboardDidShow:(ID)發送方 { ... 如果([DeviceInfo isIOSAfter70]) {// IOS7 + 如果(_bottomConstraint =零) { _bottomConstraintConstant = _bottomConstraint.constant; _bottomConstraint.constant + = kbSize.height; [self.view layoutIfNeeded]; }} ... }

    +0

    在iOS 7中更改'view'的'frame'沒有任何改變。您的代碼將像以前一樣工作。我認爲你做了其他錯誤。 – ismailgulek

    +0

    嗯....它似乎並沒有在模擬器正常工作...我會嘗試一個真正的手機上,也許模擬器是騙我... – FuzzyBunnySlippers

    +0

    我檢查了一個真實的設備,iPhone 4與iOS 7.它在那裏被打破,但在iOS 6中用於模擬器(並且以前在iPhone上的iOS 6中)按預期工作。 – FuzzyBunnySlippers

    回答

    1

    我曾與iOS7下設置幀類似的問題。我認爲打擊汽車限制並不明智。只需啓用自動約束(如果可以的話)和動畫約束。 您可以使用接口構建器從約束中創建IBOutlet,或者如果您正在以編程方式創建約束,請參考它。比使用類似於此的代碼:

    [self.view layoutIfNeeded]; 
    self.constrainVertical.constant = 10; 
    [UIView animateWithDuration:0.3 animations:^{ 
        [self.view layoutIfNeeded]; 
    } completion:^(BOOL finished) { 
        //put some finalizing code here if needed 
    }]; 
    

    我正在移動一個約束,只是爲了告訴你它是如何完成的。另外,使用約束時,不要直接設置幀。

    希望它有幫助。

    +0

    我發現,如果我使用自動佈局,iOS 7解決方案可以正常工作,但那麼它不會像iOS 6中預期的那樣工作。仍然在考慮這個... – FuzzyBunnySlippers

    +0

    好的。這工作使iOS 7顯示視圖控制器更改UIText視圖更正的大小(我不需要清理動畫)。對於IOS6,我只是添加了一個特殊版本的.xib文件,並將自動佈局關閉。在initWithNibName調用中,我檢查它是否在IOS7之前,並加載了第二個.xib,這看起來好像是一個很好的妥協。 – FuzzyBunnySlippers

    相關問題