i'm trying create view of "match" image , "match price" label in top right corner of match image. far works fine- create image in container view, create uiimageview background of price label, when create actual label , customize it, takes forever load in app (that say, loads- match image, price label background image, not actual label detailing price). can spot in code i'm going wrong?
func setupminicontentscroll(contentscroll: uiscrollview) { let scalar:double = 6/19 let contentviewdimension = contentscroll.frame.width * cgfloat(scalar) let contentscrollwidth = cgfloat(localuser.matches.count) * (contentviewdimension + cgfloat(12)) - cgfloat(12) contentscroll.backgroundcolor = uicolorfromhex(0x34495e) index in 0..<localuser.matches.count { let match = localuser.matches[index] matchesmanager.globalmanager.retrievematchthumbnail(match) { img, error in if let img = img { //create mini matches views let xorigin = index == 0 ? 12 : cgfloat(index) * contentviewdimension + (cgfloat(12) * cgfloat(index) + cgfloat(12)) let contentframe = cgrectmake(xorigin, 10, contentviewdimension, contentviewdimension) let contentview = self.makeminicontentview(contentframe, image: img, matchedprice: match.matchedprice) contentview.match = match let tap = uitapgesturerecognizer(target: self, action: #selector(browseviewcontroller.toggleiteminfo(_:))) contentview.addgesturerecognizer(tap) //update contentscrollview dispatch_async(dispatch_get_main_queue()) { contentscroll.addsubview(contentview) contentscroll.contentsize = cgsizemake(contentscrollwidth + cgfloat(16), contentscroll.frame.height) } } } } } //functions create labels , imgviews minimymatches func makeminicontentview(frame: cgrect, image: uiimage, matchedprice: int) -> itemcontainer { let containerview = itemcontainer(frame: frame) //create item image let imgview = uiimageview(frame: cgrect(x: 0, y: 0, width: containerview.frame.width, height: containerview.frame.height)) imgview.image = image imgview.layer.cornerradius = 5 imgview.layer.maskstobounds = true imgview.userinteractionenabled = true //create price label dispatch_async(dispatch_get_main_queue()) { let pricelabel = self.makeminipricelabel(containerview, matchedprice: matchedprice) containerview.addsubview(imgview) containerview.addsubview(pricelabel) } return containerview } func makeminipricelabel(containerview: itemcontainer, matchedprice: int) -> uiview { //price label var let pricelabelframe = cgrectmake(containerview.frame.size.width - 35, -7, containerview.frame.size.width * 0.50, containerview.frame.size.height * 0.35) //create price container let pricecontainer = uiimageview(frame: pricelabelframe) pricecontainer.image = uiimage(named: "venn.png") //create price label let pricelabel = uilabel(frame: cgrect(x: 3, y:0, width: pricecontainer.frame.width, height: pricecontainer.frame.height)) pricelabel.text = "$\(matchedprice)" pricelabel.numberoflines = 1 pricelabel.textcolor = uicolor.whitecolor() pricelabel.font = pricelabel.font.fontwithsize(20) pricecontainer.addsubview(pricelabel) return pricecontainer }
my guess closure retrievematchthumbnail
function being called on background thread. have code in closure manipulating ui objects. move ui code inside call dispatch_async():
matchesmanager.globalmanager.retrievematchthumbnail(match) { img, error in if let img = img { //create mini matches views let xorigin = index == 0 ? 12 : cgfloat(index) * contentviewdimension + (cgfloat(12) * cgfloat(index) + cgfloat(12)) let contentframe = cgrectmake(xorigin, 10, contentviewdimension, contentviewdimension) //update contentscrollview dispatch_async(dispatch_get_main_queue()) { let contentview = self.makeminicontentview(contentframe, image: img, matchedprice: match.matchedprice) contentview.match = match let tap = uitapgesturerecognizer(target: self, action: #selector(browseviewcontroller.toggleiteminfo(_:))) contentview.addgesturerecognizer(tap) contentscroll.addsubview(contentview) contentscroll.contentsize = cgsizemake(contentscrollwidth + cgfloat(16), contentscroll.frame.height) } } }
Comments
Post a Comment