CALayer动画

CALayer动画比UIView动画要难点,但是功能也强大。

每个View都一个layer层
使用Layer层可以设置View的圆角,阴影.
使用Layer时,要注意锚点的使用,和position的区别。

CALayer分三中
这里写图片描述

basic,keyFrame,CATransition这三种,group是组合,property是抽象类,不能直接使用。

baise中的keyPath使用时要注意。

#import "ViewController.h"

@interface ViewController ()
- (IBAction)didClickBasid:(UIButton *)sender;
- (IBAction)didClickKeyFrame:(UIButton *)sender;
- (IBAction)didClickTranstion:(UIButton *)sender;
- (IBAction)didClickGroup:(UIButton *)sender;

@property (retain, nonatomic) IBOutlet UIView *myView;
@property (retain, nonatomic) IBOutlet UIImageView *imgView;

@property(nonatomic,assign)int  index;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    //将视图设置为 圆角

    self.imgView.layer.cornerRadius = 30;

    //将子图层超出的部分裁剪掉,如果使用了(注意:如果设置了这个属性,阴影设置是无效的)
//    _imgView.layer.masksToBounds = YES;


    //设置阴影
    _imgView.layer.shadowColor = [UIColor orangeColor].CGColor;

    //透明度
    self.imgView.layer.shadowOpacity = 1.0;

    //设置阴影偏移量
    self.imgView.layer.shadowOffset = CGSizeMake(10, 10);

    //模糊程度
    self.imgView.layer.shadowRadius = 1.0;

#pragma mark -----------------设置myView的阴影和圆角

    self.myView.layer.cornerRadius = 30;
    self.myView.layer.shadowColor = [UIColor lightGrayColor].CGColor;

    self.myView.layer.shadowOpacity = 1.0;
    self.myView.layer.shadowOffset = CGSizeMake(20, 20);

#pragma mark -----------------自定义CALayer
    [self customLayer];

}
-(void)customLayer{

    //创建layer对象
    CALayer * myLayer  = [CALayer layer];

    //设置其位置和大小
    myLayer.bounds = CGRectMake(0, 0, 80, 80);

    //设置背景颜色
    myLayer.backgroundColor = [UIColor yellowColor].CGColor ;


    //设置锚点(定位点,默认是(0.0),谨记:锚点和position始终是重合的

    myLayer.anchorPoint = CGPointMake(0, 0);

    myLayer.position = CGPointMake(50, 50);

    //添加到父图层
    [self.view.layer addSublayer:myLayer];

}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)dealloc {
    [_imgView release];
    [_myView release];
    [super dealloc];
}

#pragma mark ----------------Basic动画
- (IBAction)didClickBasid:(UIButton *)sender {
    /*
    //创建动画对象

    CABasicAnimation * basicAnimation = [CABasicAnimation animation];

    //告诉系统要执行行的动画,影响的是哪个属性
    basicAnimation.keyPath = @"position";

#warning mark ----------如果不想让layer回来起始的位置,必须设置以下两个属性

    basicAnimation.removedOnCompletion = NO;

    //保存动画的最新状态
    basicAnimation.fillMode = kCAFillModeForwards;


    //设置时间
    basicAnimation.duration = 10;

    //设置通过动画,将layer从哪移动到那
    basicAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
    basicAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 200)];
    [self.imgView.layer addAnimation:basicAnimation forKey:@"basic"];

    //没有改变position,所以还会回去,
    NSLog(@"%@",NSStringFromCGPoint(_imgView.layer.position));

     */

    //使用basic动画实现旋转

    CABasicAnimation * basicAnimation1  = [CABasicAnimation animationWithKeyPath:@"transform"];

    //设置动画时间
    basicAnimation1.duration = 1.0;
    //设置最终值

    basicAnimation1.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2 * 2, 1, 1, 0)];

    basicAnimation1.removedOnCompletion = NO;
    basicAnimation1.fillMode = kCAFillModeForwards;
    [self.imgView.layer addAnimation:basicAnimation1 forKey:@"basic1"];

    //移除动画
    [self.imgView.layer removeAnimationForKey:@"basic1"];
}

#pragma mark ==========帧动画
- (IBAction)didClickKeyFrame:(UIButton *)sender {

    CAKeyframeAnimation * keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];
    //设置动画时间

    keyFrame.duration = 0.3;
    //设置imageView抖动的角度

    //角度转化为弧度 :度数/180 * M_PI

    keyFrame.values = @[@(180.0*M_PI),@(8*M_PI),@(8*M_PI)];

    //设置动画重复次数
    keyFrame.repeatCount = 1000;

    [self.imgView.layer addAnimation:keyFrame forKey:@"keyFrame"];

}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    NSTimer * time = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(didClickTranstion:)  userInfo:nil repeats:YES];

    [[NSRunLoop currentRunLoop]addTimer:time forMode:NSDefaultRunLoopMode];

    do {
        [[NSRunLoop currentRunLoop]runUntilDate:[NSDate dateWithTimeIntervalSinceNow:20]];
    } while (1);


}

-(void)picture:(NSTimer *)timer
{
    [self didClickTranstion:nil];
}
#pragma mark ----------CATranstion(专场动画)
- (IBAction)didClickTranstion:(UIButton *)sender {

    //属性
//type:设置动画过度的类型
    //subType:动画过度的方向
    //startProgress:动画的起点
    //endProgress:动画的结束点

    self.index++;


    self.imgView.image = [UIImage imageNamed:[NSString stringWithFormat:@"image%d.jpg",_index%19]];

    //创建专场动画对象
    CATransition * transition = [CATransition animation];
    transition.type = @"cube";
    transition.subtype = kCATransitionFromLeft;
    //设置动画时间
    transition.duration = 1.0;
    transition.repeatCount = 1;


    [self.imgView.layer addAnimation:transition forKey:@"transition"];

    //帧动画
    CAKeyframeAnimation * keyFrame = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];
    //设置动画时间

    keyFrame.duration = 0.3;
    //设置imageView抖动的角度

    //角度转化为弧度 :度数/180 * M_PI

    keyFrame.values = @[@(180.0*M_PI),@(8*M_PI),@(8*M_PI)];

    //设置动画重复次数
    keyFrame.repeatCount = 1;


    //basic动画
    CABasicAnimation * basicAnimation1  = [CABasicAnimation animationWithKeyPath:@"transform"];

    //设置动画时间
    basicAnimation1.duration = 1.0;
    //设置最终值

    basicAnimation1.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2 * 2, 1, 1, 0)];

    basicAnimation1.removedOnCompletion = NO;
    basicAnimation1.fillMode = kCAFillModeForwards;

    CAAnimationGroup * animGroup = [CAAnimationGroup animation];
    animGroup.duration = 3.0;

    animGroup.animations = @[transition,keyFrame,basicAnimation1];

