翻译自:Parallax ScrollView In Swift

这周,我有机会在一个私有的项目上使用了UICollectionView。实际上,我在UICollectionViewCell上应用了一种简单的视差效果。介绍下,视差效果的走红得益于2011年网页设计师在HTML5和CSS3中的使用。

我要提醒的是视差效果并不适合每一个人,应该谨慎的使用它(还记得最初在iPhone上使用时,人们会感到眩晕)。虽然,它是一个非常棒的特色。

直接要代码,在这里GitHub。下面是一个简短的教程和一些关于视差的重点片段。

这个教程有重要的两步:

  1. 设置collection view的数据源
  2. 实现视差效果

使用Single View Application模板来创建一个新的工程。在Xcode创建项目后,会有 AppDelegate,ViewController,Main storyboard 和一堆其它的文件。

打开Main.storyboard,替换ViewController为CollectionViewController。设置table view的size为紧凑型:

调整cell的大小,宽度与CollectionView的宽度相同,高度为160:

选中cell后,设置identifier为:

parallaxCell

cell上添加UIImageView,调整其大小为320X200(UIImageView 比cell要高)。

接下来是,设置content view mode为 Aspect Fil。这很重要。

现在创建一个自定义的cell。选择File > New > File,选择Cocoa Touch Class 。命名为ParallaxCollectionViewCell,继承自UICollectionViewCell。

选择ParallaxCollectionViewCell类,添加如下的全局常亮:

let ImageHeight: CGFloat = 200.0
let OffsetSpeed: CGFloat = 25.0

为UIImageView声明一个outlet:

@IBOutlet var imageView: UIImageView

图片变量来持有你的图片(利用didSet来设置imageView的image)

var image: UIImage = UIImage() {
    didSet {
        imageView.image = image
    }
}

实现offset函数,来偏移image view:

func offset(offset: CGPoint) {
    imageView.frame = CGRectOffset(self.imageView.bounds,offset.x,offset.y)
}

选择ViewController,改变其继承为UICollectionViewController。声明一个常量:

let parallaxCellIdentifier = "parallaxCell"

声明一个数组来保存图片数据:

var images = [String]()

接下来,下载图片,加入到项目中。在你的ViewController中,添加如下的代码到viewDidLoad: 函数中:

for i in 0...14 {
    images.append("\(i)@2x")
}

实现数据源函数:

