亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS制作帶彈跳動畫發布界面

2020-07-26 02:44:18
字體:
來源:轉載
供稿:網友

項目中經常會用到帶彈跳動畫發布界面,具體內容如下

效果圖:

代碼:

// PublishView.m// UIImage+ImageEffects.h 蘋果蒙化圖片的分類 pop.h彈跳動畫框架 EJExtension.h模型轉換框架// ComposeModel 用于設置按鈕文字與圖片的模型,在本地設置plist文件保存image(按鈕圖片)和text(按鈕文字)#import "PublishView.h"#import "BSVerticalButton.h"#import "UIImage+ImageEffects.h"#import "pop.h"#import "MJExtension.h"#import "ComposeModel.h"@interface PublishView ()/** 取消按鈕 */@property (nonatomic, weak) UIButton *cancelButton;@end@implementation PublishView/** 全局 window_ */static UIWindow *window_;/** 顯示發布view */+ (void)show{  // 添加一個獨立的window是為了隔離點擊事件  window_ = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];    window_.hidden = NO;    PublishView *publish = [[PublishView alloc]init];    publish.frame = window_.bounds;    [window_ addSubview:publish];}- (instancetype)initWithFrame:(CGRect)frame{  self = [super initWithFrame:frame];  if (self) {        UIImageView *imageView = [[UIImageView alloc]initWithImage:[self getEffectImage]];    [self addSubview:imageView];    [self setupUI];  }  return self;}- (void)setupUI{    //這里用自定義的 window 是為了隔絕點擊事件 不讓點擊事件傳到后面控制器的view上去   // 按鈕彈跳動畫時讓view本身不能點擊  self.userInteractionEnabled = NO;    // 從plis文件獲得一個模型數組  NSArray *buttonModelArray = [ComposeModel mj_objectArrayWithFilename:@"buttonImage.plist"];    CGFloat button_w = 72;  CGFloat button_h = button_w + 30;  NSInteger maxLoc = 3; //最多列數    //按鈕彈跳動畫停止后的起始 y 值  CGFloat buttonEnd_y = ([[UIScreen mainScreen] bounds].size.height - button_h * 2) / 2;    //最開始在屏幕外上方的的起始 y 值  CGFloat buttonBegin_y = buttonEnd_y - [[UIScreen mainScreen] bounds].size.height;    //按鈕的起始間隙值  CGFloat buttonStartMargin = 20;    //中間的一個按鈕相對于兩邊按鈕的間隙  CGFloat buttonMargin = ([[UIScreen mainScreen] bounds].size.width - buttonStartMargin * 2 - button_w * maxLoc) / (maxLoc - 1);    for (NSInteger i = 0; i < buttonModelArray.count; ++i) {        // BSVerticalButton 自定義的垂直排布按鈕    BSVerticalButton *button = [[BSVerticalButton alloc]init];        button.tag = i;        [self addSubview:button];        [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];        ComposeModel *composeModel = buttonModelArray[i];        [button setImage:[UIImage imageNamed:composeModel.image] forState:UIControlStateNormal];        [button setTitle:composeModel.text forState:UIControlStateNormal];        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];        button.titleLabel.font = [UIFont systemFontOfSize:14];        NSInteger loc = i % maxLoc;  //例號    NSInteger row = i / maxLoc;  //行號        CGFloat button_x = buttonStartMargin + loc * (button_w + buttonMargin);    CGFloat buttonBginAnimation_y = buttonBegin_y + (button_h * row); //彈跳前的 y 值    CGFloat buttonEndAnimation_y = buttonEnd_y + (button_h * row); //彈跳后的 y 值        //創建pop彈簧動畫對象    POPSpringAnimation *animation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewFrame];        animation.beginTime = CACurrentMediaTime() + i * 0.1; //動畫開始時間        animation.springBounciness = 10; //彈簧增強 0-20        animation.springSpeed = 8; //彈簧速度 0-20        animation.fromValue = [NSValue valueWithCGRect:CGRectMake(button_x, buttonBginAnimation_y, button_w, button_h)];        animation.toValue = [NSValue valueWithCGRect:CGRectMake(button_x, buttonEndAnimation_y, button_w, button_h)];        //中間的按鈕添加動畫    [button pop_addAnimation:animation forKey:nil];  }    // 添加品牌logo  UIImageView *topImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"compose_slogan"]];  topImageView.center = CGPointMake([[UIScreen mainScreen] bounds].size.width * 0.5, [[UIScreen mainScreen] bounds].size.height * 0.2 - [[UIScreen mainScreen] bounds].size.height);    [self addSubview:topImageView];    //  POPBasicAnimation  基本的動畫  //  POPSpringAnimation  彈簧動畫  //  POPDecayAnimation  減速動畫  //  POPCustomAnimation  自定義動畫    //創建pop彈簧動畫對象  POPSpringAnimation *animation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];    animation.beginTime = CACurrentMediaTime() + buttonModelArray.count * 0.001; //動畫開始時間    animation.springBounciness = 10; //彈簧增強 0-20    animation.springSpeed = 10; //彈簧速度 0-20    CGFloat center_x = [[UIScreen mainScreen] bounds].size.width * 0.5;  CGFloat endCenter_y = [[UIScreen mainScreen] bounds].size.height * 0.2;  CGFloat beginCenter_y = endCenter_y - [[UIScreen mainScreen] bounds].size.height;    animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(center_x, beginCenter_y)];    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(center_x, endCenter_y)];    animation.completionBlock = ^(POPAnimation *anim, BOOL finished){    NSLog(@"-------這里可以寫動畫結束后所要執行的代碼...");    // view本身開啟交互    self.userInteractionEnabled = YES;  };    //給頂部的圖片添加動畫  [topImageView pop_addAnimation:animation forKey:nil];  // 底部取消按鈕  UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeSystem];  [cancelButton setTitle:@"取 消" forState:UIControlStateNormal];  cancelButton.titleLabel.font = [UIFont systemFontOfSize:15];  [cancelButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  [cancelButton setBackgroundColor:[UIColor whiteColor]];  [cancelButton addTarget:self action:@selector(cancelButtonClick:) forControlEvents:UIControlEventTouchUpInside];  [self addSubview:cancelButton];  self.cancelButton = cancelButton;}- (void)cancelButtonClick:(UIButton *)button{    // 退出時執行動畫 方法的參數block傳空  [self animationWithBlock:nil];}- (void)layoutSubviews{  [super layoutSubviews];  // 取消按鈕位置大小  CGPoint center = self.cancelButton.center;  center.x = self.center.x;  self.cancelButton.center = center;  CGRect frame = self.cancelButton.frame;  frame.origin.y = self.frame.size.height * 0.85;  frame.size = CGSizeMake(200, 35);  self.cancelButton.frame = frame;}- (void)buttonClick:(UIButton *)button{    [self animationWithBlock:^{    switch (button.tag) {      case 0:        NSLog(@"發視頻");        break;      case 1:        NSLog(@"發圖片");        break;      case 2:{                NSLog(@"發段子");      }        break;      case 3:        NSLog(@"發聲音");        break;      case 4:        NSLog(@"審貼子");        break;      case 5:        NSLog(@"離線下載");        break;              default:        break;    }  }];  }/** 退出時與點出了某個按鈕時執行的彈跳動畫后銷毀 window_ 移除 這個蒙板 view ,如果block參數completionBlock有值先銷毀window_后再執行這個block里的代碼塊 */- (void)animationWithBlock:(void (^) ())completionBlock{    NSLog(@"----%@/n",self.subviews);    //退出的時候這里用自定義的 window 是為了隔絕點擊事件 不讓點擊事件傳到后面控制器的view上去  // view本身不能點  self.userInteractionEnabled = NO;  // 選移除取消按鈕  [self.cancelButton removeFromSuperview];    for (NSInteger i = 1; i < self.subviews.count; ++i) {      UIView *view = self.subviews[i];        //創建pop基本動畫對象    POPBasicAnimation *animation = [POPBasicAnimation animationWithPropertyNamed:kPOPViewCenter];    //    POPSpringAnimation *animation = [POPSpringAnimation animationWithPropertyNamed:kPOPViewCenter];        animation.beginTime = CACurrentMediaTime() + (i-1) * 0.1; //動畫開始時間        // 如果用這個基類 POPBasicAnimation 動畫的執行節奏(一開始很慢, 后面很快)    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];        CGPoint center = view.center; //取出中心點        animation.toValue = [NSValue valueWithCGPoint:CGPointMake(center.x , center.y + [[UIScreen mainScreen] bounds].size.height)];        if (i == self.subviews.count-1) { //說明是最后一個 view在做動畫,就讓執行結束的 block      // 動畫結束時調用的 block      animation.completionBlock = ^(POPAnimation *anim, BOOL finished){              NSLog(@"取消時 這里可以寫動畫結束后所要執行的代碼...");                [self removeFromSuperview];                window_ = nil; //銷毀自定義的 window            !completionBlock ? : completionBlock();      };    }    //給頂部的圖片添加動畫    [view pop_addAnimation:animation forKey:nil];  }}- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    [self animationWithBlock:nil];}// 獲得一個磨紗蒙板 image 圖片- (UIImage *)getEffectImage{  UIWindow *window = [UIApplication sharedApplication].keyWindow; //獲取當前 window  UIGraphicsBeginImageContext(window.size); //開啟window大小的圖形上下文  CGContextRef ref = UIGraphicsGetCurrentContext(); //開啟圖形上下文  [window.layer renderInContext:ref]; //把window圖層 渲染到圖形上下文當中  UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); //獲取圖片  UIGraphicsEndImageContext(); //關閉圖形上下文  image = [image applyLightEffect]; //調用 image 分類方法 使圖片調成蒙板狀態  return image;}@end

