【问题标题】:iOS: How To swipe through an image with pagination oniOS:如何在打开分页的情况下滑动图像
【发布时间】:2012-03-15 11:24:32
【问题描述】:

基本上,我想要一个只有一个视图的应用程序,上面有图像。我希望能够向左或向右滑动,让第一个图像离开视图,第二个图像进入。图像是相同的,我希望它看起来像是连接的(就像向下滚动一根绳子模式只是重复,但它看起来像一个不断的滚动)。我需要它能够在一系列滑动后更改图像或重新启动。我知道我需要在 UIScrollView 中打开分页,但我是 iOS 新手并且遇到了麻烦。

最终,我想让 iPhone 在每次滑动时都会振动(并重新启动模式)。

我确信有很多方法可以做到这一点(即 TableView),所以如果答案难以解释,请随时向我指出一些参考的方向。

谢谢!

跟进:

我找到了一个 Apple 示例,它几乎完成了我想做的事情。我对其进行了很多调整,但我正用头撞墙,试图让图像循环播放。这是我认为有问题的代码,但我不确定解决方案是什么,因为 ScrollView 是功能性的,它只是不会将中心重置为当前视图。有什么想法吗?

    - (void)layoutScrollImages
{
        UIImageView *view = nil;
        NSArray *subviews = [scrollView1 subviews];

    // reposition all image subviews in a horizontal serial fashion
    CGFloat curXLoc = 0;
    for (view in subviews)
    {
        if ([view isKindOfClass:[UIImageView class]] && view.tag > 0)
        {
            CGRect frame = view.frame;
            frame.origin = CGPointMake(curXLoc, 0);
            view.frame = frame;

            curXLoc += (kScrollObjWidth);
        }
    }

    // set the content size so it can be scrollable
    [scrollView1 setContentSize:CGSizeMake((kNumImages * kScrollObjWidth), [scrollView1 bounds].size.height)];

}

【问题讨论】:

    标签: iphone ios xcode image uiscrollview


    【解决方案1】:

    我只会使用 UIScrollView。将 contentWidth 设置为视图宽度/高度的 3 倍(对于 3 页),并将 contentOffset 设置为中心“页面”(view.bounds.size.widthview.bounds.size.height,具体取决于您是否分别水平/垂直滚动) .您需要为 UIScrollView(可能是视图控制器)设置一个委托并实现- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView。这将在滚动视图完成减速时调用。完成减速后,将 contentOffset 重置回中心视图。这应该给人一种无限滚动的印象。您还可以在 scrollViewDidEndDecelerating 方法中设置计数器递增,以递增计数器或启动振动。

    您不需要不断地重新定位图像。只需在滚动视图中设置一次图像:

    //Horizontal arrangement
    UIImage *image = [UIImage imageNamed:@"nameOfImage.png"];
    UIImageView *imageView1 = [[UIImageView alloc] initWithImage:image];
    UIImageView *imageView2 = [[UIImageView alloc] initWithImage:image];
    UIImageView *imageView3 = [[UIImageView alloc] initWithImage:image];
    NSArray *imageViews = [NSArray arrayWithObjects:imageView1, imageView2, imageView3];
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview: scrollView]; //This code assumes it's in a UIViewController
    CGRect cRect = scrollView.bounds;
    UIImageView *cView;
    for (int i = 0; i < imageViews.count; i++){
        cView = [imageViews objectAtIndex:i];
        cView.frame = cRect;
        [scrollView addSubview:cView];
        cRect.origin.x += cRect.size.width;
    }
    scrollView.contentSize = CGSizeMake(cRect.origin.x, scrollView.bounds.size.height);
    scrollView.contentOffset = CGPointMake(scrollView.bounds.size.width, 0); //should be the center page in a 3 page setup
    

    所以图像已经设置好了,你不需要再弄乱它们了。只需在滚动视图停止时重置 contentOffset(注意:您需要确保您是滚动视图的代表,否则当滚动视图停止时您将不会收到消息):

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
        scrollView.contentOffset = CGPointMake(scrollView.bounds.size.width, 0);
    }
    

    请原谅任何错别字。我手写的。

    【讨论】:

    • 感谢您的出色回答。我会全力以赴
    • 我找到了一个 Apple 示例,它几乎完成了我想做的事情。我对其进行了很多调整,但我正用头撞墙,试图让图像循环播放。这是我认为有问题的代码,但我不确定解决方案是什么,因为 ScrollView 是功能性的,它只是不会将中心重置为当前视图。有任何想法吗?代码在上面。
    • 这看起来很棒。一旦我弄清楚什么是哨兵是为什么 NSArray 缺少一个,它看起来应该可以工作(从我的搜索看来,哨兵问题与 NSArray 的子类化有关。我确信我有它的问题表明我的经验水平,而不是你做的)。我非常感谢你在这方面给我的帮助。读完两本密码书后,我刚刚决定以这种方式学习是最好的,而且你对我的帮助很大。
    • 看起来 imageViews 需要用 @"" 包裹起来,然后是 nil。摆脱了哨兵问题,但仍然抛出异常。正在调查。
    • 也可以添加scrollview.pagingEnabled=YES;那么你就不需要委托 scrollviewDidEndDecelerating:
    【解决方案2】:

    查看cocoacontrols.com 以获取自定义相册视图。至于震动,这段代码sn-p震动手机(一定要链接到#import &lt;AudioToolbox/AudioToolbox.h&gt;):

     AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    

    【讨论】:

    • 谢谢!我肯定会使用它。
    • 没问题。我的建议是除非绝对必要,否则不要振动手机。有点烦人!
    • 我可能最终会将其设为一个设置。我的生活是安静的,所以我不会强迫任何人振动。 :)
    猜你喜欢
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多