20141016个人日志(不用pop,push的动画实现)

本文详细介绍了在iOS开发中如何实现流畅的视图切换动画效果,包括从左到右的推入(Push)和从右到左的弹出(Pop)动画,并提供了解决黑色边框显示问题的方法。同时,还分享了如何优化动画实现过程,以及在不同场景下应用视图切换动画的技巧。

view 的 frame 操作必须是整体的,ios貌似不允许对结构体的单个变量进行赋值,比如形如:

 label.frame.size.height = 20; 

这样的操作是不被允许的,但是

 label.frame.size = CGSize{20.0,20.0} 

却是被允许的,但是对label的frame的改变是不起作用的。要想改变一个view的frame,必须对其整个frame进行修改,只有对整个的frame属性作setter操作,系统才会重新分配位置,否则只改变一部分是不会起作用的。


有时我们在开发时,只用到一个navigationController,但是它控制两个或多个view,通过添加 button 来实现不同的 view 间切换。比如设置 view 的 hidden 属性等。这样实现不同 view 间的切换操作显得很生硬,没有 push 和 pop动画,直接一闪而过。如果想要实现 pop 和 push 动画,可以按以下操作来实现:

sourceView 和 destView 都加载在 self.view 层,实现从 sourceView 到 destView 的切换。首先是 push 切换:

-(void)switchInViewFrom:(UIView *)sourceView toView:(UIView *)destView  withCompletionBlock:(void(^)(BOOL finished))block

{

    CGRect sourceViewFrame = sourceView.frame;

    sourceViewFrame.origin.x = -sourceViewFrame.size.width;

//    sourceView.frame = sourceViewFrame;

    

    CGRect destViewFrame  = destView.frame;

    destViewFrame.origin.x = destView.frame.size.width;

    destView.frame = destViewFrame;

    

    destViewFrame.origin.x = 0;

//    [sourceView.superview addSubview:destView];

    [UIView animateWithDuration:.25 animations:^{

        

        sourceView.frame = sourceViewFrame;

        destView.frame   = destViewFrame;

        

    } completion:block];

}


以下是pop切换的动画效果:


-(void)switchOutViewFrom:(UIView *)sourceView toView:(UIView *)destView  withCompletionBlock:(void(^)(BOOL finished))block

{

    CGRect sourceViewFrame = sourceView.frame;

    sourceViewFrame.origin.x = sourceViewFrame.size.width;

//    sourceView.frame = sourceViewFrame;

    

    CGRect destViewFrame  = destView.frame;

    destViewFrame.origin.x = -destView.frame.size.width;

    destView.frame = destViewFrame;

    

    

    destViewFrame.origin.x = 0;

//    [sourceView.superview addSubview:destView];

    [UIView animateWithDuration:.25 animations:^{

        

        sourceView.frame = sourceViewFrame;

        destView.frame   = destViewFrame;

        

    } completion:block];

}

push 操作将旧的View向左移动,新的View从最右开始进入。pop 操作则是将旧的view右移,新的view从左侧进入。方法也不难,只是先设置好各自即将进入的位置,然后用动画实现即可。block里可以添加完成view切换后的动作。

    注意一点,push注释部分sourceView.frame = sourceViewFrame;我之前是加在上面了,然后动画实现,中间过渡的时候会有黑色的块图显示,显得很不友好。这是因为若加上注释的代码,则意味着先将 sourceView 移走,然后再移入 destView,这样在移入新的 view 之前,显示的页面是没有内容的,故而会有黑色块图显示。

    另外,之前想着为了解决黑色图块的显示问题,还想着对当前的页面进行截图来填补,代码如下:


//截图处理黑框

    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, YES, [UIScreen mainScreen].scale);

    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIImageView *transView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.bounds.size.width, self.view.bounds.size.height)];

    transView.image = image;

    [self.view addSubview:transView];

    UIGraphicsEndImageContext();


    但是没有成功,截图只能截一部分图片,不能完整的将整个界面截下来,不知道是什么原因,对这块代码也不是很了解。

    将上述对 view 的操作换到 viewController 的操作也是一样的。在不使用 navigation 的 push 和 pop 时,可以按以下操作来处理,可以参考:廖雪峰的官方网页 http://www.liaoxuefeng.com/article/0013922124509566432675ba57448dda70659ae1f55906d000点击打开链接


- (void)perform
{
    UIViewController* source = (UIViewController *)self.sourceViewController;
    UIViewController* destination = (UIViewController *)self.destinationViewController;

    CGRect sourceFrame = source.view.frame;
    sourceFrame.origin.x = -sourceFrame.size.width;

    CGRect destFrame = destination.view.frame;
    destFrame.origin.x = destination.view.frame.size.width;
    destination.view.frame = destFrame;

    destFrame.origin.x = 0;
    [source.view.superview addSubview:destination.view];
    [UIView animateWithDuration:.25
                     animations:^{
                         source.view.frame = sourceFrame;
                         destination.view.frame = destFrame;
                     }
                     completion:^(BOOL finished) {
                         [source presentViewController:destination animated:NO completion:nil];
                     }];
}

        稍加修改就可以实现从左到右的Push切换动画:

CGRect sourceFrame = source.view.frame;
sourceFrame.origin.x = sourceFrame.size.width;

CGRect destFrame = destination.view.frame;
destFrame.origin.x = -destination.view.frame.size.width;
destination.view.frame = destFrame;

    在做步行路线的时候,显示的 label 挡住了指南针的一部分,需要将指南针的位置下移。只需要重写一个方法即可:

// 设置罗盘的高度位置

-(float)getInsetFromTop

{

    return GENERALIZE_LABEL_HIGHT + _titleView.frame.size.height;

}

    该方法返回罗盘的相对高度,在父类里调用,在子类里重写,调用时覆盖父类的同名方法。


     数据库操作时,防止修改失败,每次都添加事物,利用数据回滚技术。不知道具体怎么操作。

内容概要:本文提出了一种基于改进扩散模型的高海拔地区新能源高波动出力场景生成方法,并提供了完整的Python代码实现。该方法针对高海拔地区风能、光伏等新能源出力波动剧烈、不确定性高的特点,通过优化扩散模型的结构与训练策略,有效捕捉历史数据的概率分布特征与时序相关性,从而生成高质量、多样化的出力场景。文中详细阐述了模型的数学推导、网络架构设计、损失函数优化及采样算法改进,并通过实验证明其在拟合精度、场景多样性与稳定性方面优于传统生成模型,为电力系统在高比例新能源接入下的规划、调度与风险评估提供了可靠的场景输入支持。; 适合人群:具备一定Python编程能力和机器学习基础,从事新能源发电预测、电力系统分析、智能优化、场景生成等方向研究的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①用于高海拔地区风电、光伏出力的不确定性建模与多场景生成;②支撑含高渗透率新能源的电力系统随机优化调度、鲁棒决策与风险评估;③为相关学术研究、论文复现与算法改进提供可运行的技术方案与代码基础; 阅读建议:建议读者结合所提供的完整资源(代码、数据集、说明文档)进行实践操作,重点关注扩散模型的前向加噪与反向去噪过程的设计细节,以及如何将其适配于新能源时序数据的生成任务,通过参数调优与对比实验深入理解模型的生成机制与性能边界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值