当前位置:  开发笔记 > 编程语言 > 正文

使用pagingEnabled在UIScrollView中的页面之间的应用程序之间的差距

如何解决《使用pagingEnabled在UIScrollView中的页面之间的应用程序之间的差距》经验,为你挑选了3个好方法。

分页模式下的UIScrollView假定页面彼此相邻,没有间隙.但是,如果您在"照片"应用中打开照片并在照片中滑动,则可以看到页面之间存在一些差距.我也想要这些差距.

我正在寻找现有的解决方案,或者除了我在下面解释的那个之外,还有一些关于实现页面间隙的奇怪想法.或者也许有一些我想念的明显简单方法?

要明确:我希望在滚动时只能看到间隙,所以我不能简单地插入页面内容.


我的计划是尝试从scrollViewDidScroll回调内部移动页面内容,以便(假设您向右滚动)最初目标页面略微偏移到其页面边界的右侧,并且到达目标页面时它回到了正确的位置,源页面略微偏向其边界的左侧.(或者也许不是连续移动东西,我会更好地转移偏移量,比如说恰好在页面之间.)

我是ScrollingMadness文章+例子的作者,我一直在这里引用一些人.我已经实现了编程缩放,并且使用照片间缩放和滚动工作以及照片间分页.所以我知道如何玩UIScrollView,我正在寻找高级的东西.

请不要指向TTScrollView.我自己已经指出了很多人,但我认为它与原生的UIScrollView行为相距太远,并且不想在我的项目中使用它.



1> Rog..:

请注意,这个答案很古老.基本概念仍然有效,但您不应该在iOS7和8中对视图大小进行硬编码.即使您忽略该建议,也不应使用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];

如果这不能编译,我会道歉,我在一个横向应用程序中测试它并手动编辑回肖像.我相信你明白了.它依赖于超视图剪辑,对于全屏视图始终如此.


只需快速了解一下Andrey的注释:您可以使用UIScrollView的scrollIndicatorInsets属性移动滚动指示器.
使滚动视图大于屏幕是天才.谢谢

2> 小智..:

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

如果您在视图控制器中使用UIScrollView,它是UINavigationController的一部分,则导航控制器将调整scrollView框架的大小.

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

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

弄乱子视图有点臭名昭着UINavigationController.它移动它们并调整它们以适应导航栏.简而言之,它不是一个团队合作者 - 特别是在这种情况下.如果您需要精确控制视图的大小和位置,Web上的其他位置建议您不要使用UINavigationController.他们建议您基于UINavigationBar创建自己的navigationController类.

那是很多工作.幸运的是,有一个更简单的解决方案:在viewController的-viewDidAppear方法中设置scrollView的框架.此时,UINavigationController完成了对框架的干扰,因此您可以将其重置为应该的状态,并且scrollView将正常运行.

这与OS 3.0相关.我没有测试3.1或2.2.1.我还向Apple提交了一个错误报告,建议他们使用BOOL修改UINavigationController,例如"-shouldAutoarrangeSubviews",以便我们可以让该类保持其粗略的关闭子视图.

在此之前,上面的修复将为您提供UINavigationController中的分页UIScrollView中的空白.



3> Jonah..:

Apple已向iphone开发者计划的所有成员发布了2010 WWDC会话视频.讨论的主题之一是他们如何创建照片应用程序!他们逐步构建一个非常相似的应用程序,并使所有代码免费提供.

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

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

并且,这是iTunes WWDC页面的链接:

http://insideapple.apple.com/redir/cbx-cgi.do?v=2&la=en&lc=&a=kGSol9sgPHP%2BtlWtLp%2BEP%2FnxnZarjWJglPBZRHd3oDbACudP51JNGS8KlsFgxZto9X%2BTsnqSbeUSWX0doe%2Fzv%2FN5XV55%2FomsyfRgFBysOnIVggO%2Fn2p%2BiweDK%2F%2FmsIXj

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有