A long time ago wanted to write such an infinite scrolling demo, recently learned the next swift, the hands can not be used to practiced hand the demo, so it is realized.
GitHub address (due to the use of Uiview+autolayout third party layout, GitHub determines that the primary language is OC): Https://github.com/wzpziyi1/DisplayingImage
Using Uicollectionview, unlike the Uiscrollview implementation, it is not necessary to manually implement the cache pool function, because the cell in Uicollectionview is recycled, I just need to deal with infinite scrolling and the removal and addition of timers.
It needs to be noted here that the Mjextension framework does not perfectly support swift, I am writing the process, using it to parse a plist file, did not succeed, and then wrote a KVC parsing, I hope MJ teacher as soon as possible to upgrade it to the swift version of it.
Example Picture:
In the process of writing, the problem is still more, because I am not so familiar with the swift cause, the individual think Swift is the most bad point, is not yet a unified specification. I am from OC to Swift, so the code is basically the set of rules that use OC, but from other languages, there may be a big difference.
-
- This is the code that reads the data from the plist and stores it inside the array:
Class Zynew:nsobject { var icon:string! var title:string! Init (dict:dictionary<string, string>) { super.init () self.setvaluesforkeyswithdictionary (dict) } Class Func Getnews (), array<zynew> {let path = Nsbundle.mainbundle (). Pathforresource (" Newses.plist ", Oftype:nil) let originarray:nsarray? = Nsarray (contentsoffile:path!) var news = array<zynew> () Originarray?. Enumerateobjectsusingblock ({(Obj:anyobject, index:int, stop:unsafemutablepointer<objcbool>), Void in Let tmp = zynew (dict:obj as! Dictionary<string, string>) news.append (tmp) }) return news }}
There's a hole in here. The array type in SWIFT does not have a contentsoffile method, that is, an array is not used to read a plist from a file path and then convert it to an array. Well, no that even, anyway can use Nsarray, then I use Nsarray transformation is good, and then fell into the pit.
In Swift, the nsarray\nsdictionary in OC and so on are all considered to be anyobject types, which means that you are wrong when you convert Nsarray to array<zynew>. For example, in the code above, I use the following code to force conversions:
Let Originarray:nsarray? = Nsarray (contentsoffile:path!)
Let news:array<zynew> = Originarray as! [Zynew]
This turns out to be wrong here, because the real type of anyobject is the dictionary, and then I change it into the code above.
- Code for Custom Uicollectionviewcell:
Import Uikitclass Zynewcell:uicollectionviewcell {//mark:-storage attribute var new:zynew? {didset{//print (new?. icon) Self.imageView.image = UIImage (named: (New?. ICON)!) Self.titleLabel.text = new?. Title}}//mark:-Compute properties//mark:-UI Properties private weak Var imageview:uiimageview! Private weak Var titlelabel:uilabel! Override Init (Frame:cgrect) {super.init (frame:frame) self.commitinit ()} required init? (Coder Adecoder:nscoder) {super.init (Coder:adecoder) Self.commitinit ()} private func Commitinit () {Let Imagev Iew = Uiimageview () Imageview.contentmode = Uiviewcontentmode.scaleaspectfill Imageview.clipstobounds = True Self.addsubview (imageView) Self.imageview = ImageView Let Titlelabel = UILabel () titl Elabel.textalignment = Nstextalignment.center Titlelabel.textcolor = Uicolor.whitecoLor () Self.addsubview (titlelabel) Self.titlelabel = Titlelabel} override func Layoutsubviews () { Super.layoutsubviews () self.imageView.autoPinEdgesToSuperviewEdgesWithInsets (Uiedgeinsetszero) Self.titleLabel.autoPinEdgesToSuperviewEdgesWithInsets (Uiedgeinsetszero, ExcludingEdge:ALEdge.Bottom) self.title Label.autosetdimension (Aldimension.height, tosize:30)}}
It is very well written here, due to the coding habits of OC, I like to layer the properties of the class, so that I can quickly find the problem in the late development, code to see the past is also a glance.
There are two types of properties in Swift:
Storage properties: It has Willset and Didset methods
Computed properties: It has set and get methods
The feeling is that the getter and setter methods corresponding to the OC can be rewritten.
- Main code Zyimagedisplayingview:
Import Uikitclass Zyimagedisplayingview:uiview, Uicollectionviewdelegate, Uicollectionviewdatasource {//MARK:-Constants Private let identifier = "Zynewcell"//mark:-storage properties override Var frame:cgrect{didset{if (Self.collectionview! = nil) {Self.collectionview?. Removefromsuperview ()} if (frame.width = = 0.0 && Frame.height = = 0.0 && frame.origin.x = = 0.0 && FRAME.ORIGIN.Y = = 0.0) {return} let L Ayout = Uicollectionviewflowlayout () layout.itemsize = frame.size Layout.scrolldirection = UICollect Ionviewscrolldirection.horizontal layout.minimumlinespacing = 0 Let CollectionView = Uicollectionvie W (frame:cgrectmake (0, 0, Frame.width, frame.height), collectionviewlayout:layout) Collectionview.registerclas S (zynewcell.self, Forcellwithreuseidentifier:identifier) collectionView.showshorizontalscrollindicator = False Self.addsubview (CollectionView) Self.collectionview = Co Llectionview self.collectionview!. delegate = self self.collectionview!. DataSource = self self.collectionview!. BackgroundColor = Uicolor.whitecolor () self.collectionview!. Pagingenabled = True self.collectionview!. Scrolltoitematindexpath (Nsindexpath (foritem:0, INSECTION:ZYIMAGEGROUPS/2), Atscrollposition: Uicollectionviewscrollposition.none, Animated:false) Self.bringsubviewtofront (Pagecontrol) Self.addtimer ()}} var news = Zynew.getnews () var timer:nstimer? Mark:-Compute properties//mark:-UI control weak var collectionview:uicollectionview? Weak Var pagecontrol:uipagecontrol! Mark:-Initialization method override init (Frame:cgrect) {super.init (frame:frame) self.commitinit ()} requ Ired init? (coder Adecoder:nscoder) {super.init (Coder:adecoder) Self.commitinit ()} private func com Mitinit () {self.backgroundcolor = Uicolor.yellowcolor () var Pagecontrol = Uipagecontrol () Pagecontrol . numberofpages = Self.news.count Pagecontrol.pageindicatortintcolor = Uicolor.redcolor () pagecontrol.current Pageindicatortintcolor = Uicolor.whitecolor () self.addsubview (pagecontrol) Self.pagecontrol = PageControl }//mark:-uicollectionviewdatasource func numberofsectionsincollectionview (Collectionview:uic Ollectionview), Int {return zyimagegroups} func CollectionView (Collectionview:uicollectionview, n Umberofitemsinsection section:int), Int {return self.news.count} func CollectionView (CollectionView: Uicollectionview, Cellforitematindexpath Indexpath:nsindexpath), Uicollectionviewcell {var cell:ZYNe Wcell? = CollectionView.Dequeuereusablecellwithreuseidentifier (Self.identifier, Forindexpath:indexpath) as? Zynewcell if (cell = = nil) {cell = Zynewcell ()}//print (Self.news[indexpath.row]) Cell?. New = Self.news[indexpath.row] return cell! }//mark:-uiscrollviewdelegate func scrollviewwillbegindragging (scrollview:uiscrollview) {Self.rem Ovetimer ()}//When ScrollView deceleration is complete, it is best to add timer func scrollviewdidenddecelerating (Scrollview:uiscrollview) at this time Self.addtimer ()} func Scrollviewdidscroll (Scrollview:uiscrollview) {Let size = Scrollview.cont entoffset//print (size) Self.pageControl.currentPage = Int (size.x/(Self.collectionview?. Frame.width)! + 0.5)% Self.news.count}//mark:-Timer handling func AddTimer () {Self.removetimer () Self.timer = Nstimer (Timeinterval:2, Target:self, Selector:selector ("Updatetimer"), Userinfo:nil, repeats:true) NSRunLoop.m AinrUnloop (). AddTimer (self.timer!, Formode:nsrunloopcommonmodes)} func Removetimer () {Self.timer?. Invalidate () Self.timer = nil} func Updatetimer () {Let Currentindexpath = Self.resetindexpath () var section = currentindexpath.section var row = Currentindexpath.row + 1 if (row = = Self.news.count) {row = 0 section++} self.collectionview?. Scrolltoitematindexpath (Nsindexpath (Foritem:row, Insection:section), Atscrollposition: Uicollectionviewscrollposition.none, Animated:true)} func Resetindexpath (), Nsindexpath {let C Urrentindexpath = Self.collectionview?. Indexpathsforvisibleitems (). First Self.collectionview?. Scrolltoitematindexpath (Nsindexpath (Foritem): (Currentindexpath?. Row), INSECTION:ZYIMAGEGROUPS/2), AtScrollPosition:UICollectionViewScrollPosition.None, Animated:false) retur N Nsindexpath (foritem: (cuRrentindexpath?. Row), INSECTION:ZYIMAGEGROUPS/2)} override func Layoutsubviews () {super.layoutsubviews () sel F.pagecontrol.autopinedgetosuperviewedge (Aledge.bottom, Withinset:8) Self.pageControl.autoPinEdgeToSuperviewEdge (Aledge.right, withinset:20) self.pageControl.autoSetDimensionsToSize (Cgsizemake (100, 20)}}
This part of the code is more of a logical process. Plist There are only 5 specific model, I am assuming that Collectionviewcell has 100 groups (that is, section equals 100), each group has 5 rows (that is, row equals 5), every minor scroll to the next cell, I will first let it scroll to Sectio equals 50, and then row does not change, in the beginning to scroll to the next, that is, row+1, if the row is more than the number of model plist, then the corresponding, Section++,row zeroed.
What is worth saying here is that I rewrote the frame property of the parent class, and when the Zyimagedisplayingview frame changes, it triggers the Didset method of the property, I initialized the Uicollectionview in this method and made the corresponding settings. Personally think this is not very good, I should not be in this method to initialize the Uicollectionview, this should have a few considerations:
If I use AutoLayout to layout this control, Is the Didset method that does not trigger the frame.
If I need to change the location of the Zyimagedisplayingview, then to avoid repeating the creation of Uicollectionview,
& nbsp I must first remove the previously created Uicollectionview, and then
Create a new CollectionView.
Other, [Zyimagedisplayingview class] in OC corresponds to zyimagedisplayingview.self in Swift
OC #pragma mark corresponds to//in Swift MARK:-< br>
- code inside the Viewcontroller:
iOS Development: A demo (Swift language Encoding) for an unlimited scrolling auto-play picture