分页模式下的UIScrollView假定页面彼此相邻,没有间隙.但是,如果您在"照片"应用中打开照片并在照片中滑动,则可以看到页面之间存在一些差距.我也想要这些差距.
我正在寻找现有的解决方案,或者除了我在下面解释的那个之外,还有一些关于实现页面间隙的奇怪想法.或者也许有一些我想念的明显简单方法?
要明确:我希望在滚动时只能看到间隙,所以我不能简单地插入页面内容.
我的计划是尝试从scrollViewDidScroll
回调内部移动页面内容,以便(假设您向右滚动)最初目标页面略微偏移到其页面边界的右侧,并且到达目标页面时它回到了正确的位置,源页面略微偏向其边界的左侧.(或者也许不是连续移动东西,我会更好地转移偏移量,比如说恰好在页面之间.)
我是ScrollingMadness文章+例子的作者,我一直在这里引用一些人.我已经实现了编程缩放,并且使用照片间缩放和滚动工作以及照片间分页.所以我知道如何玩UIScrollView,我正在寻找高级的东西.
请不要指向TTScrollView.我自己已经指出了很多人,但我认为它与原生的UIScrollView行为相距太远,并且不想在我的项目中使用它.
请注意,这个答案很古老.基本概念仍然有效,但您不应该在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];
如果这不能编译,我会道歉,我在一个横向应用程序中测试它并手动编辑回肖像.我相信你明白了.它依赖于超视图剪辑,对于全屏视图始终如此.
所以我没有足够的"代表"对上面的答案发表评论.答案是正确的,但有一个大问题需要注意:
如果您在视图控制器中使用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中的空白.
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