国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

iOS體驗性優(yōu)化之RTL適配右滑返回的實現(xiàn)

2020-07-26 02:33:44
字體:
來源:轉載
供稿:網(wǎng)友

簡述

所謂RTL方向布局就是right to left direction。也就是界面中的元素總是按從右往左的方向進行排列布局,大部分國家的書寫以及排列習慣都是從左往右,是LTR方向布局,而對于一些阿拉伯國家,文字的書寫以及展示的順序都是從右往左方向的。

iOS的導航支持左滑手勢返回上一個界面,這是果粉普遍喜歡的一個特性,iOS7之后的APP適配大多會保留這一特性,慢慢的大多用戶已經(jīng)有了這種操作習慣,對于iPhone的無虛擬鍵,這種操作也能增加比較友好的用戶體驗。

在公司新項目之前,沒有考慮過多語言RTL的適配方案,開始做的時候UI方面基本實現(xiàn)用一套布局代碼支持RTL的兩種布局方向。但是真正拿在手里把玩體驗時才真切的感受到?jīng)]有側滑返回的RTL有多么的不爽。幾經(jīng)查找并沒有找到可參考的合適方案,可能國內做多語言適配的技術圈本身就小,適配RTL的就顯得更加的稀有了。

希望能幫助到有需要的人,或者有更好的思路可以聯(lián)系共同探討。

思路

查不到可參考的資料,只能自己想一想比較合適的方式,恰好在實現(xiàn)一個首頁列表跳轉詳情頁時候,解決特殊的轉場動畫,突然就有了靈感。可能應該有更好的實現(xiàn)方式,現(xiàn)將我的方式展現(xiàn)給大家。

解決方案

1、關鍵詞: UIPercentDrivenInteractiveTransition finishInteractiveTransition cancelInteractiveTransition

2、關鍵方法:updateInteractiveTransition:

3、實現(xiàn)方式:暫時以文字代碼描述,具體可參考之前共享的RTL解決方案,里面有相關源碼,末尾處會貼出路徑。

具體實現(xiàn)

1、處理navigation代理

使用runtime方式或者基類方式,viewdidappea每次設置nav的代理為自己,viewdiddisappear清空代理(Yoins新版中使用RTL框架中的分類)

- (void)RTL_viewWillAppear:(BOOL)animated{ [self RTL_viewWillAppear:animated]; self.navigationController.delegate = self;}- (void)RTL_viewWillDisappear:(BOOL)animated{ [self RTL_viewWillDisappear:animated]; if (self.navigationController.delegate == self) {  self.navigationController.delegate = nil; }}

2、右滑手勢添加

基類初始化時,RTL環(huán)境下添加右滑手勢,關閉左滑手勢,實現(xiàn)最基本的右滑返回。

Navigation 中實現(xiàn)

- (void)RTL_ViewWillAppear:(BOOL)animate{// self.view.backgroundColor = [UIColor whiteColor];// // Do any additional setup after loading the view. if (![[RTLManager appearance]RTL]) {  self.interactivePopGestureRecognizer.delegate = self; } self.interactivePopGestureRecognizer.enabled = ![[RTLManager appearance]RTL];  [self RTL_ViewWillAppear:animate];}

3、實現(xiàn)手勢交互(重點)

基類VC中 增加一個基礎屬性,保存臨時轉場上下文

@property (strong ,nonatomic)UIPercentDrivenInteractiveTransition *transitonContext;

在VC右滑動作觸發(fā)事件中,處理轉場動畫進度

- (void)handlePanGesture:(UIScreenEdgePanGestureRecognizer *)pan{// NSLog(@"_____%zd-----%zd",self.navigationController.childViewControllers.count,self.navigationController.viewControllers.count);// NSLog(@"----%@",NSStringFromCGPoint([pan translationInView:self.view])); CGFloat progress = ABS([pan translationInView:self.view].x) / (self.view.bounds.size.width * 1.0); progress = MIN(1.0, MAX(0.0, progress)); if (pan.state == UIGestureRecognizerStateBegan) {  // 創(chuàng)建過渡對象,彈出viewController  self.transitonContext = [[UIPercentDrivenInteractiveTransition alloc] init];  [self.navigationController popViewControllerAnimated:YES]; }else if (pan.state == UIGestureRecognizerStateChanged) {  // 更新 interactive transition 的進度  [self.transitonContext updateInteractiveTransition:progress]; }else if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateCancelled) {  // 完成或者取消過渡  if (progress > 0.5) {   [self.transitonContext finishInteractiveTransition];  }  else {   [self.transitonContext cancelInteractiveTransition];  }  self.transitonContext = nil; }}- (id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController{ if (self.transitonContext) {  return self.transitonContext; } else {  return nil; }}

最后就是實現(xiàn)自定的各種轉場動畫了,可以簡單模仿系統(tǒng)的滑動切換轉場,具體處理在下面VC實現(xiàn)的方法中,返回一個處理轉場的實例即可

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC

4、貼一個簡單的動畫處理類

@implementation RTLPushAnimation

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{ return 0.5;}- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{ UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *container = transitionContext.containerView; UIView *tmpV = [fromVC.view snapshotViewAfterScreenUpdates:YES]; [container addSubview:toVC.view]; toVC.view.transform = CGAffineTransformMakeTranslation(-toVC.view.bounds.size.width, 0); [container addSubview:tmpV]; [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{  tmpV.transform = CGAffineTransformMakeTranslation(toVC.view.bounds.size.width, 0);  toVC.view.transform = CGAffineTransformIdentity; } completion:^(BOOL finished) {  [tmpV removeFromSuperview];  [transitionContext completeTransition:YES]; }]; }@end@implementation RTLPopAnimation- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{ return 0.5;}- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{ UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; UIView *container = transitionContext.containerView; UIView *tmpV = [fromVC.view snapshotViewAfterScreenUpdates:YES]; [container addSubview:toVC.view]; toVC.view.transform = CGAffineTransformMakeTranslation(toVC.view.bounds.size.width, 0); [container addSubview:tmpV]; [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{  tmpV.transform = CGAffineTransformMakeTranslation(-toVC.view.bounds.size.width, 0);  toVC.view.transform = CGAffineTransformIdentity; } completion:^(BOOL finished) {  [tmpV removeFromSuperview];  toVC.view.transform = CGAffineTransformIdentity;  [transitionContext completeTransition:!transitionContext.transitionWasCancelled]; }];}@end

end

大家或許有更好的處理方案,可以一切探討下。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網(wǎng)的支持。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泰和县| 镇原县| 绥中县| 当阳市| 体育| 长泰县| 富民县| 乌兰察布市| 夹江县| 时尚| 上饶县| 西平县| 东乡县| 确山县| 曲靖市| 安西县| 丰镇市| 红原县| 柳林县| 灵武市| 工布江达县| 开封县| 神木县| 南澳县| 凤翔县| 台山市| 梁平县| 瑞丽市| 千阳县| 德令哈市| 伊春市| 福贡县| 息烽县| 吉安市| 贵定县| 鹤庆县| 西乌珠穆沁旗| 郑州市| 荣成市| 丽水市| 丰县|