【问题标题】:how to change image background when uiscrollview being scrolled?滚动uiscrollview时如何更改图像背景?
【发布时间】:2013-09-06 19:34:25
【问题描述】:

正如我在上面的标题中所述,我想在滚动uiscrollview 时更改图像背景以动画方式淡出并替换为另一个图像。我的uiviewcontroller 层次结构很简单:

uiviewcontroller--->uiimageview--->uiscrollview

有关 uiscrollview 的其他信息: 1. 我的uiscrollview 包含一个简单的uilabel 和一些uiimageview(只是uiscrollview 的子视图的一小部分)。 2.启用分页 3. 水平滚动(如果有的话)

那么,这里的任何人都可以帮助我如何完成这个方法吗?只是一个简单的线索将不胜感激,因为我仍然是初学者,但我想向这里的所有大师学习。

非常感谢您提供的所有帮助,并祝您有美好的一天。

【问题讨论】:

  • 如何创建图像背景?您是否使用跨视图拉伸的 UIImageView?还是以编程方式设置它?
  • 是的,我使用 uiimageview 拉伸填充视图控制器。

标签: iphone ios objective-c uiscrollview


【解决方案1】:

还有另一种方法(更整洁的 IMO):

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{
  UIImage * toImage = [UIImage imageNamed:@"myname.png"];
  [UIView transitionWithView:self.view
                duration:5.0f
                options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                self.imageView.image = toImage;
                } completion:nil];
}

编辑

对于多个图像/页面之间来回切换,最好使用

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

这样您在页面之间切换时不会有任何冲突。

要使图像相应地更改,您可以使用switch 语句,这也意味着您必须将您的页面与数字相关联。由于 Apple 没有将此作为 UIScrollView 的属性,因此您必须自己获取数据:

int page = scrollView.contentOffset.x / scrollView.frame.size.width;

然后以一个不错的方法将所有这些添加在一起:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    int page = scrollView.contentOffset.x / scrollView.frame.size.width;

    //Use the switch to set the variable (toImage) depending on the page
    switch (page){
                    case 0:  UIImage * toImage = [UIImage imageNamed:@"imageOne.png"];
                    break;
                    case 1:  UIImage * toImage = [UIImage imageNamed:@"imageTwo.png"];
                    break;
                    case 2:  UIImage * toImage = [UIImage imageNamed:@"imageThree.png"];
                    break;
                    case 3:  UIImage * toImage = [UIImage imageNamed:@"imageFour.png"];
                    break;
                 }

        //use the variable (toImage) and perform the transition from the current image

        [UIView transitionWithView:self.view
                                  duration:5.0f
                                  options:UIViewAnimationOptionTransitionCrossDissolve
                                  animations:^{
                                  self.imageView.image = toImage;
                                  } completion:nil];
}

我还没有测试过上面的代码,但是根据我对 C 和 Obj C 的了解,它应该可以工作。

【讨论】:

  • 感谢 captjak,这个有效。但是如果我在 uiscrollview 中有 4 个页面(启用分页)并且我希望每个页面代表不同的图像怎么办?
  • @redribbon,检查我的编辑。任何更多的代码和你付钱给我;)
  • 哇,非常感谢我的朋友。这段代码真的帮助我实现了效果。仍然需要一些工作,但很容易。所以是的,我使用 didenddecelerating 而不是确实滚动,但感谢您提供线索。您也必须从案例 0 而不是案例 1 开始,否则您的第二页不会改变,最后一页在每种情况下都必须添加大括号,否则代码将无法正常工作:D(例如:案例 1:{} 中断;........好吧,我不会再打扰你了,因为我不想从你那里得到纸质支票付款嘿嘿嘿:p
  • 是的,编号正确,因为索引从 0 开始。我很高兴它有效!
【解决方案2】:

我觉得你可以试试这段代码

第 1 步:将 UIScrollViewDelegate 添加到您的 UIViewController

第 2 步:将 UIScrollView 委托附加到您的 UIViewController(XIB 或 StoryBoard)上

第 3 步:在实现控制器中实现此委托方法

 -(void) scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
        [UIView animateWithDuration:0.5
                     animations:^{
                         [self<UIImageView> setAlpha:0];
                     }
     ];

    [self<UIImageView> setImage:<Your second image>]

    [UIView animateWithDuration:0.5
                     animations:^{
                         [self<UIImageView> setAlpha:1];
                     }
     ];

}

也许scrollViewDidScroll: 委托它更明智得去测试

【讨论】: