2014-09-25 74 views
1

我正在爲iOS 8編寫自定義鍵盤。我的主UIView在我的viewDidLoad方法中返回{{0, 0}, {0, 0}}。我試圖用view.frame和bounds接收CGRect,但都返回0.但是,如果我使用這些相同的方法來檢索我的視圖在viewDidAppear方法中的座標,它們將返回正常:{{0, 0}, {320, 216}}。這裏的問題是viewDidAppear在didLoad之後運行,所以我無法從didAppear檢索大小並在didLoad中使用它。這是我的問題:iOS 8自定義鍵盤self.view.frame返回0

爲什麼self.view的幀在viewDidLoad返回0?它的大小不應該在這裏設置?這(viewDidLoad)是我應該做的大部分啓動和UI設置的地方,對嗎?我在Xcode中有經驗。

我在swift編程,雖然這應該沒關係(?)我認爲這值得注意。在Obj-C中的答案很好。

編輯:我創建了一個全新的Xcode項目和目標下面的類並收到同樣的錯誤:

import UIKit 

class KeyboardViewController: UIInputViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    println(self.view.frame) // returns (0.0,0.0,0.0,0.0) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

override func viewDidAppear(animated: Bool) { 
    println(self.view.frame) // returns (0.0,0.0,320.0,216.0) 
} 


} 

我用模擬器和物理設備也從6到4S測試。沒有什麼似乎有所作爲。

+0

我在這裏遇到麻煩,那個println無法在控制檯日誌中打印任何東西! – TomSawyer 2014-10-20 15:35:17

回答

0

我能得到它通過增加在頂部的文本框,並使其FirstResponder工作:

進口的UIKit

類KeyboardViewController:UIInputViewController {

@IBOutlet var textField: UITextField! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    textField.becomeFirstResponder() 
    println(self.view.frame) // returns (0.0,0.0,375.0,667.0) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 

} 

override func viewDidAppear(animated: Bool) { 
    println(self.view.frame) // returns (0.0,0.0,375.0,667.0) 

} 

}

0

你應該用於定製鍵盤的self.inputView.frame而不是self.view.frame

您可以使用isPortraitLayout方法來檢查/如果橫向模式或縱向模式初始化視圖...

-(BOOL) isPortraitLayout{ 
    int appExtensionWidth = (int)round(self.view.frame.size.width); 

    int possibleScreenWidthValue1 = (int)round([[UIScreen mainScreen] bounds].size.width); 
    int possibleScreenWidthValue2 = (int)round([[UIScreen mainScreen] bounds].size.height); 

    int screenWidthValue; 

    if (possibleScreenWidthValue1 < possibleScreenWidthValue2) { 
     screenWidthValue = possibleScreenWidthValue1; 
    } else { 
     screenWidthValue = possibleScreenWidthValue2; 
    } 

    return (appExtensionWidth == screenWidthValue); 
} 
+0

這仍然在viewDidLoad下返回0,但不在viewDidAppear下。以下是澄清的截圖:http://i.imgur.com/SJib6WZ。png – Alex 2014-09-27 19:54:07

+0

我注意到你還沒有將任何視圖(或Xibs)分配給inputView或view。一旦你分配它(即self.inputView = self.Keyboard,其中self.keyboard是view/xib),你將得到幀值。 – 2014-09-29 08:49:06

0

它是視圖顯示層級(不只是鍵盤的擴展)的一般特性,即幀大小在viewDidLoad中不正確。請參閱herehere,其中也提供了關於如何處理佈局的一些建議。

我會推薦使用自動佈局(類似於在鍵盤擴展示例代碼中完成「nextKeyboardButton」),在這種情況下,大多數情況下您不必擔心處理幀更改。例如。在viewDidLoad中

MyKeyboardView* keyboardView = [[keyboardView alloc] init]; 
    keyboardView.translatesAutoresizingMaskIntoConstraints = NO; 

    [self.inputView addSubview: keyboardView]; 

    NSLayoutConstraint *leftSideConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]; 
    NSLayoutConstraint *rightSideConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]; 
    NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]; 
    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]; 

    [self.inputView addConstraints:@[leftSideConstraint, rightSideConstraint, bottomConstraint, topConstraint]]; 

通過這種方式,框架爲您keyboardView將跟蹤inputView框(設置爲默認鍵盤邊框尺寸的方向和設備),並因此與方向的變化自動調整。然後,您可以在MyKeyboardView類的layoutSubviews中處理進一步的自定義佈局。最後一件事,如果您的MyKeyboardView在drawRect中執行任何自定義繪圖,則需要在MyKeyboardView的init self.contentMode = UIViewContentModeRedraw;中設置contentMode,否則在更改框架時不會調用drawRect。