精品欧美一区二区三区在线观看 _久久久久国色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)

欧美老女人性生活| 欧美中文字幕久久| 国产高清精品一区二区| 精品欧美一区二区三区免费观看 | 亚洲夜间福利| 日韩精品免费在线视频观看| 视色视频在线观看| www.综合网.com| 国产三级欧美三级日产三级99| 国产欧美在线播放| 一区二区三区视频免费看| 欧美日中文字幕| 欧美精品粉嫩高潮一区二区| 中文字幕无码精品亚洲资源网久久| 丁香婷婷在线| 成人精品小蝌蚪| 国产精品永久免费视频| 国产亚洲欧美久久久久| 第一会所sis001亚洲| 亚洲精品一区二区三区福利| 91极品尤物在线播放国产| 92久久精品| 亚洲欧美综合网| 欧美日韩一区二区视频在线观看| 国产成人精品a视频| 青青草精品视频| 91高清免费在线观看| 国产性xxxx| 水蜜桃久久夜色精品一区| 日韩经典中文字幕在线观看| 91传媒理伦片在线观看| 精品一区视频| 欧美日韩国产免费一区二区| 国产免费毛卡片| 丁香高清在线观看完整电影视频| 亚洲欧洲三级电影| 91九色极品视频| 国产精品18p| 天天综合久久| 中文字幕日韩视频| 亚洲国产欧美视频| eeuss国产一区二区三区四区| 欧美午夜免费电影| 国产淫片av片久久久久久| 久久不射影院| 亚洲免费在线视频一区 二区| 日韩一本精品| 免费在线视频一级不卡| 91亚洲资源网| 精品伦精品一区二区三区视频| 亚洲AV无码成人片在线观看| 精品一区二区日韩| 国产精品专区一| 进去里视频在线观看| 国产精品99免费看| 久久国产精品视频| 久久精品国产亚洲AV成人婷婷| 亚洲精品亚洲人成在线| 欧美精品一区二区三| 极品人妻一区二区| 亚洲网一区二区三区| 日韩欧美一区中文| 欧美xxxx日本和非洲| 秋霞一区二区| 精品久久久久久无| 日本少妇xxxx| 亚洲涩涩av| 一本大道亚洲视频| 正在播放国产对白害羞| 国产精品国产一区| 久久国产精品久久久久久久久久| 欧美精品videos极品| 亚洲一级二级| 日本亚洲欧美三级| 在线观看视频中文字幕| 狠狠色丁香婷婷综合久久片| 91精品视频免费| 午夜久久久久久噜噜噜噜| 国产99久久久国产精品潘金网站| 国产成人精品免费视频大全最热| 色婷婷av一区二区三| 91亚洲男人天堂| 色噜噜一区二区| 国产三区视频在线观看| 一区二区三区不卡在线观看 | 99国内精品| 另类视频在线观看| 国产一级二级毛片| 日日摸夜夜添夜夜添国产精品 | 全国精品免费看| 亚洲色图第一页| 欧美成人777| 国产精品亚洲欧美| 国产精品伦子伦免费视频| 亚洲中文字幕在线一区| 成人精品国产免费网站| 视频一区二区三区免费观看| 国产福利在线播放麻豆| 亚洲高清视频的网址| 日韩亚洲在线视频| 精品中文字幕一区二区三区| 亚洲欧美另类中文字幕| 男人与禽猛交狂配| 国产亚洲网站| 91精品久久久久久蜜桃| 国产女主播在线直播| 亚洲一区二区3| 天天碰免费视频| 成人另类视频| 日韩一区二区三区在线播放| 日韩大片免费在线观看| 精品一区二区综合| 免费看成人片| 波多野结衣乳巨码无在线观看| 色素色在线综合| 丰满岳乱妇一区二区 | k8久久久一区二区三区| 一区二区三区免费看| 亚洲美女尤物影院| 日韩精品一区二区三区视频| 91无套直看片红桃在线观看| 欧美亚洲三区| 国产一区二区精品在线| 国产1区在线| 欧美日韩一区二区欧美激情 | 国产精品久久久久桃色tv| 国产 福利 在线| swag国产精品一区二区| yellow中文字幕久久| 国产成人自拍偷拍| 久久综合av免费| 亚洲一区二区三区av无码| 成人毛片免费| 尤物99国产成人精品视频| 日韩精品在线观看免费| 粉嫩av亚洲一区二区图片| 在线精品日韩| 色999久久久精品人人澡69 | 丁香五月网久久综合| av免费在线观看网址| 欧美日韩成人综合在线一区二区 | 亚洲高清视频网站| 国产精品乱人伦| 精品日韩久久久| 人人狠狠综合久久亚洲婷| 国产精品va在线播放我和闺蜜| 天堂在线中文| 欧美性69xxxx肥| 欧美色图亚洲激情| 爽好久久久欧美精品| 久久精品成人一区二区三区蜜臀| 女人让男人操自己视频在线观看| 亚洲国产成人久久综合一区| 国产成人精品亚洲男人的天堂| 成人性色生活片| 欧美精品久久久久久久久久久| 亚洲一区二区三区四区电影| 欧美激情精品久久久久久黑人| 国产夫绿帽单男3p精品视频| 玉米视频成人免费看| 亚洲av综合色区无码另类小说| 欧美fxxxxxx另类| 国产精品国产精品国产专区不卡| 电影k8一区二区三区久久| 亚洲精品国精品久久99热一| 免费黄色网址在线| 国产欧美日韩在线看| 欧美第一页浮力影院| 伊人久久大香线蕉精品组织观看| 97人人香蕉| 国模私拍一区二区国模曼安| 亚洲欧美第一页| 中文字幕 亚洲视频| |精品福利一区二区三区| 欧美体内she精高潮| 亚洲小说区图片区| 日韩精品av一区二区三区| 日本中文字幕视频一区| 欧美精品xxx| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美老年两性高潮| 日本免费一二三区| 国产精品久线在线观看| 伊人影院在线观看视频| 亚洲一区二区三区高清不卡| 午夜精品一区二区三区四区 | 日韩av中文字幕一区二区三区| 亚洲一区3d动漫同人无遮挡 | 国产一区二区三区四区五区美女 | 亚洲性视频网址| 精品国产无码一区二区| 欧美视频免费在线| 色偷偷www8888| 91一区二区在线| 青青草精品在线| 噜噜噜在线观看免费视频日韩| 制服国产精品| 天天躁日日躁狠狠躁欧美巨大小说| 国产精品稀缺呦系列在线 | 国产精品免费久久久久影院| 精品精品导航| 最近的2019中文字幕免费一页| 亚洲精品字幕在线| 欧美日韩国产电影| 天天干在线播放| 一区二区国产视频| 日本一卡二卡在线播放| 不卡的av电影| 国产又粗又长又爽又黄的视频| 久久aⅴ国产紧身牛仔裤| 国产一二三四五| 精品一区二区三区中文字幕老牛| 国产精品久久久对白| 欧美高清免费| 国产成人激情视频| 国产高清视频色在线www| 久久伊人精品视频| 成人在线视频成人| 亚洲美女视频网站| 人妻妺妺窝人体色www聚色窝 | 亚洲国产成人tv| 男人av资源站| 亚洲国产成人私人影院tom| 视频免费在线观看| 高清国产一区二区| 国产在线视频三区| 久久狠狠亚洲综合| xxxx一级片| 玖玖精品视频| 久草资源站在线观看| 激情欧美一区| 成人av在线不卡| 欧美国产激情| 波多野结衣与黑人| 亚洲综合激情在线| 国产卡一卡二在线| 66国产精品| 懂色av粉嫩av蜜臀av| 91久久夜色精品国产按摩| 亚洲精品成人久久久998| 精品国产一区二区三区av片| 麻豆精品视频| 精品影片在线观看的网站| 久久精品国产精品青草色艺| 欧美电影完整版在线观看| 国产九色精品| 天美av一区二区三区久久| 久久波多野结衣| 五月天亚洲色图| 久久日韩精品| 精品国产一区二区三区小蝌蚪| 日本日本精品二区免费| 免费成人网www| 三级三级久久三级久久18| 成人羞羞动漫| 亚洲一区二区在线看| 91精品一区国产高清在线gif| 一区二区在线观| 综合久久一区| av在线播放天堂| 国产精品日韩| 国产成人手机视频| 久久99精品久久久久婷婷| www.国产福利| 成人精品免费看| 欧美图片第一页| 国产精品国产自产拍高清av王其| 欧美人与性囗牲恔配| 中文字幕的久久| 亚洲一二三四五| hitomi一区二区三区精品| 亚洲av无码成人精品国产| 91丝袜美腿高跟国产极品老师| 国产亚洲无码精品| 国产精品久久久久毛片软件| 日韩a级片在线观看| 午夜精品久久久久久久| 狠狠人妻久久久久久| 欧美日韩一区在线| 精品黑人一区二区三区国语馆| 亚洲精品成人网| 搞黄视频在线观看| 九九久久久久99精品| 是的av在线| 91久热免费在线视频| 久久97精品| 在线免费观看成人网| 亚洲国产免费看| 天天视频天天爽| av在线综合网| 少妇愉情理伦三级| 亚洲sss视频在线视频| 夜夜躁很很躁日日躁麻豆| 精品成人a区在线观看| 成人激情电影在线看| 欧美丰满片xxx777| 欧美日韩精品一区二区三区视频| 亚洲精品欧美日韩| 国产亚洲欧美日韩在线观看一区二区 | 亚洲一区亚洲二区| 久久成人av| 欧美一级中文字幕| 人人精品人人爱| 7788色淫网站小说| 亚洲激情综合网| 亚洲国产无线乱码在线观看| 精品成人一区二区三区四区| 久久77777| 奇米4444一区二区三区| 一区二区三区四区视频免费观看| 日韩精品极品视频在线观看免费| 红桃视频国产精品| www.亚洲自拍| 国产视频亚洲色图| 国产一级特黄a高潮片| 欧美日韩国产天堂| 国产精品毛片一区二区三区四区| 久久久久久久国产精品| 韩国三级大全久久网站| 亚洲欧美日产图| 久久在线精品| 野花社区视频在线观看| 亚洲韩国精品一区| 国产不卡精品视频| 久久av在线看| 欧美aaaaaa| 日韩欧美精品在线不卡| 亚洲欧美日韩一区在线观看| 折磨小男生性器羞耻的故事| 亚洲欧美日韩精品久久久久| 在线观看免费黄色小视频| 亚洲视频免费一区| 黄色成人免费网| 久久国产精品一区二区三区| 在线日韩中文| 在线观看日本www| 综合中文字幕亚洲| 懂色av中文字幕| 亚洲图片制服诱惑| 精品视频一区二区三区四区五区| 蜜桃传媒一区二区| 午夜在线一区二区| 老司机av网站| 亚洲制服丝袜一区| 精品毛片一区二区三区| 精品中文字幕在线2019| 免费精品一区| 激情五月婷婷六月| 成人av片在线观看| 好吊操这里只有精品| 亚洲精品成人免费| 成人爽a毛片免费啪啪| 欧美久久久久久久| 日韩 欧美一区二区三区| 黑人と日本人の交わりビデオ| 欧美亚洲国产一区二区三区| 亚洲天天影视| 亚洲va码欧洲m码| 国模 一区 二区 三区| 污污污www精品国产网站| 欧美日韩一区二区三区| 可以免费看污视频的网站在线| 国产精品va在线播放| 亚洲国产精品成人| 一二三区视频在线观看| 五月婷婷欧美视频| 青青草超碰在线| 国产精品日韩av| 欧美 日韩 国产一区二区在线视频| 美女流白浆视频| 色综合中文字幕| 麻豆免费在线视频| 国产精品二区三区四区| 亚洲欧美清纯在线制服| 小嫩苞一区二区三区| 日韩欧美第一区| sese综合| 在线观看成人av| 成人av动漫在线| 国产一级片免费视频| 欧美国产日韩一区二区三区| 日韩欧美黄色| 午夜啪啪小视频| 性久久久久久久| 69久久精品| 国产精品日韩高清| 日本在线不卡视频| 免费一级全黄少妇性色生活片| 精品视频久久久久久久| 日本黄色成人| 男人操女人逼免费视频| 国产精品久久看| 亚洲aaaaaaa| 国产日韩欧美成人| 国产婷婷精品| 久久中文免费视频| 亚洲欧美日韩久久久久久| 免费一区二区三区在线视频| www.日日操| 午夜影院在线观看欧美|