iOS渐变动画与uiscrollview分页

iOS渐变动画与uiscrollview分页,ios,objective-c,uiscrollview,gradient,cagradientlayer,Ios,Objective C,Uiscrollview,Gradient,Cagradientlayer,我有一个3页的水平滚动视图 我想有一个不同的背景颜色为每一页,并绘制3种颜色之间的梯度 第1页为绿色,第2页为蓝色,第3页为红色。 我该怎么做 我在考虑ScrollViewDidScrolldelegate方法: - (void)scrollViewDidScroll:(UIScrollView *)sender { CGFloat pageWidth = self.statisticScrollView.frame.size.width; float fractionalPage = se

我有一个3页的水平滚动视图

我想有一个不同的背景颜色为每一页,并绘制3种颜色之间的梯度

第1页为绿色,第2页为蓝色,第3页为红色。 我该怎么做

我在考虑
ScrollViewDidScroll
delegate方法:

- (void)scrollViewDidScroll:(UIScrollView *)sender
{

CGFloat pageWidth = self.statisticScrollView.frame.size.width;

float fractionalPage = self.statisticScrollView.contentOffset.x / pageWidth;
NSLog(@"fractional Page: %f", fractionalPage);

NSInteger lowerNumber = floor(fractionalPage);
NSLog(@"lower Page: %i", lowerNumber);

NSInteger upperNumber = lowerNumber + 1;
NSLog(@"upper Page: %i", upperNumber);

if (self.lastContentOffset > sender.contentOffset.x){
    //RIGHT --->
    if (lowerNumber == 0) {
        //gradient green to blue
    }else if (lowerNumber == 1){
        //gradient blue to red
    }else if (lowerNumber == 2){
        //end pages
    }
}else if (self.lastContentOffset < sender.contentOffset.x){
    //LEFT <----
    if (lowerNumber == 0) {
        //gradient blue to green
    }else if (lowerNumber == 1){
        //gradient red to blue
    }else if (lowerNumber == 2){
        //end pages
    }
}
}
-(无效)scrollViewDidScroll:(UIScrollView*)发送方
{
CGFloat pageWidth=self.statisticScrollView.frame.size.width;
浮点分数页=self.statisticScrollView.contentOffset.x/pageWidth;
NSLog(@“分数页:%f”,分数页);
NSInteger lowerNumber=地板(分页);
NSLog(@“下页:%i”,下页编号);
NSInteger upperNumber=LOWERNNUMBER+1;
NSLog(@“上页:%i”,上页编号);
if(self.lastContentOffset>sender.contentOffset.x){
//对-->
如果(lowerNumber==0){
//渐变绿色到蓝色
}else if(lowerNumber==1){
//渐变蓝到红
}else if(lowerNumber==2){
//结束页
}
}else if(self.lastContentOffset//左起始点
和端点
属性是从0到1测量的,不在视图的坐标系中,这可能是您遇到的问题。因此,要从一侧到另一侧运行渐变,您需要这样声明

gradlayer.startPoint = CGPointMake(0, 0.5);
gradlayer.endPoint = CGPointMake(1, 0.5);
实现所需操作的一种简单方法是,使用预先配置的渐变向滚动视图添加一个子层

CGFloat width = CGRectGetWidth(self.view.frame);
CGFloat height = CGRectGetHeight(self.view.frame);

self.scroller.contentSize = CGSizeMake(3*width, height);
self.gradlayer = [CAGradientLayer layer];
self.gradlayer.frame = CGRectMake(0, 0, width*3, height);

[self.scroller.layer addSublayer:self.gradlayer];

self.gradlayer.colors = @[((id)[UIColor redColor].CGColor),((id)[UIColor greenColor].CGColor),((id)[UIColor blueColor].CGColor)];

self.gradlayer.startPoint = CGPointMake(0, 0.5);
self.gradlayer.endPoint = CGPointMake(1, 0.5);
但是,如果内容大小变大,这可能会导致内存问题

我看了一下Sim卡,它似乎没有随着页面的增加而增长。我看了10页,它似乎与3页保持不变,但这是一个考虑因素,因此你可能不得不回到你最初的理论,即根据水平偏移调整颜色数组

我认为scrollviews内部分页可以有效地处理其子层以避免这种情况

不过颜色搭配不错,杰瑞·加西亚会很自豪的


您好,谢谢您的回复。我尝试了您的代码。它完全有效,但不是我所想的效果…无论如何,谢谢!我正在尝试使用
FractalPage
的值(如果我在第一页,值从0.0到1.0-如果我在第二页,值从1.0到2.0…)来设置结束颜色的位置(如果我们在第一页,则为蓝色)。