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

您的位置:首頁技術文章
文章詳情頁

詳解 iOS 系統中的視圖動畫

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

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

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

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

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

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

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

使用 Begin/Commit 方法做動畫

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

[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 方法對應的綁定為:

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 函數之間, 可以通過下面的方法設置動畫的參數和選項:

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

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

使用 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 的代碼塊來實現, 則應該是這樣子的:

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

如果用 C# 來實現的話, 應該是這樣:

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

這樣就實現了一個簡單的漸變動畫, 并且只能運行一次, 通常不能滿足需求, 再來一個復雜點兒的:

[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];}];

對應的 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 支持嵌套的動畫, 也就是說在一個動畫代碼段中, 可以再開始另外一個動畫代碼段, 而不必等當前動畫完成, 嵌套的動畫會同時開始運行, 默認繼承原來動畫的延時、 時間長度、 加速曲線等, 不過這些選項也能被覆蓋。 例如:

[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];

對應的 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 方法的動畫, 也可以嵌套調用 Begin/Commit 方法來實現嵌套的動畫, 例如:

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# 代碼對應的 ObjC 代碼很簡單, 就不寫出來了。

實現動畫的自動翻轉

當創建自動翻轉指定次數的動畫時, 考慮將重復次數設置為非整數值。 因為對于自動翻轉的動畫來說, 每次循環都是從原始值變化到目標值再變化回原始值, 如果希望動畫結束之后停留在目標值, 需要將重復次數設置加上 0.5 , 否則, 動畫回慢慢變回原始值, 再迅速變化到目標值, 這可能不是原來期望的動畫效果。

創建視圖切換動畫

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

修改子視圖 替換子視圖

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

修改子視圖

可以修改子視圖的可見性用來表示當前視圖的不同的狀態, 看下面的兩個視圖切換的例子,在 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: 方法設置并實現 UIAnimationDelegate 。

替換子視圖

要進行子視圖的替換, 需要用到 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 回調函數即可; 對于 Begin/Commit 方法的動畫, 需要實現一個 UIAnimationDelegate , 然后調用 setAnimationDelegate 方法設置 Delegate 即可。

以上就是詳解 iOS 系統中的視圖動畫的詳細內容,更多關于iOS 視圖動畫的資料請關注好吧啦網其它相關文章!

