Tuesday 15 June 2010

objective c - Why does my view controller inside a UIPopoverPresentationController take up the whole screen? -



objective c - Why does my view controller inside a UIPopoverPresentationController take up the whole screen? -

i in process of upgrading app ios 7 ios 8, , 1 of areas having problem new uipopoverpresentationcontroller. reason, whenever nowadays view controller using class, view controller not appear in popover, instead presents beingness pushed onto nav stack (takes whole screen). i'm sure i'm missing obvious, between apple's documentation , numerous swift answers on missing it. here's code:

-(void)createandsizepopover:(nsstring*)tablename { //create picklist self.picklistpopoverviewcontroller = nil; //note wspicklistviewcontroller uiviewcontroller self.picklistpopoverviewcontroller = [[wspicklistviewcontroller alloc] initwithnibname:nil bundle:nil withpicklistitem:self.densityunits andpicklisttablename:tablename isslimline:yes]; self.picklistpopoverviewcontroller.showsearchbar = no; self.picklistpopoverviewcontroller.modalpresentationstyle = uimodalpresentationpopover; ((wspicklistviewcontroller*)self.picklistpopoverviewcontroller).picklistitemdelegate = self; //size popover nsinteger rowscount = [self.picklistpopoverviewcontroller.allobjects count]; nsinteger singlerowheight = 35; nsinteger totalrowsheight = rowscount * singlerowheight; nsinteger fourrowsheight = 6 * singlerowheight; nsinteger height = (totalrowsheight >= fourrowsheight) ? fourrowsheight : totalrowsheight; cgfloat largestlabelwidth = 0; (wspicklist* pickitem in self.picklistpopoverviewcontroller.allobjects) { cgsize labelsize = [pickitem.name sizewithattributes:@{nsfontattributename: [uifont fontwithname:@"helveticaneue" size:20.0], nsforegroundcolorattributename : [uicolor blackcolor]}]; if (labelsize.width > largestlabelwidth) { largestlabelwidth = labelsize.width; } } cgfloat popoverwidth = largestlabelwidth + 50; [self.picklistpopoverviewcontroller setpreferredcontentsize:cgsizemake(popoverwidth, height)]; } -(void)showorhidepopover:(id)sender withtablename:(nsstring*)tablename { //show/hide popover if (self.popover != nil) { [self.picklistpopoverviewcontroller dismissviewcontrolleranimated:yes completion:nil]; self.popover = nil; self.picklistpopoverviewcontroller = nil; return; } else { [self createandsizepopover:tablename]; } [self presentviewcontroller:self.picklistpopoverviewcontroller animated:yes completion: nil]; self.popover = self.picklistpopoverviewcontroller.popoverpresentationcontroller; self.popover.permittedarrowdirections = uipopoverarrowdirectionright; self.popover.sourceview = sender; if ([sender iskindofclass:[uibutton class]]) { self.popover.sourcerect = ((uibutton*)sender).bounds; } else if ([sender iskindofclass:[uicollectionviewcell class]]) { self.popover.sourcerect = ((uicollectionviewcell*)sender).bounds; } }

i'm ok reply in either objective-c or swift (since need larn anyway). in advance help provided!

after several days of google'ing , testing theories, found several issues in code.

first, presentation cannot come before setting popoverpresentationcontroller. know flies in face of apple's documentation, states seems "counterintuitive" nowadays view controller before setting popover controller, still worked me.

second, implementation of adaptivepresentationstyleforpresentationcontroller: wrong. returning uimodalpresentationpopover should have been returning uimodalpresentationnone follows:

-(uimodalpresentationstyle)adaptivepresentationstyleforpresentationcontroller:(uipresentationcontroller *)controller { homecoming uimodalpresentationnone; }

hope helps else.

objective-c swift ios8 uipopover

No comments:

Post a Comment