日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解 iOS 系統(tǒng)中的視圖動畫

瀏覽:18日期:2022-09-16 18:33:35

動畫為用戶界面的狀態(tài)轉(zhuǎn)換提供了流暢的可視化效果, 在 iOS 中大量使用了動畫效果, 包括改變視圖位置、 大小、 從可視化樹中刪除視圖, 隱藏視圖等。 你可以考慮用動畫效果給用戶提供反饋或者用來實(shí)現(xiàn)有趣的特效。

在 iOS 系統(tǒng)中, Core Animation 提供了內(nèi)置的動畫支持, 創(chuàng)建動畫不需要任何繪圖的代碼, 你要做的只是激發(fā)指定的動畫, 接下來就交給 Core Animation 來渲染, 總之, 復(fù)雜的動畫只需要幾行代碼就可以了。

哪些屬性可以添加動畫效果

根據(jù) iOS 視圖編程指南中說明, UIView 內(nèi)置支持為下列屬性添加動畫效果:

Frame 可以改變視圖相對于上一級視圖的位置和大小。 (如果視圖已經(jīng)經(jīng)過了縮放、 旋轉(zhuǎn)、平移之類的變換, 則需要修改 Center 和 Bounds 屬性) Bounds 改變視圖大小。 Center 改變視圖相對于上級視圖的位置。 Transform 相對于中心點(diǎn)進(jìn)行視圖縮放、旋轉(zhuǎn)和平移, 這個屬性只能進(jìn)行二維轉(zhuǎn)換。 (如果要進(jìn)行三維轉(zhuǎn)換, 則必須用 CoreAnimation 操作視圖的 Layer 屬性。) Alpha 改變視圖的透明度。 BackgroundColor 修改視圖的背景色。 ContentStretch 改變視圖內(nèi)容在視圖的可用空間內(nèi)的拉伸方式。 為視圖的屬性變化添加動畫

為了給屬性的變化添加動畫效果, 需要把修改這些屬性的代碼放到指定的動畫代碼段 (animation block) 中。 只有在動畫代碼段中修改支持動畫的屬性, 才能添加動畫效果。

使用 Begin/Commit 方法做動畫

在 iOS 3.0 以及之前的系統(tǒng)中, 必須使用 UIView 的類方法 beginAnimations:context: 和 commitAnimations 來定義動畫代碼段, 在 begin 和 commit 之間的代碼會在特殊的動畫線程中運(yùn)行, 因此不會阻塞主線程, 比如說要切換兩個視圖, 代碼應(yīng)該是這樣子的:

[UIView beginAnimations:@'ToggleViews' context:nil];[UIView setAnimationDuration:1.0]; // Make the animatable changes.firstView.alpha = 0.0;secondView.alpha = 1.0; // Commit the changes and perform the animation.[UIView commitAnimations];

在 Xamarin.iOS (MonoTouch) 平臺下, begin/end 方法對應(yīng)的綁定為:

public static void BeginAnimations (string animation) public static void BeginAnimations (string animationID, IntPtr context) public static void CommitAnimations ()

上面的切換視圖的 C# 版本代碼為:

UIView.BeginAnimations('ToggleViews');UIView.SetAnimationDuration(1.0)this.FirstView.Alpha = 0.0;this.SecondView.Alpha = 1.0;UIView.CommitAnidations();

在 Begin/Commit 函數(shù)之間, 可以通過下面的方法設(shè)置動畫的參數(shù)和選項(xiàng):

setAnimationStartDate: setAnimationDelay: setAnimationDuration: setAnimationCurve: setAnimationRepeatCount: setAnimationRepeatAutoreverses: setAnimationDelegate: setAnimationWillStartSelector: setAnimationDidStopSelector: setAnimationBeginsFromCurrentState:

注意: 如果不是為了支持很舊的設(shè)備, 則推薦使用下面的 lambda (block based method) 來實(shí)現(xiàn)動畫效果, 雖然 begin/commit 還能夠使用, 按照官方的說法, 對新系統(tǒng)來說是不推薦的了。

使用 lambda (block based method) 做動畫

在 iOS 4.0 以后, 引入了代碼塊 (code block) 的概念, 可以使用代碼塊來初始化動畫, 這也是在 iOS 4.0 之后蘋果推薦的做法, iOS SDK 提供的 API 如下:

