Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 带有PaginEnabled的UIScrollView中页面之间的照片类应用程序间隙_Iphone_Cocoa Touch_Uiscrollview - Fatal编程技术网

Iphone 带有PaginEnabled的UIScrollView中页面之间的照片类应用程序间隙

Iphone 带有PaginEnabled的UIScrollView中页面之间的照片类应用程序间隙,iphone,cocoa-touch,uiscrollview,Iphone,Cocoa Touch,Uiscrollview,分页模式下的UIScrollView假定页面彼此相邻,没有间隙。但是,如果你在照片应用程序中打开一张照片并浏览照片,你会发现页面之间有一些间隙。我也想要这些空隙 我正在寻找现有的解决方案,如果有的话,或者寻找一些关于实现页面间隙的更奇怪的想法,除了我在下面解释的那个。或者也许我错过了一些显而易见的简单方法 需要明确的是:我希望间隙仅在滚动时可见,因此我不能简单地插入页面内容 我的计划是尝试将页面内容从scrollViewDidScroll回调内部移动,以便(假设您向右滚动)最初目标页面稍微偏移

分页模式下的UIScrollView假定页面彼此相邻,没有间隙。但是,如果你在照片应用程序中打开一张照片并浏览照片,你会发现页面之间有一些间隙。我也想要这些空隙

我正在寻找现有的解决方案,如果有的话,或者寻找一些关于实现页面间隙的更奇怪的想法,除了我在下面解释的那个。或者也许我错过了一些显而易见的简单方法

需要明确的是:我希望间隙仅在滚动时可见,因此我不能简单地插入页面内容


我的计划是尝试将页面内容从
scrollViewDidScroll
回调内部移动,以便(假设您向右滚动)最初目标页面稍微偏移到其页面边界的右侧,当您到达目标页面时,它会回到其正确的位置,并且源页面稍微偏移到其边界的左侧。(或者,与其连续移动内容,不如将偏移量移动到页面中间。)

我是这本书的作者,我在这里提到了一些人。我已经实现了程序化缩放,并与照片间分页一起使用照片缩放+滚动。所以我知道如何使用UIScrollView,我正在寻找高级的东西


请不要把我指给我看。我自己已经指出了很多人,但我认为它离本地UISCRVIEW行为太远了,而且不想在我的项目中使用它。

< P>这只是一个预感,如果完全错了,那么道歉,但是有可能CordNeStices仅仅设置为比屏幕宽度稍微宽一点。
然后在视图中按屏幕宽度呈现正确的信息,其余信息由UIScrollView处理?

是否尝试UIScrollView的contentInset属性

myScrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 10.0);
请注意,这个答案相当古老。基本概念仍然有效,但是 您不应该在iOS7和IOS8中硬编码视图大小。即使你忽略了 根据建议,您不应使用480或330

