自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS中的鍵盤事件

移動開發(fā) iOS
在涉及到表單輸入的界面中,我們通常需要監(jiān)聽一些鍵盤事件,并根據(jù)實際需要來執(zhí)行相應(yīng)的操作。如,鍵盤彈起時,要讓我們的UIScrollView自動收縮,以能看到整個UIScrollView的內(nèi)容。為此,在UIWindow.h中定義了如下6個通知常量,來配合鍵盤在不同時間點的事件處理:

鍵盤事件

在涉及到表單輸入的界面中,我們通常需要監(jiān)聽一些鍵盤事件,并根據(jù)實際需要來執(zhí)行相應(yīng)的操作。如,鍵盤彈起時,要讓我們的UIScrollView自動收縮,以能看到整個UIScrollView的內(nèi)容。為此,在UIWindow.h中定義了如下6個通知常量,來配合鍵盤在不同時間點的事件處理:

  1. UIKeyboardWillShowNotification // 鍵盤顯示之前 
  2. UIKeyboardDidShowNotification // 鍵盤顯示完成后 
  3. UIKeyboardWillHideNotification // 鍵盤隱藏之前 
  4. UIKeyboardDidHideNotification // 鍵盤消息之后 
  5. UIKeyboardWillChangeFrameNotification // 鍵盤大小改變之前 
  6. UIKeyboardDidChangeFrameNotification // 鍵盤大小改變之后 
  7.  
  8. 這幾個通知的object對象都是nil。而userInfo字典都包含了一些鍵盤的信息,主要是鍵盤的位置大小信息,我們可以通過使用以下的key來獲取字典中對應(yīng)的值: 
  9.  
  10. // 鍵盤在動畫開始前的frame 
  11. let UIKeyboardFrameBeginUserInfoKey: String 
  12.  
  13. // 鍵盤在動畫線束后的frame 
  14. let UIKeyboardFrameEndUserInfoKey: String 
  15.  
  16. // 鍵盤的動畫曲線 
  17. let UIKeyboardAnimationCurveUserInfoKey: String 
  18.  
  19. // 鍵盤的動畫時間 
  20. let UIKeyboardAnimationDurationUserInfoKey: String 

在此,我感興趣的是鍵盤事件的調(diào)用順序和如何獲取鍵盤的大小,以適當?shù)恼{(diào)整視圖的大小。

從定義的鍵盤通知的類型可以看到,實際上我們關(guān)注的是三個階段的鍵盤的事件:顯示、隱藏、大小改變。在此我們設(shè)定兩個UITextField,它們的鍵盤類型不同:一個是普通鍵盤,一個是數(shù)字鍵盤。我們監(jiān)聽所有的鍵盤事件,并打印相關(guān)日志(在此就不貼代碼了),直接看結(jié)果。

1) 當我們讓textField1獲取輸入焦點時,打印的日志如下:

  1. keyboard will change 
  2. keyboard will show 
  3. keyboard did change 
  4. keyboard did show 

2) 在不隱藏鍵盤的情況下,讓textField2獲取焦點,打印的日志如下:

  1. keyboard will change 
  2. keyboard will show 
  3. keyboard did change 
  4. keyboard did show 

3) 再收起鍵盤,打印的日志如下:

  1. keyboard will change 
  2. keyboard will hide 
  3. keyboard did change 
  4. keyboard did hide 

從上面的日志可以看出,不管是鍵盤的顯示還是隱藏,都會發(fā)送大小改變的通知,而且是在show和hide的對應(yīng)事件之前。而在大小不同的鍵盤之間切換時,除了發(fā)送change事件外,還會發(fā)送show事件(不發(fā)送hide事件)。

另外還有兩點需要注意的是:

如果是在兩個大小相同的鍵盤之間切換,則不會發(fā)送任何消息

如果是普通鍵盤中類似于中英文鍵盤的切換,只要大小改變了,都會發(fā)送一組或多組與上面2)相同流程的消息

了解了事件的調(diào)用順序,我們就可以根據(jù)自己的需要來決定在哪個消息處理方法中來執(zhí)行操作。為此,我們需要獲取一些有用的信息。這些信息是封裝在通知的userInfo中,通過上面常量key來獲取相關(guān)的值。通常我們關(guān)心的是UIKeyboardFrameEndUserInfoKey,來獲取動畫完成后,鍵盤的frame,以此來計算我們的scroll view的高度。另外,我們可能希望scroll view高度的變化也是通過動畫來過渡的,此時UIKeyboardAnimationCurveUserInfoKey和UIKeyboardAnimationDurationUserInfoKey就有用了。