animateWithDuration:animations: animateWithDuration:animations:completion: animateWithDuration:delay:options:animations:completion:

而在 Xamarin.iOS (MonoTouch) 平臺下, 這些方法被綁定為下列方法:

public static void Animate(double duration, NSAction animation) public static void Animate (double duration, NSAction animation, NSAction completion) public static void Animate (double duration, double delay, UIViewAnimationOptions options, NSAction animation, NSAction completion)

還是切換視圖的動畫, 如果用 objective-c 的代碼塊來實(shí)現(xiàn), 則應(yīng)該是這樣子的:

[UIView animateWithDuration:1.0 animations:^{ self.firstView.alpha = 0.0; self.secondView.alpha = 1.0;}];

如果用 C# 來實(shí)現(xiàn)的話, 應(yīng)該是這樣:

UIView.Animate(1.0, () => { this.FirstView.Alpha = 0.0f; this.SecondView.Alpha = 1.0f;});

這樣就實(shí)現(xiàn)了一個簡單的漸變動畫, 并且只能運(yùn)行一次, 通常不能滿足需求, 再來一個復(fù)雜點(diǎn)兒的:

[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{ self.firstView.alpha = 0.0; } completion:^(BOOL finished){ [UIView animateWithDuration:1.0 delay:1.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ self.firstView.alpha = 1.0; } completion:nil];}];

對應(yīng)的 C# 代碼如下:

UIView.Animate( 1.0, 0.0, UIViewAnimationOptions.CurveEaseIn, () => this.FirstView.Alpha = 0.0f, () => { UIView.Animate( 1.0, 1.0, UIViewAnimationOptions.CurveEaseOut, () => this.FirstView.Alpha = 1.0f, null ); });嵌套動畫

iOS 支持嵌套的動畫, 也就是說在一個動畫代碼段中, 可以再開始另外一個動畫代碼段, 而不必等當(dāng)前動畫完成, 嵌套的動畫會同時開始運(yùn)行, 默認(rèn)繼承原來動畫的延時、 時間長度、 加速曲線等, 不過這些選項(xiàng)也能被覆蓋。 例如:

[UIView animateWithDuration:1.0 delay:1.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ self.firstView.alpha = 0.0f; // 這里開始一個新的動畫 [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionOverrideInheritedCurve |UIViewAnimationOptionCurveLinear |UIViewAnimationOptionOverrideInheritedDuration |UIViewAnimationOptionRepeat |UIViewAnimationOptionAutoreverse animations:^{[UIView setAnimationRepeatCount:2.5];self.secondView.alpha = 0.0f; } completion:nil]; } completion:nil];

對應(yīng)的 C# 代碼如下:

UIView.Animate( 1.0, 1.0, UIViewAnimationOptions.CurveEaseIn, () => { this.FirstView.Alpha = 0.0; UIView.Animate( 1.0, 1.0, UIViewAnimationOptions.OverrideInheritedCurve | UIViewAnimationOptions.CurveLinear | UIViewAnimationOptions.OverrideInheritedDuration | UIViewAnimationOptions.Repeat | UIViewAnimationOptions.Autoreverse, () => {UIView.SetAnimationRepeatCount(2.f);this.SecondView.Alpha = 0.0; }, null ); }, null);

對于使用 Begin/Commit 方法的動畫, 也可以嵌套調(diào)用 Begin/Commit 方法來實(shí)現(xiàn)嵌套的動畫, 例如:

UIView.BeginAnimations('Animation1');// Animation code goes here // Start another animation UIView.BeginAnimations('Nested animation'); // nested animations code goes here. UIView.CommitAnimations();// other codeUIView.CommitAnimations();

這段 C# 代碼對應(yīng)的 ObjC 代碼很簡單, 就不寫出來了。

實(shí)現(xiàn)動畫的自動翻轉(zhuǎn)

當(dāng)創(chuàng)建自動翻轉(zhuǎn)指定次數(shù)的動畫時, 考慮將重復(fù)次數(shù)設(shè)置為非整數(shù)值。 因?yàn)閷τ谧詣臃D(zhuǎn)的動畫來說, 每次循環(huán)都是從原始值變化到目標(biāo)值再變化回原始值, 如果希望動畫結(jié)束之后停留在目標(biāo)值, 需要將重復(fù)次數(shù)設(shè)置加上 0.5 , 否則, 動畫回慢慢變回原始值, 再迅速變化到目標(biāo)值, 這可能不是原來期望的動畫效果。