您是否尝试过使
UIScrollView
的框架略大于屏幕(假设您希望全屏显示图像,然后将子视图排列在略大于屏幕边界的相同区域上

#define kViewFrameWidth 330; // i.e. more than 320

CGRect scrollFrame;
scrollFrame.origin.x = 0;
scrollFrame.origin.y = 0; 
scrollFrame.size.width = kViewFrameWidth;
scrollFrame.size.height = 480;

UIScrollView* myScrollView = [[UIScrollView alloc] initWithFrame:scrollFrame];
myScrollView.bounces = YES;
myScrollView.pagingEnabled = YES;
myScrollView.backgroundColor = [UIColor redColor];

UIImage* leftImage = [UIImage imageNamed:@"ScrollTestImageL.png"];
UIImageView* leftView = [[UIImageView alloc] initWithImage:leftImage];
leftView.backgroundColor = [UIColor whiteColor];
leftView.frame = CGRectMake(0,0,320,480);

UIImage* rightImage = [UIImage imageNamed:@"ScrollTestImageR.png"];
UIImageView* rightView = [[UIImageView alloc] initWithImage:rightImage];
rightView.backgroundColor = [UIColor blackColor];
rightView.frame = CGRectMake(kViewFrameWidth * 2,0,320,480);

UIImage* centerImage = [UIImage imageNamed:@"ScrollTestImageC.png"];
UIImageView* centerView = [[UIImageView alloc] initWithImage:centerImage];
centerView.backgroundColor = [UIColor grayColor];
centerView.frame = CGRectMake(kViewFrameWidth,0,320,480);

[myScrollView addSubview:leftView];
[myScrollView addSubview:rightView];
[myScrollView addSubview:centerView];

[myScrollView setContentSize:CGSizeMake(kViewFrameWidth * 3, 480)];
[myScrollView setContentOffset:CGPointMake(kViewFrameWidth, 0)];

[leftView release];
[rightView release];
[centerView release];

抱歉,如果无法编译,我在一个横向应用程序中对其进行了测试,并将其手动编辑回纵向。不过我相信你会明白这一点。它依赖于superview剪辑,而对于全屏视图来说,这将始终是一种情况。

实现这一点的方法就像你所说的,是几件事情的组合

如果希望图像之间的间隔为20px,则需要:

首先,将滚动视图的总宽度扩展20px,然后向左移动10px

第二,在布置图像的xLoc时,为每个图像添加20px,使它们的间距为20px。 第三,将图像的初始xLoc设置为10px,而不是0px

第四,确保将滚动视图的内容大小设置为每个图像增加20px。因此,如果您有kNumImages图像,并且每个图像的宽度为kScrollObjWidth,则如下所示:

[scrollView setContentSize:CGSizeMake((kNumImages * (kScrollObjWidth+20)),  kScrollObjHeight)];
在那之后应该可以用了!

所以我没有足够的“代表”对上面的答案发表评论。这个答案是正确的,但有一个大问题需要注意:

如果在作为UINavigationController一部分的viewController中使用UIScrollView,则导航控制器将调整scrollView框架的大小

也就是说,您有一个使用UINavigationController在不同视图之间切换的应用程序。您推送一个具有scrollView的viewController,然后在viewController的-init方法中创建此scrollView。您为其分配一个帧(0、0、340、480)

现在,转到viewController的-ViewDidDisplay方法,获取您创建的scrollView的帧。您会发现宽度已减少到320像素。因此,分页无法正常工作。您希望scrollView移动340像素,但它将移动320像素

UINavigationController因干扰子视图而臭名昭著。它会移动子视图并调整其大小以适应导航栏。简而言之,它不是一个团队成员,尤其是在这种情况下。如果您需要精确控制视图的大小和位置,web上的其他地方建议您不要使用UINavigationController。他们建议相反,您可以基于UINavigationBar创建自己的navigationController类

这是一项繁重的工作。幸运的是,有一个更简单的解决方案:在viewController的-ViewDidDisplay方法中设置scrollView的框架。此时,UINavigationController已完成对框架的处理,因此您可以将其重置为应该的状态,scrollView将正常运行

这与操作系统3.0有关。我没有测试过3.1或2.2.1。我还向苹果提交了一份错误报告,建议他们使用诸如“-shouldAutoArrangeSubview”之类的BOOL修改UINavigationController,以便我们可以使该类不受子视图的影响


在此之前,上述修复程序将在UINavigationController内的分页UIScrollView中为您提供间隙。

苹果已向iphone开发者计划的所有成员发布了2010年WWDC会话视频。讨论的主题之一是他们如何创建照片应用!!!他们一步一步地构建了一个非常类似的应用程序,并完成了所有任务代码免费提供

它也不使用私有api。这里是下载示例代码的链接。您可能需要登录才能访问

下面是iTunes WWDC页面的链接:


我只是想在这里为子孙后代添加我最终采用的解决方案。很长一段时间以来,我一直在使用Bryan的解决方案来调整
-viewdide
中的帧,而且效果非常好。但是自从iOS引入
CGRect frame = CGRectMake(0, 0, 320, 460);
scrollView = [[UIScrollView alloc] initWithFrame:frame];

// I do some things with frame here

CGRect f = scrollView.frame;
f.size.width += PADDING; // PADDING is defined as 20 elsewhere
scrollView.frame = f;

[self.view addSubview:scrollView];
- (void) layoutSubviews
{
    [super layoutSubviews];

    // Find a reference point to calculate the offset:
    CGRect bounds = self.bounds;
    CGFloat pageGap = 8.f;
    CGSize pageSize = bounds.size;
    CGFloat pageWidth = pageSize.width;
    CGFloat halfPageWidth = pageWidth / 2.f;
    CGFloat scale = self.zoomScale;
    CGRect visibleRect = CGRectMake(bounds.origin.x / scale, bounds.origin.y / scale, bounds.size.width / scale, bounds.size.height / scale);
    CGFloat totalWidth = [self contentSize].width / scale;
    CGFloat scrollWidth = totalWidth - visibleRect.size.width;
    CGFloat scrollX = CGRectGetMidX(visibleRect) - visibleRect.size.width / 2.f;
    CGFloat scrollPercentage = scrollX / scrollWidth;
    CGFloat referencePoint = (totalWidth - pageWidth) * scrollPercentage + halfPageWidth;

    // (use your own way to get all visible pages, each page is assumed to be inside a common container)
    NSArray * visiblePages = [self visiblePages];

    // Layout each visible page:
    for (UIView * view in visiblePages)
    {
        NSInteger pageIndex = [self pageIndexForView:view]; // (use your own way to get the page index)

        // make a gap between pages
        CGFloat actualPageCenter = pageWidth * pageIndex + halfPageWidth;
        CGFloat distanceFromRefPoint = actualPageCenter - referencePoint;
        CGFloat numOfPageFromRefPoint = distanceFromRefPoint / pageWidth;
        CGFloat offset = numOfPageFromRefPoint * pageGap;
        CGFloat pageLeft = actualPageCenter - halfPageWidth + offset;

        view.frame = CGRectMake(pageLeft, 0.f, pageSize.width, pageSize.height);
    }
}