Ios 更改视图';s alpha基于UIScrollView';在滚动多个屏幕时显示contentOffset.x

Ios 更改视图';s alpha基于UIScrollView';在滚动多个屏幕时显示contentOffset.x,ios,uiscrollview,contentoffset,Ios,Uiscrollview,Contentoffset,我有一个横向UIScrollView,宽度为960 UIScrollView包含3个UIView的,每个都设置为背景色 第一个是粉红色的,第二个是蓝色的,第三个是绿色的 我需要做的是根据用户的滚动更改颜色(视图)的alpha 因此,如果用户在第一个屏幕(粉红色)上,并开始滚动到第二个页面(蓝色),那么粉红色应该开始褪色,蓝色将变得更加可见,一旦用户完全滑动到第二个页面,它将全部变为蓝色 以下是我在仅使用一个UIView时的操作方法: func scrollViewDidScroll(scroll

我有一个横向
UIScrollView
,宽度为
960

UIScrollView
包含3个
UIView的
,每个都设置为背景色

第一个是粉红色的,第二个是蓝色的,第三个是绿色的

我需要做的是根据用户的滚动更改颜色(视图)的alpha

因此,如果用户在第一个屏幕(粉红色)上,并开始滚动到第二个页面(蓝色),那么粉红色应该开始褪色,蓝色将变得更加可见,一旦用户完全滑动到第二个页面,它将全部变为蓝色

以下是我在仅使用一个
UIView
时的操作方法:

func scrollViewDidScroll(scrollView: UIScrollView) {

        // Offset Percentage
        var percentageHorizontalOffset = scrollView.contentOffset.x / 320;

        // Reduce alpha
        pinkView.alpha = percentageHorizontalOffset
}
这很容易,因为百分比从
0.0
1.0

但是,我需要修改代码以支持3个屏幕。我之前尝试过在上面的方法中将
320
替换为
960
,但这会导致一些问题

首先,你不再得到0.0到1.0范围内的百分比,一旦你滚动到第二页,它将是1.0到2.0范围,这将无法帮助我正确修改alpha

第二个问题是alpha变化感觉不是很平滑,特别是当快速滑动UIScrollView时。我在前面设置了一堆
if
语句,试图让它正常工作,但什么都不起作用


当我的
uicrollview的内容大小大于一个屏幕时,如何根据
contentOffset.x
正确淡入所有3个
UIView的alpha?

最简单的方法是将3个彩色视图视为一个数组

// Put all your views in an array
@property NSArray *coloredViews;

// Later where you set things up, allocate the array.
coloredViews=@[pinkView,blueView,greenView];
然后使用以下算法设置alpha。 这假设一次屏幕上只有N个视图中的2个。一个在左边,一个在右边。 左侧的alpha值基于屏幕外的alpha值。 右侧的alpha值基于屏幕上的alpha值。 所以当left变为off时,它变为0,导致right变为1,反之亦然

这使您的滚动方法:

func scrollViewDidScroll(scrollView: UIScrollView) {
  // Work out which view is showing on the left. 0 to N-1
  // Based on each being 320 wide.
  CGFloat offset=scrollView.contentOffset.x;
  NSUInteger leftHandSideViewIndex=(NSUInteger)offset.x/320;

  // Left hand side alpha is 1 minus percentage (as a fraction) off screen
  self.coloredViews[leftHandSide].alpha = 
    1.0 - (offset - (320.0 * leftHandSideViewIndex))/320.0;

  // Right hand side alpha is 1 - percentage (as a fraction) on screen
  // Only do this if there is a right hand side.
  if (leftHandSideViewIndex < self.coloredViews.count-1){
    self.coloredViews[leftHandSide+1].alpha = 
      1.0 - ((320.0 * leftHandSizeViewIndex+1)-offset)/320.0;
  }
}
func scrollViewDidScroll(scrollView:UIScrollView){
//计算出左侧显示的视图。0到N-1
//基于每个都是320宽。
CGFloat offset=scrollView.contentOffset.x;
NSUInteger leftHandSideViewIndex=(NSUInteger)offset.x/320;
//左侧alpha是屏幕外的1减去百分比(分数)
self.coloredViews[leftHandSide]。alpha=
1.0-(偏移量-(320.0*leftHandSideViewIndex))/320.0;
//右侧的alpha是屏幕上的1个百分比(作为分数)
//只有在有右手边时才这样做。
if(leftHandSideViewIndex
试试看。可能不是100%正确,但希望能给您一个想法。您可能希望设置一个宽度变量,而不是使用320.0