創(chuàng)建視圖切換動畫

視圖切換動畫可以減少修改可視化樹時引起的界面上的突變, iOS 系統(tǒng)中大量使用了視圖切換動畫, 視圖切換動畫主要有下面兩種場景:

修改子視圖 替換子視圖

注意: 不要把視圖切換和視圖控制器的切換混淆(顯示一個模式對話框、將視圖控制器推入導(dǎo)航堆棧等), 視圖切換改變的僅僅是視圖的可視化樹, 視圖控制器是不變的, 更多信息可以參考iOS視圖控制器編程指南。

修改子視圖

可以修改子視圖的可見性用來表示當(dāng)前視圖的不同的狀態(tài), 看下面的兩個視圖切換的例子,在 iOS 4.0 之前, 需要將視圖切換動畫添加到 Begin/Commit 動畫之間, 代碼如下:

在 iOS 4.0 之后, 可以使用 transitionWithView:duration:options:animations:completion:

[UIView beginAnimations:@'toggleView' context:nil];[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];[UIView setAnimationDuration:1.0];// animation goes hereself.currentView.hidden = YES;self.swapView.hidden = NO;[UIView commitAnimations];

這里只有動畫部分的代碼, 動畫完成之后請參考 setAnimationDelegate: 方法設(shè)置并實(shí)現(xiàn) UIAnimationDelegate 。

替換子視圖

要進(jìn)行子視圖的替換, 需要用到 transitionFromView:toView:duration:options:completion: 方法, 示例代碼如下:

UIView *fromView = (self.displayPrimary ? self.view : self.secondView);UIView *toView = (self.displayPrimary ? self.secondView : self.view);UIViewAnimationOptions option = (self.displayPrimary ? UIViewAnimationOptionTransitionFlipFromRight: UIViewAnimationOptionTransitionFlipFromLeft);[UIView transitionFromView:fromView toView:toView duration:1.0 options:option completion:^(BOOL finished) { if (finished) { self.displayPrimary = !self.displayPrimary; } }];鏈接多個動畫

有了上面的知識, 鏈接多個動畫就非常簡單了:

對于 lambda 或 block-based 方法的動畫, 使用 complete 回調(diào)函數(shù)即可; 對于 Begin/Commit 方法的動畫, 需要實(shí)現(xiàn)一個 UIAnimationDelegate , 然后調(diào)用 setAnimationDelegate 方法設(shè)置 Delegate 即可。