項目中用到的垂直布局自定義按鈕 BSVerticalButton

#import "BSVerticalButton.h"@implementation BSVerticalButton- (instancetype)initWithFrame:(CGRect)frame{  self = [super initWithFrame:frame];  if (self) {    [self setupUI];  }  return self;}- (void)awakeFromNib{  [super awakeFromNib];    [self setupUI];}- (void)setupUI{  self.titleLabel.textAlignment = NSTextAlignmentCenter;}- (void)layoutSubviews{  [super layoutSubviews];    //按鈕內部圖片 frame  CGRect imageViewFrame = self.imageView.frame;  imageViewFrame.origin.x = 0;  imageViewFrame.origin.y = 0;  imageViewFrame.size.width = self.bounds.size.width;  imageViewFrame.size.height = self.bounds.size.width;  self.imageView.frame = imageViewFrame;    //按鈕內部label frame  CGRect titleLabelFrame = self.titleLabel.frame;  titleLabelFrame.origin.x = 0;  titleLabelFrame.origin.y = self.imageView.frame.size.height + 10;  titleLabelFrame.size.width = self.bounds.size.width;  self.titleLabel.frame = titleLabelFrame;    //按鈕自身大小  CGRect buttonBounds = self.bounds;  buttonBounds.size.width = self.imageView.frame.size.width;  buttonBounds.size.height = self.imageView.bounds.size.height + self.titleLabel.bounds.size.height + 10;  self.bounds = buttonBounds;}@end

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美超级乱淫片喷水| 国产一区二区在线免费视频| 亚洲www在线| 亚洲黄色av网站| 久久久精品免费| 91老司机在线| 欧美性在线观看| 国产精品香蕉国产| 欧美日韩精品在线| 不卡毛片在线看| 91精品国产一区| 午夜精品福利电影| 国产午夜精品久久久| 国产精品青青在线观看爽香蕉| 久久久91精品国产| 日韩精品视频三区| 2019av中文字幕| 精品日韩美女的视频高清| 亚洲国产精品国自产拍av秋霞| 7777免费精品视频| 国产欧美亚洲视频| 国产成人精品免高潮在线观看| 欧美一区视频在线| 精品亚洲国产视频| 国外成人免费在线播放| 国产欧美一区二区白浆黑人| 亚洲男人天堂视频| 国产视频一区在线| 国产婷婷成人久久av免费高清| 久久成人精品视频| 高潮白浆女日韩av免费看| 欧美在线精品免播放器视频| 正在播放国产一区| 亚洲最大的成人网| 久久精品国产成人| 日本韩国欧美精品大片卡二| 亚洲精品福利资源站| 国产成人精品免费久久久久| 日韩精品一区二区视频| 影音先锋欧美精品| 欧美性生交xxxxx久久久| 奇米4444一区二区三区| 九九热精品在线| 亚洲视频在线免费看| 欧美日韩国产中文字幕| 97成人在线视频| 国产成人高清激情视频在线观看| 中文字幕欧美专区| 亚洲精品成人网| 在线观看中文字幕亚洲| 欧美性猛交xxx| 久久久噜噜噜久久久| 欧美高清在线视频观看不卡| 欧美性20hd另类| 精品国产鲁一鲁一区二区张丽| 国产成人精品视频在线观看| 在线观看91久久久久久| 亚洲欧美成人一区二区在线电影| 日韩一区二区三区国产| 国产精品中文字幕在线观看| 国模精品视频一区二区| 欧洲美女免费图片一区| 国产v综合ⅴ日韩v欧美大片| 黑人巨大精品欧美一区二区| 亚洲精品一区中文字幕乱码| 亚洲片在线资源| 97色在线观看免费视频| 亚洲欧美日韩视频一区| 久久久爽爽爽美女图片| 黑人狂躁日本妞一区二区三区| 亚洲精品免费在线视频| 日韩欧美中文字幕在线播放| 日韩久久午夜影院| 亚洲www永久成人夜色| 社区色欧美激情 | 国产精品入口日韩视频大尺度| 久久久97精品| 国产精品流白浆视频| 国产福利精品av综合导导航| 黑人欧美xxxx| 欧美日韩成人免费| 国产美女久久精品| 菠萝蜜影院一区二区免费| 国产视频自拍一区| 欧美成aaa人片在线观看蜜臀| 高清欧美性猛交| 欧美巨猛xxxx猛交黑人97人| 欧美日韩福利电影| 国产精品成久久久久三级| 日韩国产精品一区| 亚洲人成电影在线观看天堂色| 韩曰欧美视频免费观看| 麻豆乱码国产一区二区三区| 欧美色道久久88综合亚洲精品| 国产精品扒开腿做| 久久久女女女女999久久| 日韩有码视频在线| 九色成人免费视频| 九九热最新视频//这里只有精品| 亚洲精品国产精品国自产在线| 91精品国产91久久久久久吃药| 久久久天堂国产精品女人| 亚洲欧美制服综合另类| 国产精品美女网站| 久久久久久亚洲精品中文字幕| 麻豆国产va免费精品高清在线| 92版电视剧仙鹤神针在线观看| 欧美成在线观看| 亚洲资源在线看| 欧美激情久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整| 成人免费视频xnxx.com| 青青草国产精品一区二区| 日韩成人高清在线| 国产成人高清激情视频在线观看| 欧美另类极品videosbest最新版本| 国产精品爽爽爽爽爽爽在线观看| 国产精品美女网站| 欧美专区中文字幕| 亚洲成人黄色网| 久久理论片午夜琪琪电影网| 欧美日韩国产在线播放| 日本精品一区二区三区在线播放视频| 亚洲小视频在线| 国产美女久久精品香蕉69| 欧美综合在线第二页| 亚洲国产精品电影在线观看| 国产亚洲精品高潮| 久久久久久久999精品视频| 欧美激情精品久久久久| 国产97在线视频| 亚洲视频一区二区三区| 97在线观看免费高清| 日韩免费精品视频| 91九色国产社区在线观看| 91精品在线影院| 亚洲色图五月天| 欧美黑人巨大xxx极品| 人人做人人澡人人爽欧美| 日韩国产欧美精品一区二区三区| 555www成人网| 日本精品免费观看| 91中文字幕在线观看| 国产99视频精品免视看7| 黄色精品在线看| 亚洲美女免费精品视频在线观看| 欧美色道久久88综合亚洲精品| 琪琪第一精品导航| 久久成人在线视频| 中文字幕不卡在线视频极品| 综合激情国产一区| 日韩电影免费观看在线观看| 成人免费福利视频| 国内自拍欧美激情| 国产精品草莓在线免费观看| 一区二区亚洲精品国产| 成人av资源在线播放| 亚洲国产精品国自产拍av秋霞| 亚洲一区av在线播放| 欧美激情啊啊啊| 亚洲精品国偷自产在线99热| 亚洲天天在线日亚洲洲精| 久久亚洲精品成人| 法国裸体一区二区|