標簽: IOS
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人精品天堂一区二区三区| 中文字幕在线看片| 精品在线播放| 色偷偷色偷偷色偷偷在线视频| 精品三级av| 久久精品理论片| 精品一区二区三区四区五区| 国产精品www994| 久久香蕉网站| 91亚洲人成网污www| 精品国产亚洲日本| 福利欧美精品在线| 人在线成免费视频| 久久精品国产大片免费观看| 日韩午夜一区| 亚洲丝袜啪啪| 在线免费观看亚洲| 日韩精品久久理论片| 日韩国产高清在线| 国产精品成人国产| 欧美国产偷国产精品三区| 性欧美videohd高精| 久久国产精品成人免费观看的软件| 久久一级电影| 天堂va蜜桃一区二区三区| 日本亚洲不卡| 麻豆精品新av中文字幕| 日韩伦理福利| 夜夜嗨网站十八久久| 亚洲精品影视| 国产精品亚洲欧美日韩一区在线| 国际精品欧美精品| 欧美 日韩 国产一区二区在线视频| 亚洲在线网站| 国产精品亚洲四区在线观看| 国产亚洲一区二区手机在线观看| 9色国产精品| 国产精品一区二区三区www| 国产理论在线| 99国产精品久久久久久久成人热| 老牛影视一区二区三区| 国产精品亚洲一区二区在线观看| 在线天堂中文资源最新版| 亚洲国产一区二区三区在线播放| 涩涩涩久久久成人精品| 福利视频一区| 在线看片日韩| 91综合视频| 蜜桃视频在线观看一区| 国产精品久久久亚洲一区| av一区在线| 日韩亚洲精品在线观看| 国产在线观看91一区二区三区| 亚洲精品极品少妇16p| 91精品国产自产精品男人的天堂 | 亚洲欧美网站| 国产精品嫩模av在线| 久久蜜桃资源一区二区老牛| 中文字幕一区二区精品区| 久久久久伊人| 石原莉奈在线亚洲二区| 国产成人免费| 亚洲aa在线| 欧美精品日日操| 日韩av中文字幕一区二区| 国产综合色区在线观看| 日韩精品导航| 久久精品国产亚洲夜色av网站 | 麻豆一区二区三区| 亚洲中午字幕| 亚洲一级少妇| 国产免费播放一区二区| 91久久国产| 精品理论电影在线| 免费在线视频一区| 欧美日韩免费观看视频| 国产精品一区二区av日韩在线| 99热精品在线观看| sm捆绑调教国产免费网站在线观看| 在线精品视频一区| 在线日韩一区| 色婷婷色综合| 日韩av一区二区三区四区| 亚洲成人免费| 亚洲天堂免费电影| 精品三级av| 国产精品亚洲人成在99www | 国产视频一区三区| 成人亚洲一区二区| 欧美欧美黄在线二区| 午夜亚洲精品| 亚洲天堂成人| av资源亚洲| 精品一区二区三区亚洲| 日韩精品免费视频人成| 欧美成人国产| 国产一区日韩| 国产精品videossex| 婷婷久久免费视频| 久久aⅴ国产紧身牛仔裤| 久久久久久美女精品| 精品国产一区二区三区av片| 日韩一区二区三区四区五区| 视频一区二区三区入口| 欧美精品激情| 欧美1区2区3区| 欧美日韩在线播放视频| 国产精品xx| 麻豆精品在线| 老色鬼精品视频在线观看播放| 91成人小视频| 亚洲中字黄色| 亚洲一区网站| 一区在线免费| 日韩午夜一区| 亚洲一区成人| 另类av一区二区| 国产亚洲欧洲| 国产视频一区三区| 夜夜嗨av一区二区三区网站四季av| 欧美aa国产视频| 午夜久久tv| 日韩亚洲精品在线| 亚洲欧美久久久| 在线日韩成人| 亚洲一区二区三区中文字幕在线观看| 极品裸体白嫩激情啪啪国产精品| 久久久一本精品| 亚洲国产综合在线看不卡| 国产一区欧美| 日韩一区二区免费看| 在线视频日韩| 免费高清在线一区| 天海翼精品一区二区三区| 亚洲午夜免费| 少妇精品久久久一区二区三区| 日韩精品社区| 免费亚洲婷婷| 福利在线一区| 999国产精品视频| 在线一区免费| 亚洲在线一区| 日本视频在线一区| 美腿丝袜亚洲三区| 日韩国产激情| 一区三区视频| 日韩高清一区在线| 久久香蕉精品香蕉| 久久婷婷av| 欧美专区18| 国产图片一区| 久久影院午夜精品| 蜜臀av免费一区二区三区| 美女91精品| 国产日韩欧美在线播放不卡| 精品视频在线观看网站| 福利视频一区| 欧美女激情福利| 亚洲精品在线二区| 国产精品欧美大片| 美女福利一区二区三区| 日韩视频二区| 欧美日韩一区二区三区在线电影| 美女高潮久久久| 日韩国产一区| 丝袜亚洲精品中文字幕一区| 欧美亚洲综合视频| 伊人久久视频| 在线综合欧美| 国产另类在线| 久久久久久久久丰满| 三级一区在线视频先锋| 国产欧美三级| 免费污视频在线一区| 久久最新视频| 精品国产乱码久久久| 午夜电影亚洲| 国产精品igao视频网网址不卡日韩 | 精品丝袜在线| 欧美在线综合| 里番精品3d一二三区| 欧美aa国产视频| 日韩国产欧美在线播放| 黄色在线网站噜噜噜| 久久午夜影视| 成人精品视频| 日韩精品视频网站| 人人精品亚洲| 日韩国产在线不卡视频| 日本久久成人网| 日本午夜精品一区二区三区电影| 在线天堂中文资源最新版| 视频一区免费在线观看| 国产精品成人a在线观看| 亚洲一区二区三区无吗| 免费福利视频一区二区三区| 欧美一区二区三区久久| 亚洲第一精品影视| 国产欧美日韩精品一区二区三区| 日韩精品一区二区三区免费观看|