//    [self.imgView.layer addAnimation:animGroup forKey:@"group"];


}
- (IBAction)didClickGroup:(UIButton *)sender {

    // 平移动画
    CABasicAnimation *a1 = [CABasicAnimation animation];
    a1.keyPath = @"transform.translation.y";
    a1.toValue = @(100);
    // 缩放动画
    CABasicAnimation *a2 = [CABasicAnimation animation];
    a2.keyPath = @"transform.scale";
    a2.toValue = @(0.0);
    // 旋转动画
    CABasicAnimation *a3 = [CABasicAnimation animation];
    a3.keyPath = @"transform.rotation";
    a3.toValue = @(M_PI_2);

    //创建组动画
    CAAnimationGroup * groupAnimation = [CAAnimationGroup animation];

    groupAnimation.animations = @[a1,a2,a3];
    groupAnimation.removedOnCompletion = NO;
    groupAnimation.fillMode = kCAFillModeBackwards;
    groupAnimation.duration = 1.0;

    [self.imgView.layer addAnimation:groupAnimation forKey:@"group"];
}
@end
<think>嗯,用户问的是FastGPT的本地部署教程,我需要先确认自己对这个工具的了解程度。FastGPT是基于ChatGPT的开源项目,对吧?可能用户想自己搭建一个类似的服务,可能是为了数据隐私或者定制化需求。用户可能有一定的技术背景,但可能对具体步骤不太熟悉,所以需要详细的教程。 首先,我应该考虑本地部署的基本步骤,比如环境准备、依赖安装、配置调整等。可能需要提到Docker,因为很多开源项目用Docker来简化部署。然后要检查系统要求,比如操作系统是否支持,内存和CPU的需求,毕竟GPT模型比较吃资源。 接下来,可能需要克隆GitHub仓库,安装Docker和Docker Compose,然后修改配置文件,比如环境变量、API密钥之类的。数据库的设置也很重要,比如MongoDB和Redis,用户可能需要安装这些依赖。还要考虑模型文件的问题,是直接下载还是用其他方式获取,可能需要用git lfs或者其他方法。 然后,启动服务之后,可能需要通过端口访问,比如3000端口,用户可能需要知道如何通过浏览器访问。另外,权限问题、路径设置这些常见错误点需要提醒用户注意。如果用户遇到问题,应该建议查看日志或者社区支持。 不过,可能用户的需求不仅仅是部署,还可能包括后续的使用和维护,比如如何更新版本,如何备份数据。是否需要HTTPS配置或者反向代理?可能用户是个人开发者或者小团队,需要简单的指导,不需要太复杂的架构。 另外,可能用户对中文支持有需求,要确认FastGPT是否支持中文,或者在配置里需要调整语言设置。还要注意模型的版本,比如是使用默认的模型还是可以替换成其他预训练模型。 最后,应该总结一下步骤,确保逻辑清晰,分点说明,让用户能一步步跟着做。同时,提醒常见的坑,比如依赖版本不匹配,权限问题,模型文件缺失等。可能还需要给出参考链接,比如官方文档或者GitHub仓库,方便用户查阅更详细的信息。以下</think>是一个简单的 FastGPT 本地部署教程(基于官方文档整理,具体步骤可能因版本更新有所变化): --- ### **1. 环境准备** - **操作系统**:Linux/Windows/macOS(推荐 Linux 服务器) - **硬件要求**: - CPU:4 核以上 - 内存:8GB+(模型越大要求越高) - 硬盘:20GB+(根据模型大小调整) - **依赖工具**: - Docker(版本 20.10+) - Docker Compose - Git(用于克隆仓库) --- ### **2. 部署步骤** #### **2.1 克隆仓库** ```bash git clone https://github.com/labring/FastGPT cd FastGPT ``` #### **2.2 安装 Docker 和 Docker Compose** - **Linux**: ```bash curl -fsSL https://get.docker.com | bash -s docker systemctl start docker && systemctl enable docker ``` - **Windows/macOS**:从官网下载 Docker Desktop 并安装。 #### **2.3 配置环境文件** 1. 复制示例配置文件: ```bash cp .env.example .env cp docker-compose.yml.example docker-compose.yml ``` 2. 修改 `.env` 文件: - 设置数据库密码(`MONGODB_PWD`、`REDIS_PWD`) - 配置 OpenAI API 密钥(如需调用外部模型) - 其他参数按需调整(如端口号、模型路径等)。 #### **2.4 启动服务** ```bash docker-compose up -d ``` 服务启动后会自动拉取镜像并运行容器(包括 MongoDB、Redis、FastGPT 主服务等)。 --- ### **3. 配置模型** - **本地模型**: 1. 下载模型文件(如 `chatglm2-6b`)并放入 `models` 目录。 2. 在 `.env` 文件中指定模型路径。 - **在线模型**: 在 FastGPT 后台配置 OpenAI 或 Azure 的 API 密钥。 --- ### **4. 访问服务** - 浏览器打开 `http://localhost:3000`(默认端口 3000)。 - 首次登录使用默认账号:`admin` / `1234`(建议登录后修改密码)。 --- ### **5. 常见问题** 1. **端口冲突**:修改 `docker-compose.yml` 中的端口映射(如 `3000:3000`)。 2. **模型加载失败**:检查模型路径、权限及文件完整性。 3. **内存不足**:升级服务器配置或使用轻量模型。 4. **数据持久化**:确保 MongoDB 和 Redis 数据卷挂载正确。 --- ### **6. 进阶配置** - **HTTPS**:通过 Nginx 配置反向代理并添加 SSL 证书。 - **自定义开发**:修改前端代码(位于 `client` 目录)或后端逻辑。 - **备份数据**:定期备份 MongoDB 数据库。 --- ### **参考资源** - 官方文档:https://doc.fastgpt.run/ - GitHub 仓库:https://github.com/labring/FastGPT 如需更详细的操作(如模型训练、插件扩展),建议查阅官方文档或社区教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值