override func collectionView(collectionView: UICollectionView!,numberOfItemsInSection section: Int) -> Int {
    return images.count
}
override func collectionView(collectionView: UICollectionView!,cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {
    let parallaxCell = collectionView.dequeueReusableCellWithReuseIdentifier(parallaxCellIdentifier,forIndexPath: indexPath) as ParallaxCollectionViewCell
    parallaxCell.image = UIImage(named: images[indexPath.row])
    return parallaxCell
}

接下来,实现UIScrollView的代理方法:

override func scrollViewDidScroll(scrollView: UIScrollView!) {
    if let visibleCells = collectionView.visibleCells() as? [ParallaxCollectionViewCell] {
    for parallaxCell in visibleCells {
    var yOffset = ((collectionView.contentOffset.y - parallaxCell.frame.origin.y) / ImageHeight) * OffsetSpeed
    parallaxCell.offset(CGPointMake(0.0,yOffset))
  }
 }
}

运行项目,滚动看看!

有视差的滚动视图-Parallax ScrollView In Swift的更多相关文章

  1. ios – UICollectionView在帧更改后错误地显示单元格

    我错过了什么吗?

  2. ios – 如何将UICollectionViewCell从一个UICollectionView拖到另一个UICollectionView?

    如果是这样,我将如何实施它?

  3. ios – 在uicollectionview底部添加加载指示符

    解决方法不,没有“内置”的方式.您需要做的是有一个包含加载器的额外单元格.检测此单元格何时出现非常简单,此时您可以启动调用以加载更多数据.

  4. iOS将UIView转换为ScrollView而不破坏布局?

    是否有可能在不破坏所有约束和放置的情况下从UIView移动到UIScrollView.问题是我构建整个UI而不在iPhone4上测试它,现在我看到一些视图应该在ScrollView中工作.我尝试了一些技巧,但没有任何作用.约束被删除.以下是示例的示例图片:现在我希望test1UIView是ScrollView,我试图将ScrollView放在test1View中,然后在滚动视图中递归复制test1

  5. ios – 使用自定义布局的UICollectionView接口旋转

    方法返回的布局属性的center属性时,一切看起来都是正确的–所有都沿着水平轴均匀分布.没有正确动画的单元格的唯一区别特征是,当调用initialLayout…方法时,它的单元格不会在[collectionViewvisibleCells]数组中返回.layoutAttributesForElementsInRect:在它之前确实正确地标识了它的布局属性.发生什么了?对引擎盖下发生的事情的一些见解会非常有用……

  6. ios – UICollectionView神秘崩溃

    我有一个UICollectionView,我用从Internet下载的图像填充单元格.为此我使用SDWebImage.我的代码如下所示:我相信我已经正确地设置了它.但应用程序完全随机崩溃,有时会留下此堆栈跟踪:日志区域中没有其他消息.我尝试设置异常断点,但每次发生此崩溃时,都会显示此堆栈跟踪.有谁知道可能是什么问题?解决方法如果有人在寻找答案,我已经解决了问题,并回答了与同一问题有关的另一个问题.你可以找到它here.希望它有所帮助!

  7. ios – performBatchUpdates上的UICollectionView性能问题

    我们正在尝试使用自定义布局设置UICollectionView.每个CollectionViewCell的内容都是一个图像.总之,将会有数千张图像,并且在某个特定时间可以看到大约140-150张图像.在动作事件中,可能会在位置和大小上重新组织所有单元格.目标是使用performBatchUpdates方法为当前所有移动事件设置动画.在一切变得动画之前,这会导致很长的延迟时间.到目前为止,我们发现内

  8. ios – 放大故事板中的任何视图时,Xcode 8.2和8.1崩溃

    当我单击视图框并拖动以放大视图时,视图不会放大.但相反,鼠标等待指示器将持续一秒钟,然后整个xcode将崩溃.这是在我的代码8.2更新后发生的.所以我尝试安装xcode8.1,问题仍然存在于一个特定项目中.所有其他项目都运作良好.故事板中没有警告或冲突.我不记得改变任何设置.附加崩溃日志:CRASH_LOG解决方法修正了问题:在我将ScrollView添加到ViewController并更改了Vi

  9. ios – UICollectionView 2种不同的背景颜色

    如果用户向下滚动,我会尽量避免在我的collectionview单元格顶部显示白色背景颜色.所以在我的单元格顶部只有collectionview背景颜色可见.但如图所示,我需要2种不同的颜色.对于第一部分,背景应为蓝色,因此间隙不是白色而是蓝色,而对于其他部分,它应保持白色.所以我想要的是,在不改变我的uicollectionview的完整背景颜色的情况下,白色的间隙将变为蓝色.解决方法您可以通过在UICollectionView或UITableView的顶部添加视图来实现所需的效果–它将与内容一起滚动并

  10. ios – UIButton在uiscrollView中不起作用

    我有一个将UIView作为子视图的scrollView.这有UIView子视图UIButton.只有scrollView连接到插座,其余全部都是代码.按钮不响应触摸,触摸时不变蓝.我能做些什么才能让它发挥作用?这是代码:解决方法您必须设置视图的内容大小.它必须大于或等于scrollView的内容大小.因为您的视图的默认大小是320*480和320*568.因此,增加视野的高度–self.view.frame=CGRectMake;然后将其添加为scrollView的子视图.将帮助您解决问题.

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部