我們可以通過以下方式來獲取這些值:

  1. if let dict = notification.userInfo { 
  2.  
  3. var animationDuration: NSTimeInterval = 0 
  4. var animationCurve: UIViewAnimationCurve = .EaseInOut 
  5. var keyboardEndFrame: CGRect = CGRectZero 
  6.  
  7. dict[UIKeyboardAnimationCurveUserInfoKey]?.getValue(&animationCurve) 
  8. dict[UIKeyboardAnimationDurationUserInfoKey]?.getValue(&animationDuration) 
  9. dict[UIKeyboardFrameEndUserInfoKey]?.getValue(&keyboardEndFrame) 
  10.  
  11. ...... 

實際上,userInfo中還有另外三個值,只不過這幾個值從iOS 3.2開始就已經(jīng)廢棄不用了。所以我們不用太關(guān)注。

***說下表單。一個表單界面看著比較簡單,但交互和UI總是能想出各種方法來讓它變得復(fù)雜,而且其實里面設(shè)計到的細節(jié)還是很多的。像我們金融類的App,通常都會涉及到大量的表單輸入,所以如何做好,還是需要花一番心思的。空閑時,打算總結(jié)一下,寫一篇文章。

#p#

零碎

自定義UIPickerView的行

UIPickerView的主要內(nèi)容實際上并不多,主要是一個UIPickerView類和對應(yīng)的UIPickerViewDelegate,UIPickerViewDataSource協(xié)議,分別表示代理和數(shù)據(jù)源。在此不細說這些,只是解答我們遇到的一個小需求。

通常,UIPickerView是可以定義多列內(nèi)容的,比如年、月、日三列,這些列之間相互不干擾,可以自已滾自己的,不礙別人的事。不過,我們有這么一個需求,也是有三列,但這三列需要一起滾。嗯,這個就需要另行處理了。

  1. 在UIPickerViewDelegate中,聲明了下面這樣一個代理方法: 
  2.  
  3. - (UIView *)pickerView:(UIPickerView *)pickerView 
  4. viewForRow:(NSInteger)row 
  5. forComponent:(NSInteger)component 
  6. reusingView:(UIView *)view 

我們通過這個方法就可以來自定義行的視圖。時間不早,廢話就不多說了,直接上代碼吧:

  1. - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { 
  2.  
  3. PickerViewCell *pickerCell = (PickerViewCell *)view; 
  4.  
  5. if (!pickerCell) { 
  6.  
  7. NSInteger column = 3
  8.  
  9. pickerCell = [[PickerViewCell alloc] initWithFrame:(CGRect){CGPointZero, [UIScreen mainScreen].bounds.size.width, 45.0f} column:column]; 
  10.  
  11. [pickerCell setLabelTexts:@[...]]; 
  12.  
  13. return pickerCell; 

我們定義了一個PickerViewCell視圖,里面根據(jù)我們的傳入的column參數(shù)來等分放置column個UILabel,并通過setLabelTexts來設(shè)置每個UILabel的文本。當然,我們也可以在PickerViewCell去定義UILabel的外觀顯示。就是這么簡單。

不過,還有個需要注意的就是,雖然看上去是顯示了3列,但實際上是按1列來處理的,所以下面的實現(xiàn)應(yīng)該是返回1:

  1. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
  2. return 1

Constructing an object of class type ‘**’ with a metatype value must use a ‘required’ initializer.

Swift中”[AnyObject]? does not have a member named generator” 問題的處理

有個小需求,需要遍歷當前導航控制器棧的所有ViewController。UINavigationController類自身的viewControllers屬性返回的是一個[AnyObject]!數(shù)組,不過由于我的導航控制器本身有可能是nil,所以我獲取到的ViewController數(shù)組如下:

  1. var myViewControllers: [AnyObject]? = navigationController?.viewControllers 
  2.  
  3. 獲取到的myViewControllers是一個[AnyObject]?可選類型,這時如果我直接去遍歷myViewControllers,如下代碼所示 
  4.  
  5. for controller in myViewControllers { 
  6. ... 

編譯器會報錯,提示如下:

  1. [AnyObject]? does not have a member named "Generator" 

實際上,不管是[AnyObject]?還是其它的諸如[String]?類型,都會報這個錯。其原因是可選類型只是個容器,它與其所包裝的值是不同的類型,也就是說[AnyObject]是一個數(shù)組類型,但[AnyObject]?并不是數(shù)組類型。我們可以迭代一個數(shù)組,但不是迭代一個非集合類型。

在stackoverflow上有這樣一個有趣的比方,我犯懶就直接貼出來了:

To understand the difference, let me make a real life example: you buy a new TV on ebay, the package is shipped to you, the first thing you do is to check if the package (the optional) is empty (nil). Once you verify that the TV is inside, you have to unwrap it, and put the box aside. You cannot use the TV while it's in the package. Similarly, an optional is a container: it is not the value it contains, and it doesn't have the same type. It can be empty, or it can contain a valid value.

所有,這里的處理應(yīng)該是:

  1. if let controllers = myViewControllers { 
  2. for controller in controllers { 
  3. ...... 
責任編輯:chenqingxiang 來源: 南峰子的技術(shù)博客
相關(guān)推薦

2010-07-29 10:33:59

Flex鍵盤事件

2019-07-18 10:32:32

focusouIOS前端

2011-05-31 09:16:15

JavaScript

2017-12-21 15:42:08

iOS傳遞機制

2009-12-30 14:36:29

Silverlight

2010-07-29 10:27:30

Flex鍵盤事件

2010-07-29 10:40:12

2012-12-24 09:06:14

iOSUnity3D

2010-01-04 17:03:27

Silverlight

2013-04-01 17:05:28

2015-02-11 17:57:36

iOS源碼年日歷

2023-10-12 22:44:16

iOS事件響應(yīng)鏈

2011-07-22 13:23:56

IOS UI ScrollView

2013-07-29 04:29:29

iOS開發(fā)iOS開發(fā)學習禁用UITabBarC

2010-01-07 11:38:25

VB.NET鍵盤事件

2011-06-16 14:38:18

JavaScript事件委托

2012-01-04 10:07:56

Delphi

2021-11-11 11:24:54

JavaScript模型事件

2025-03-19 10:22:09

JavaScript編程語言開發(fā)

2024-06-28 10:19:02

委托事件C#
點贊
收藏

51CTO技術(shù)棧公眾號