精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

大牛說:這是不可錯(cuò)過的iOS開發(fā)技巧(三)

移動(dòng)開發(fā) iOS
在iOS 7后,UIView新增加了一個(gè)tintColor屬性,這個(gè)屬性定義了一個(gè)非默認(rèn)的著色顏色值,其值的設(shè)置會(huì)影響到以視圖為根視圖的整個(gè)視圖層次結(jié)構(gòu)。它主要是應(yīng)用到諸如app圖標(biāo)、導(dǎo)航欄、按鈕等一些控件上,以獲取一些有意思的視覺效果。

Swift2出來了,還是得與時(shí)俱進(jìn)啊,不然就成老古董了。再者它開源了,又有事情要做了。當(dāng)個(gè)程序猿真是累啊,一直在追,可從來沒追上,剛有那么點(diǎn)念想了,人家又踩了腳油門。

這一期主要有三個(gè)內(nèi)容:

Tint Color

Build Configurations in Swift

鍵盤事件

Tint Color

在iOS 7后,UIView新增加了一個(gè)tintColor屬性,這個(gè)屬性定義了一個(gè)非默認(rèn)的著色顏色值,其值的設(shè)置會(huì)影響到以視圖為根視圖的整個(gè)視圖層次結(jié)構(gòu)。它主要是應(yīng)用到諸如app圖標(biāo)、導(dǎo)航欄、按鈕等一些控件上,以獲取一些有意思的視覺效果。

tintColor屬性的聲明如下:

  1. var tintColor: UIColor! 

默認(rèn)情況下,一個(gè)視圖的tintColor是為nil的,這意味著視圖將使用父視圖的tint color值。當(dāng)我們指定了一個(gè)視圖的tintColor后,這個(gè)色值會(huì)自動(dòng)傳播到視圖層次結(jié)構(gòu)(以當(dāng)前視圖為根視圖)中所有的子視圖上。如果系統(tǒng)在視圖層次結(jié)構(gòu)中沒有找到一個(gè)非默認(rèn)的tintColor值,則會(huì)使用系統(tǒng)定義的顏色值(藍(lán)色,RGB值為[0,0.478431,1],我們可以在IB中看到這個(gè)顏色)。因此,這個(gè)值總是會(huì)返回一個(gè)顏色值,即我們沒有指定它。

與tintColor屬性相關(guān)的還有個(gè)tintAdjustmentMode屬性,它是一個(gè)枚舉值,定義了tint color的調(diào)整模式。其聲明如下:

  1. var tintAdjustmentMode: UIViewTintAdjustmentMode 

枚舉UIViewTintAdjustmentMode的定義如下:

  1. enum UIViewTintAdjustmentMode : Int { 
  2. case Automatic // 視圖的著色調(diào)整模式與父視圖一致 
  3. case Normal // 視圖的tintColor屬性返回完全未修改的視圖著色顏色 
  4. case Dimmed // 視圖的tintColor屬性返回一個(gè)去飽和度的、變暗的視圖著色顏色 

因此,當(dāng)tintAdjustmentMode屬性設(shè)置為Dimmed時(shí),tintColor的顏色值會(huì)自動(dòng)變暗。而如果我們?cè)谝晥D層次結(jié)構(gòu)中沒有找到默認(rèn)值,則該值默認(rèn)是Normal。

與tintColor相關(guān)的還有一個(gè)tintColorDidChange方法,其聲明如下:

  1. func tintColorDidChange() 

這個(gè)方法會(huì)在視圖的tintColor或tintAdjustmentMode屬性改變時(shí)自動(dòng)調(diào)用。另外,如果當(dāng)前視圖的父視圖的tintColor或tintAdjustmentMode屬性改變時(shí),也會(huì)調(diào)用這個(gè)方法。我們可以在這個(gè)方法中根據(jù)需要去刷新我們的視圖。

示例

接下來我們通過示例來看看tintColor的強(qiáng)大功能(示例盜用了Sam Davies寫的一個(gè)例子,具體可以查看iOS7 Day-by-Day :: Day 6 :: Tint Color,我就負(fù)責(zé)搬磚,用swift實(shí)現(xiàn)了一下,代碼可以在這里下載)。

先來看看最終效果吧(以下都是盜圖,請(qǐng)見諒,太懶了):