以上就是詳解 iOS 系統(tǒng)中的視圖動畫的詳細(xì)內(nèi)容,更多關(guān)于iOS 視圖動畫的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: IOS
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品videossex久久发布| 亚洲精品1区| 蜜桃视频在线观看一区| 久久五月天小说| 久久国内精品自在自线400部| 蜜桃免费网站一区二区三区| 黄色日韩精品| 伊人精品一区| 91精品一区二区三区综合在线爱| 国产不卡av一区二区| 国产一区二区三区探花| 日韩综合一区| 快播电影网址老女人久久| 日本一二区不卡| 色婷婷色综合| 欧美日韩视频网站| 日本韩国欧美超级黄在线观看| 亚洲综合电影| 在线观看精品| 日韩欧美网址| 国产一区亚洲| 亚洲欧美网站| 日本久久一区| 国产日韩欧美一区二区三区 | 国产精品嫩草影院在线看| 国产精品久久久久9999高清| 国产精品nxnn| 精品三级av| 日韩av福利| 国产一区二区高清| 日韩av网站在线免费观看| 国产精品chinese| 国产综合色区在线观看| 欧美女激情福利| 综合激情一区| 久久伊人亚洲| 在线日韩av| 亚洲免费毛片| 麻豆精品蜜桃视频网站| 日韩精品免费一区二区在线观看| 伊人影院久久| 欧美自拍一区| 精品五月天堂| 国产99久久| 中文字幕日本一区二区| 国产免费av国片精品草莓男男| 91视频久久| 亚洲欧美日韩精品一区二区| 国产欧美日韩在线观看视频| 日韩欧美不卡| 亚洲精品美女91| 精品一区二区三区中文字幕| 欧美99久久| 国产亚洲欧美日韩在线观看一区二区| 国产乱码精品一区二区三区四区| 成人精品中文字幕| 亚洲精品成人一区| 麻豆91精品视频| 欧美日韩国产在线一区| 国产日韩欧美在线播放不卡| 国内精品99| 久久99久久人婷婷精品综合| 亚洲免费黄色| 激情久久99| 首页国产欧美日韩丝袜| 国产一区一一区高清不卡| 视频精品一区二区| 岛国av在线网站| 视频一区中文字幕精品 | 国产精品综合| 日韩电影二区| 日本不卡视频在线| 成人精品国产亚洲| 欧美少妇精品| 91精品美女| 亚洲成人av观看| 亚洲精品看片| 亚洲风情在线资源| 日本在线观看不卡视频| 国产一区丝袜| 亚洲一区二区三区四区五区午夜| 日韩一区二区三免费高清在线观看| 欧美国产美女| 男女激情视频一区| 岛国精品一区| 亚洲精品小说| 国产欧美高清| 亚洲不卡av不卡一区二区| 亚洲一区有码| 91亚洲人成网污www| 免费在线观看日韩欧美| 高清av一区| 99精品在线观看| 久久天堂影院| 久久高清国产| 国产精品久久久久久久久妇女| 午夜亚洲精品| 中文在线а√天堂| 日韩精品三级| 久久要要av| 91九色综合| 一区福利视频| 日韩欧美二区| 麻豆成人91精品二区三区| 亚洲午夜久久| 欧美一区三区| 精品视频一区二区三区在线观看 | 蜜桃视频在线观看一区二区| 国产资源在线观看入口av| 日韩av一二三| 免费日韩一区二区| 亚洲成av在线| 欧美日韩亚洲一区二区三区在线| 日韩欧美一区二区三区在线观看| 国产精品一区二区av日韩在线| 香蕉精品久久| 亚洲一级少妇| 精品三级在线| 青青草精品视频| 三级欧美在线一区| 久久蜜桃资源一区二区老牛| 你懂的国产精品永久在线| 美女国产一区| 国产综合精品一区| 国产精品成人自拍| 国产亚洲久久| 亚洲精品在线二区| 视频小说一区二区| 老司机精品视频网| 国产调教一区二区三区| 在线精品一区二区| 一区在线观看| 久久精品高清| 天堂av在线| 蜜臀国产一区| 91青青国产在线观看精品| 国产精品久久免费视频| 视频一区中文字幕精品| 亚洲专区欧美专区| 米奇777超碰欧美日韩亚洲| 日韩欧美看国产| 日本一区二区免费高清| 亚洲综合电影一区二区三区| 丝袜亚洲精品中文字幕一区| 亚洲一区观看| 99视频精品免费观看| 免费污视频在线一区| 成人精品中文字幕| 亚洲播播91| 日韩毛片视频| 色综合www| 国产一区二区三区视频在线| 色婷婷精品视频| 色偷偷偷在线视频播放 | 欧美中文高清| 国产日本精品| 亚洲精品乱码日韩| 天堂俺去俺来也www久久婷婷| 综合一区二区三区| 亚洲人成在线影院| 日韩精品亚洲aⅴ在线影院| 四虎国产精品免费久久| 国产精品nxnn| 福利视频一区| 婷婷综合六月| 激情五月色综合国产精品| 亚洲精品在线观看91| 国产亚洲永久域名| 免费看黄色91| 日韩av电影一区| 国内揄拍国内精品久久| а√天堂8资源在线| 中文字幕系列一区| 在线看片不卡| 在线精品福利| 国产日韩高清一区二区三区在线| 国产精品宾馆| 亚洲精品日韩久久| 国产午夜精品一区在线观看| 老司机免费视频一区二区| 黄色aa久久| 亚洲精品极品少妇16p| 亚洲综合图色| 国产欧美日韩亚洲一区二区三区| 精品三级在线| 欧美日韩国产高清电影| 夜久久久久久| 日韩精品久久理论片| 精品久久91| 99精品视频在线| 国产亚洲久久| 日韩国产一区二区| 久久亚洲欧美| 国产亚洲精品美女久久久久久久久久| 欧美aaaaaa午夜精品| 亚洲高清成人| 日韩二区三区四区| 日韩电影免费网址| 日韩在线观看一区二区| 国产精品亚洲综合在线观看|