這個(gè)界面包含的元素主要有UIButton, UISlider, UIProgressView, UIStepper, UIImageView, ToolBar和一個(gè)自定義的子視圖CustomView。接下來我們便來看看修改視圖的tintColor會(huì)對(duì)這些控件產(chǎn)生什么樣的影響。

在ViewController的viewDidLoad方法中,我們做了如下設(shè)置:

  1. override func viewDidLoad() { 
  2. super.viewDidLoad() 
  3.  
  4. println("\(self.view.tintAdjustmentMode.rawValue)"// 輸出:1 
  5. println("\(self.view.tintColor)"// 輸出:UIDeviceRGBColorSpace 0 0.478431 1 1 
  6.  
  7. self.view.tintAdjustmentMode = .Normal 
  8. self.dimTintSwitch?.on = false 
  9.  
  10. // 加載圖片 
  11. var shinobiHead = UIImage(named: "shinobihead"
  12. // 設(shè)置渲染模式 
  13. shinobiHead = shinobiHead?.imageWithRenderingMode(.AlwaysTemplate) 
  14.  
  15. self.tintedImageView?.image = shinobiHead 
  16. self.tintedImageView?.contentMode = .ScaleAspectFit 

首先,我們嘗試打印默認(rèn)的tintColor和tintAdjustmentMode,分別輸出了[UIDeviceRGBColorSpace 0 0.478431 1 1]和1,這是在我們沒有對(duì)整個(gè)視圖層次結(jié)構(gòu)設(shè)置任何tint color相關(guān)的值的情況下的輸出。可以看到,雖然我們沒有設(shè)置tintColor,但它仍然返回了系統(tǒng)的默認(rèn)值;而tintAdjustmentMode則默認(rèn)返回Normal的原始值。

接下來,我們顯式設(shè)置tintAdjustmentMode的值為Normal,同時(shí)設(shè)置UIImageView的圖片及渲染模式。

當(dāng)我們點(diǎn)擊”Change Color”按鈕時(shí),會(huì)執(zhí)行以下的事件處理方法:

  1. @IBAction func changeColorHandler(sender: AnyObject) { 
  2.  
  3. let hue = CGFloat(arc4random() % 256) / 256.0 
  4. let saturation = CGFloat(arc4random() % 128) / 256.0 + 0.5 
  5. let brightness = CGFloat(arc4random() % 128) / 256.0 + 0.5 
  6.  
  7. let color = UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 1.0
  8. self.view.tintColor = color 
  9. updateViewConstraints() 
  10.  
  11. private func updateProgressViewTint() { 
  12. self.progressView?.progressTintColor = self.view.tintColor 

這段代碼主要是隨機(jī)生成一個(gè)顏色值,并賦值給self.view的tintColor屬性,同時(shí)去更新進(jìn)度條的tintColor值。

注:有些控件的特定組成部件的tint color由特定的屬性控制,例如進(jìn)度就有2個(gè)tint color:一個(gè)用于進(jìn)度條本身,另一個(gè)用于背景。

點(diǎn)擊”Change Color”按鈕,可得到以下效果:

可以看到,我們?cè)谑纠胁⒂袥]手動(dòng)去設(shè)置UIButton, UISlider, UIStepper, UIImageView, ToolBar等子視圖的顏色值,但隨著self.view的tintColor屬性顏色值的變化,這些控件的外觀也同時(shí)跟著改變。也就是說self.view的tintColor屬性顏色值的變化,影響到了以self.view為根視圖的整個(gè)視圖層次結(jié)果中所有子視圖的外觀。

看來tintColor還是很強(qiáng)大的嘛。

在界面中還有個(gè)UISwitch,這個(gè)是用來開啟關(guān)閉dim tint的功能,其對(duì)應(yīng)處理方法如下:

  1. @IBAction func dimTimtHandler(sender: AnyObject) { 
  2. if let isOn = self.dimTintSwitch?.on { 
  3.  
  4. self.view.tintAdjustmentMode = isOn ? .Dimmed : .Normal 
  5.  
  6. updateViewConstraints() 

當(dāng)tintAdjustmentMode設(shè)置Dimmed時(shí),其實(shí)際的效果是整個(gè)色值都變暗(此處無圖可盜)。

另外,我們?cè)谧右晥DCustomView中重寫了tintColorDidChange方法,以監(jiān)聽tintColor的變化,以更新我們的自定義視圖,其實(shí)現(xiàn)如下:

  1. override func tintColorDidChange() { 
  2. tintColorLabel.textColor = self.tintColor 
  3. tintColorBlock.backgroundColor = self.tintColor 

所以方框和”Tint color label”顏色是跟著子視圖的tintColor來變化的,而子視圖的tintColor又是繼承自父視圖的。

在這個(gè)示例中,比較有意思的是還是對(duì)圖片的處理。對(duì)圖像的處理比較簡(jiǎn)單粗暴,對(duì)一個(gè)像素而言,如果它的alpha值為1的話,就將它的顏色設(shè)置為tint color;如果不為1的話,則設(shè)置為透明的。示例中的忍者頭像就是這么處理的。不過我們需要設(shè)置圖片的imageWithRenderingMode屬性為AlwaysTemplate,這樣渲染圖片時(shí)會(huì)將其渲染為一個(gè)模板而忽略它的顏色信息,如代碼所示:

var shinobiHead = UIImage(named: "shinobihead")

// 設(shè)置渲染模式

shinobiHead = shinobiHead?.imageWithRenderingMode(.AlwaysTemplate)

題外話

插個(gè)題外話,跟主題關(guān)系不大。

在色彩理論(color theory)中,一個(gè)tint color是一種顏色與白色的混合。與之類似的是shade color和tone color。shade color是將顏色與黑色混合,tone color是將顏色與灰色混合。它們都是基于Hues色調(diào)的。這幾個(gè)色值的效果如下圖所示:

[[139242]]

一些基礎(chǔ)的理論知識(shí)可以參考Hues, Tints, Tones and Shades: What’s the Difference?或更專業(yè)的一些文章。

小結(jié)

如果我們想指定整個(gè)App的tint color,則可以通過設(shè)置window的tint color。這樣同一個(gè)window下的所有子視圖都會(huì)繼承此tint color。

當(dāng)彈出一個(gè)alert或者action sheet時(shí),iOS7會(huì)自動(dòng)將后面視圖的tint color變暗。此時(shí),我們可以在自定義視圖中重寫tintColorDidChange方法來執(zhí)行我們想要的操作。

有些復(fù)雜控件,可以有多個(gè)tint color,不同的tint color控件不同的部分。如上面提到的UIProgressView,又如navigation bars, tab bars, toolbars, search bars, scope bars等,這些控件的背景著色顏色可以使用barTintColor屬性來處理。

#p#

Build Configurations in Swift

在Objective-C中,我們經(jīng)常使用預(yù)處理指令來幫助我們根據(jù)不同的平臺(tái)執(zhí)行不同的代碼,以讓我們的代碼支持不同的平臺(tái),如:

  1. #if TARGET_OS_IPHONE 
  2.  
  3. #define MAS_VIEW UIView 
  4.  
  5. #elif TARGET_OS_MAC 
  6.  
  7. #define MAS_VIEW NSView 
  8.  
  9. #endif 

在swift中,由于對(duì)C語言支持沒有Objective-C來得那么友好(暫時(shí)不知swift 2到C的支持如何),所以我們無法像在Objective-C中那樣自如而舒坦地使用預(yù)處理指令。

不過,swift也提供了自己的方式來支持條件編譯,即使用build configurations(構(gòu)建配置)。Build configurations已經(jīng)包含了字面量true和false,以及兩個(gè)平臺(tái)測(cè)試函數(shù)os()和arch()。

其中os()用于測(cè)試系統(tǒng)類型,可傳入的參數(shù)包含OSX, iOS, watchOS,所以上面的代碼在swift可改成:

  1. #if os(iOS) 
  2. typealias MAS_VIEW = UIView 
  3. #elseif os(OSX) 
  4. typealias MAS_VIEW = NSView 
  5. #endif 

注:在WWDC 2014的“Sharing code between iOS and OS X”一節(jié)(session 233)中,Elizabeth Reid將這種方式稱為Shimming

遺憾的是,os()只能檢測(cè)系統(tǒng)類型,而無法檢測(cè)系統(tǒng)的版本,所以這些工作只能放在運(yùn)行時(shí)去處理。關(guān)于如何檢測(cè)系統(tǒng)的版本,Mattt Thompson老大在它的Swift System Version Checking一文中給了我們答案。

我們?cè)賮砜纯碼rch()。arch()用于測(cè)試CPU的架構(gòu),可傳入的值包括x86_64, arm, arm64, i386。需要注意的是arch(arm)對(duì)于ARM 64的設(shè)備來說,不會(huì)返回true。而arch(i386)在32位的iOS模擬器上編譯時(shí)會(huì)返回true。

如果我們想自定義一些在調(diào)試期間使用的編譯配置選項(xiàng),則可以使用-D標(biāo)識(shí)來告訴編譯器,具體操作是在”Build Setting”–>“Swift Compiler-Custom Flags”–>“Other Swift Flags”–>“Debug”中添加所需要的配置選項(xiàng)。如我們想添加常用的DEGUB選項(xiàng),則可以在此加上”-D DEBUG”。這樣我們就可以在代碼中來執(zhí)行一些debug與release時(shí)不同的操作,如

  1. #if DEBUG 
  2. let totalSeconds = totalMinutes 
  3. #else 
  4. let totalSeconds = totalMinutes * 60 
  5. #endif 
  6.  
  7. 一個(gè)簡(jiǎn)單的條件編譯聲明如下所示: 
  8.  
  9. #if build configuration 
  10. statements 
  11. #else 
  12. statements 
  13. #endif 

當(dāng)然,statements中可以包含0個(gè)或多個(gè)有效的swift的statements,其中可以包括表達(dá)式、語句、和控制流語句。另外,我們也可以使用&&和||操作符來組合多個(gè)build configuration,同時(shí),可以使用!操作符來對(duì)build configuration取反,如下所示:

  1. #if build configuration && !build configuration 
  2. statements 
  3. #elseif build configuration 
  4. statements 
  5. #else 
  6. statements 
  7. #endif 

需要注意的是,在swift中,條件編譯語句必須在語法上是有效的,因?yàn)榧词惯@些代碼不會(huì)被編譯,swift也會(huì)對(duì)其進(jìn)行語法檢查。

#p#

鍵盤事件

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

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

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

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

1) 當(dāng)我們讓textField1獲取輸入焦點(diǎn)時(shí),打印的日志如下:

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

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

  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 

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

另外還有兩點(diǎn)需要注意的是:

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

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

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

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

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

#p#

零碎

自定義UIPickerView的行

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

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

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

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

  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; 

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

不過,還有個(gè)需要注意的就是,雖然看上去是顯示了3列,但實(shí)際上是按1列來處理的,所以下面的實(shí)現(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” 問題的處理

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

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

編譯器會(huì)報(bào)錯(cuò),提示如下:

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

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

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

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. ...... 
責(zé)任編輯:chenqingxiang 來源: 南峰子的技術(shù)博客
相關(guān)推薦

2015-07-06 10:09:33

iosFoundationNSHashTable

2015-07-07 10:15:56

iOSUIVisualEffweak

2019-07-23 09:00:00

vuejavascript前端

2015-10-21 13:42:54

iOS開發(fā)watch OS2

2014-07-23 10:08:34

Angular前端項(xiàng)目

2015-06-10 10:56:50

iOS開發(fā)技巧

2024-01-09 18:01:38

2024-08-13 08:00:00

2021-10-27 08:00:00

DevSecOps開發(fā)安全

2015-07-28 20:34:01

Android開發(fā)框架

2016-10-25 14:27:16

開源Ruby on RaiWeb框架

2016-12-01 08:36:18

編程云環(huán)境云戰(zhàn)略

2015-10-14 10:54:20

iOS開發(fā)讀書

2020-03-05 12:12:54

數(shù)據(jù)Python開發(fā)

2025-03-24 15:00:13

鴻蒙HarmonyOS

2021-10-18 22:07:05

裝機(jī)顯卡硬件

2018-10-23 10:35:20

react.jsReact面試題前端

2021-01-05 05:15:02

Github 前端倉(cāng)庫(kù)

2022-04-15 09:01:18

前端工具UTF8編碼

2015-04-01 10:55:55

點(diǎn)贊
收藏

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

成人有码在线视频| 亚洲激情在线观看| 精品免费久久久久久久| 全部免费毛片在线播放一个| 久久中文精品| 久久精品国产欧美亚洲人人爽| 欧美日韩一区二区区| 伊人色综合一区二区三区影院视频| 亚洲国产经典视频| 国产精品swag| 自拍偷拍第八页| 激情久久中文字幕| 亚洲天堂视频在线观看| 国产九九九视频| 一级毛片久久久| 一区二区三区资源| 日韩欧美一区二区视频在线播放| av资源免费看| 日本成人在线一区| 午夜精品蜜臀一区二区三区免费 | 国产性生活网站| 久草成人资源| 亚洲电影免费观看高清| 第一区免费在线观看| 黄色aa久久| 亚洲乱码国产乱码精品精的特点| 日韩免费中文专区| 婷婷伊人综合中文字幕| 国产一区二区在线观看免费| 奇米成人av国产一区二区三区| 日本一二三区在线观看| 国产精品欧美三级在线观看| 亚洲成人亚洲激情| 亚洲一区二区偷拍| 电影在线观看一区二区| 五月开心婷婷久久| 精品一区二区三区无码视频| 日本免费在线视频| 日本一区二区三级电影在线观看| 九色综合日本| 天天干天天做天天操| 国产成人在线色| 91九色在线视频| 亚洲国产无线乱码在线观看| 老牛嫩草一区二区三区日本| 欧美激情久久久| 黄色一级片在线免费观看| 91久久久精品国产| 日韩视频一区在线| 法国伦理少妇愉情| 天天躁日日躁狠狠躁欧美巨大小说| 欧美zozo另类异族| 午夜性福利视频| 国产免费区一区二区三视频免费| 欧美男生操女生| 奇米视频7777| 综合久久伊人| 欧美一级免费大片| 国产又粗又猛大又黄又爽| 99久久99九九99九九九| 7799精品视频| 日韩av福利在线观看| 久久久久久亚洲精品美女| 91精品国产综合久久久蜜臀图片| 不用播放器的免费av| 欧美aaaaaaaa| 日韩视频在线观看一区二区| gogo亚洲国模私拍人体| 波多野结衣在线一区二区| 精品国产乱码久久久久久老虎 | 又污又黄的网站| 久久99国产精品成人| 国产精品日日摸夜夜添夜夜av| 在线观看视频二区| 国产在线不卡一区| 国产精品精品软件视频| 四虎影视在线播放| 国产喂奶挤奶一区二区三区| 亚洲国产欧美不卡在线观看 | 国产喷水福利在线视频| 国产99久久久国产精品| 精品一区二区视频| 岛国在线大片| 亚洲视频一区在线| 中文字幕无码精品亚洲资源网久久| www欧美xxxx| 色婷婷av一区二区| 婷婷中文字幕在线观看| 四虎影视国产精品| 亚洲精品黄网在线观看| 人妻少妇精品视频一区二区三区 | 亚洲另类图片色| 久久中文字幕人妻| 99久久国产综合精品成人影院| 日韩视频在线观看免费| 精品在线播放视频| 美女精品自拍一二三四| 国产成人激情小视频| 国产sm主人调教女m视频| 91在线观看免费视频| 日本福利一区二区三区| 大乳在线免费观看| 亚洲国产视频一区| 黄色免费网址大全| 五月天色综合| 精品少妇一区二区| 东京热无码av男人的天堂| 欧美一区2区| 97视频在线观看免费高清完整版在线观看 | 午夜视频在线网站| 秋霞午夜一区二区三区视频| 亚洲欧美日韩成人| 久草视频中文在线| 国产精品久久久久久模特| 国产成人啪精品视频免费网| 国产高清免费观看| 国产精品久久久久久久久晋中| 亚洲区一区二区三区| 白白色在线观看| 在线成人免费视频| 国产成人福利在线| 婷婷综合久久| 国产91对白在线播放| 国产高潮流白浆喷水视频| 国产精品视频在线看| 日本中文字幕网址| 四虎国产精品免费久久5151| 国产一区二区三区欧美| 国产免费观看av| 高清不卡在线观看av| 国产又爽又黄ai换脸| 91福利精品在线观看| 亚洲国产精品久久久久秋霞蜜臀| 成年人午夜剧场| 久久99国产精品久久99果冻传媒| 日韩精品国内| 色婷婷综合久久久中字幕精品久久| 精品国产免费人成在线观看| 懂色av懂色av粉嫩av| 久久99日本精品| 成人做爰www免费看视频网站| 少妇人妻一区二区| 亚洲人精品午夜| 国产又黄又猛视频| 中文字幕久久精品一区二区| 久久天天躁日日躁| 日韩电影在线观看一区二区| 国产成a人亚洲| 国产精品无码乱伦| 亚洲一区二区av| 中文日韩电影网站| 中文字幕在线观看国产| 国产人妖乱国产精品人妖| 99精品视频网站| 精品视频在线观看免费观看| 日韩精品中文字幕久久臀| 成人无码av片在线观看| 亚洲主播在线| 日韩电影天堂视频一区二区| 国产一区二区三区影视| 日韩中文字幕视频在线观看| 波多野结衣小视频| 国产拍欧美日韩视频二区| 国产九九在线视频| 婷婷丁香综合| http;//www.99re视频| 国产盗摄一区二区| 亚洲精品wwwww| av毛片在线免费观看| 国产亚洲一区二区三区在线观看 | 久久精品一区| 国产伦精品一区二区三区照片 | 国产精品色婷婷| 加勒比av中文字幕| 在线看片成人| 国产欧美日韩伦理| 日韩电影免费观| 这里只有视频精品| 一二三四区在线| 亚洲精品视频在线| 久久国产免费视频| 亚洲最大av| 精品综合久久| 秋霞国产精品| 欧美成年人视频网站欧美| 全国男人的天堂网| 欧美视频在线一区| 国产高潮国产高潮久久久91| 国产精品亚洲成人| 日韩精品一区二区免费| 日本成人7777| 日韩免费av在线| 欧美13一16娇小xxxx| 精品国产乱码久久久久久夜甘婷婷| 精品久久久久久久久久久久久久久久| 欧美激情资源网| 无码av免费精品一区二区三区| 久久狠狠婷婷| 强开小嫩苞一区二区三区网站| 亚洲va欧美va人人爽成人影院| 91精品国产一区| 91最新在线| 亚洲成人黄色在线| 亚洲中文字幕在线观看| 图片区小说区国产精品视频| 蜜桃av.com| 久久影音资源网| 亚洲这里只有精品| 国产精品一国产精品k频道56| 综合久久国产| julia中文字幕一区二区99在线| 国产精品99久久久久久白浆小说| 欧美aaaaaaa| 中文字幕在线看视频国产欧美| 日韩性xxxx| 欧美老年两性高潮| 亚洲欧美一区二区三区在线观看| 亚洲天堂2014| 色天使在线视频| 国产精品12区| 九九热精品国产| 日日夜夜一区二区| 免费在线观看视频a| 亚洲传媒在线| 国产精品免费一区二区三区在线观看 | 人妻夜夜添夜夜无码av| 好吊妞视频这里有精品 | 亚洲欧洲在线播放| 日韩一区免费视频| 精品久久久网站| 国产精品老熟女视频一区二区| 欧美在线视频不卡| 五月天激情四射| 亚洲一区二区三区小说| 91视频综合网| 国产精品久久久久久久久图文区| wwwwxxxx国产| 91丝袜美腿高跟国产极品老师| 免费观看一区二区三区| 国产成a人无v码亚洲福利| 91欧美一区二区三区| 免费高清不卡av| 国产精品无码专区av在线播放| 99伊人成综合| 久草热视频在线观看| 影音先锋国产精品| 在线免费一区| 第一会所亚洲原创| 亚洲精品一区国产精品| 日韩在线观看| 伊人情人网综合| 欧美精品系列| 亚洲精品乱码久久久久久蜜桃91 | 成人一道本在线| 亚洲va在线va天堂va偷拍| 六月丁香婷婷色狠狠久久| 99视频免费播放| 青草av.久久免费一区| 天天色综合天天色| 日韩av中文字幕一区二区三区| 黄色免费观看视频网站| 亚洲国产清纯| 中文字幕无码不卡免费视频| 肉丝袜脚交视频一区二区| 国产视频手机在线播放| 亚洲一区一卡| av五月天在线| 国产毛片精品视频| 黄色片免费网址| 成人免费精品视频| 蜜桃色一区二区三区| 国产成都精品91一区二区三| 亚洲午夜精品在线观看| 99久久精品免费看| 黄免费在线观看| 国产日韩高清在线| 成人在线观看高清| 亚洲1区2区3区视频| 四虎精品永久在线| 欧美日韩激情一区二区三区| 91久久精品国产91性色69| 日韩精品一区二区三区视频播放 | 中文字幕亚洲一区在线观看 | 久久综合给合久久狠狠狠97色69| 在线不卡av电影| 中文字幕免费不卡| 激情小说中文字幕| 色999日韩国产欧美一区二区| 亚洲天堂自拍偷拍| 精品福利一二区| 岛国在线大片| 高清欧美性猛交xxxx| 日韩福利一区| 都市激情久久久久久久久久久| 欧美日韩一区二区三区在线电影 | 国产免费无遮挡吸奶头视频| 中文字幕一区二| 日韩免费在线视频观看| 欧美亚洲动漫制服丝袜| 国产精品久久影视| 精品一区二区三区四区在线| 91短视频版在线观看www免费| 色综合久久悠悠| 国产私拍福利精品视频二区| 国产精品.com| 国产高清一区二区| 日韩精品一区二区在线视频| 免费成人在线影院| 日韩片在线观看| 一区二区日韩电影| 销魂美女一区二区| 亚洲欧洲另类国产综合| 精品人妻一区二区色欲产成人| 欧美精品xxxxbbbb| 撸视在线观看免费视频| 欧美风情在线观看| 永久免费观看精品视频| 日本黑人久久| 亚洲国产美女| 少妇伦子伦精品无吗| 国产日韩欧美不卡| 欧美bbbbbbbbbbbb精品| 51精品久久久久久久蜜臀| 国内在线精品| 欧美激情一区二区三区在线视频观看 | 婷婷精品视频| 日本xxxxxxxxxx75| 国产成人在线看| 99国产精品无码| 欧美亚洲禁片免费| 国产尤物视频在线| 欧美在线视频观看| 欧美日韩中出| 公共露出暴露狂另类av| 青青草原综合久久大伊人精品优势 | 日韩亚洲欧美中文三级| 搞黄网站在线观看| 成人黄色免费片| 婷婷综合伊人| 午夜福利123| 亚洲精选免费视频| 999国产精品视频免费| 久久九九热免费视频| 亚洲精品伦理| 日韩欧美激情一区二区| 日韩中文欧美在线| 亚洲自拍偷拍图| 欧美怡红院视频| av在线电影免费观看| 国产欧美日韩精品丝袜高跟鞋| 欧美日韩久久精品| 奇米影视亚洲色图| 国产馆精品极品| 欧美黄片一区二区三区| 欧美视频精品在线观看| 美女欧美视频在线观看免费 | 久久精品2019中文字幕| 成人动漫视频在线观看| 亚洲国产精品女人| 国产iv一区二区三区| 久草视频在线免费看| 亚洲成人黄色网址| 涩涩涩视频在线观看| 久久综合九九| 午夜在线精品| 国产精品偷伦视频免费观看了| 中文字幕一区二区视频| 午夜精品久久久久久久爽| 久久久久久香蕉网| 日韩mv欧美mv国产网站| 尤蜜粉嫩av国产一区二区三区| 国产精品不卡一区| 国产探花精品一区二区| 欧美极品美女电影一区| 成人av影音| 18禁网站免费无遮挡无码中文| 久久久久久久精| 97人妻人人澡人人爽人人精品| 欧美国产日韩一区二区在线观看| 噜噜噜天天躁狠狠躁夜夜精品| 看欧美ab黄色大片视频免费| 亚洲视频免费在线| 亚洲av成人精品毛片| 日韩免费观看视频| 中文字幕亚洲综合久久五月天色无吗''| 免费观看黄网站| 午夜久久久影院| www在线播放| 91手机在线观看| 免费视频一区| 男人在线观看视频| 精品香蕉一区二区三区| 国产成人免费av一区二区午夜| 亚洲色欲久久久综合网东京热| 国产1区2区3区精品美女| www日韩精品| www.亚洲成人| 免费一区二区三区视频导航| 小日子的在线观看免费第8集| 日韩欧美极品在线观看|