ios - Initial orientation when using UIViewController contaiment -
in 1 of projects i'm using uiviewcontroller containment display popups. here code i'm using embedding viewcontrollers:
struct viewcontrollerpresentercontainment : viewcontrollerpresenter { let containerviewcontroller : uiviewcontroller let containerview: uiview init(containerviewcontroller: uiviewcontroller, containerview: uiview) { self.containerviewcontroller = containerviewcontroller self.containerview = containerview } func showviewcontroller(viewcontroller: uiviewcontroller, animated: bool, transitioncontroller: transitioncontroller?, completion: viewcontrollerpresentercompletionblock?) { self.showviewcontroller(viewcontroller: viewcontroller, animated: animated, transitioncontroller: transitioncontroller, replacingviewcontroller: nil, completion: completion) } func showviewcontroller(viewcontroller: uiviewcontroller, animated: bool, transitioncontroller: transitioncontroller?, replacingviewcontroller: uiviewcontroller?, completion: viewcontrollerpresentercompletionblock?) { replacingviewcontroller?.willmove(toparentviewcontroller: nil) self.containerviewcontroller.addchildviewcontroller(viewcontroller) if animated, let transitioncontroller = transitioncontroller?.animatorcontrollerfortransition(.show) { let context = transitioncontext(fromviewcontroller: replacingviewcontroller, toviewcontroller: viewcontroller, containerview: self.containerview) { (completed) in replacingviewcontroller?.view.removefromsuperview() replacingviewcontroller?.removefromparentviewcontroller() viewcontroller.didmove(toparentviewcontroller: self.containerviewcontroller) transitioncontroller.animationended?(completed) completion?(completed) } transitioncontroller.animatetransition(using: context) } else { self.containerview.addsubviewatfullsize(viewcontroller.view) replacingviewcontroller?.view.removefromsuperview() replacingviewcontroller?.removefromparentviewcontroller() viewcontroller.didmove(toparentviewcontroller: self.containerviewcontroller) completion?(true) } } func hideviewcontroller(viewcontroller: uiviewcontroller, animated: bool, transitioncontroller: transitioncontroller?, completion: viewcontrollerpresentercompletionblock?) { viewcontroller.willmove(toparentviewcontroller: nil) if animated, let transitioncontroller = transitioncontroller?.animatorcontrollerfortransition(.hide) { let context = transitioncontext(fromviewcontroller: viewcontroller, toviewcontroller: nil, containerview: self.containerview) { (completed) in viewcontroller.view.removefromsuperview() viewcontroller.removefromparentviewcontroller() completion?(completed) } transitioncontroller.animatetransition(using: context) } else { viewcontroller.view.removefromsuperview() viewcontroller.removefromparentviewcontroller() completion?(true) } } } i'm using uiviewcontrolleranimatedtransitioning:
class transitioncontrollerfade : transitioncontroller { private var duration: timeinterval init(duration: timeinterval = 0.3) { self.duration = duration } func animatorcontrollerfortransition(_ transitiontype: transitiontype) -> uiviewcontrolleranimatedtransitioning { switch transitiontype { case .show: return transitioncontrollerfadein(duration: self.duration) case .hide: return transitioncontrollerfadeout(duration: self.duration) } } } class transitioncontrollerfadein : nsobject, uiviewcontrolleranimatedtransitioning { private var duration: timeinterval init(duration: timeinterval = 0.3) { self.duration = duration super.init() } func transitionduration(using transitioncontext: uiviewcontrollercontexttransitioning?) -> timeinterval { return self.duration } func animatetransition(using transitioncontext: uiviewcontrollercontexttransitioning) { if let viewcontroller = transitioncontext.viewcontroller(forkey: .to) { transitioncontext.containerview.addsubviewatfullsize(viewcontroller.view) viewcontroller.view.alpha = 0 uiview.animate(withduration: transitionduration(using: transitioncontext), delay: 0, options: [.curveeaseout], animations: { viewcontroller.view.alpha = 1 }, completion: { finished in transitioncontext.completetransition(!transitioncontext.transitionwascancelled) }) } } } class transitioncontrollerfadeout : nsobject, uiviewcontrolleranimatedtransitioning { private var duration: timeinterval init(duration: timeinterval = 0.3) { self.duration = duration super.init() } func transitionduration(using transitioncontext: uiviewcontrollercontexttransitioning?) -> timeinterval { return self.duration } func animatetransition(using transitioncontext: uiviewcontrollercontexttransitioning) { if let fromviewcontroller = transitioncontext.viewcontroller(forkey: .from) { if let toviewcontroller = transitioncontext.viewcontroller(forkey: .to) { transitioncontext.containerview.insertsubviewatfullsize(toviewcontroller.view, belowsubview: fromviewcontroller.view) } uiview.animate(withduration: transitionduration(using: transitioncontext), delay: 0, options: [.curveeaseout], animations: { fromviewcontroller.view.alpha = 0 }, completion: { finished in transitioncontext.completetransition(!transitioncontext.transitionwascancelled) }) } } } my current problem need block rotation 1 of uiviewcontrollers. on uiviewcontroller class have:
-(uiinterfaceorientationmask) supportedinterfaceorientations { return uiinterfaceorientationmaskportrait | uiinterfaceorientationmaskportraitupsidedown; } -(bool)shouldautorotate { return yes; } - (uiinterfaceorientation) preferredinterfaceorientationforpresentation { return uiinterfaceorientationportrait | uiinterfaceorientationmaskportraitupsidedown; } everything seems work fine (rotations supported , forwarded contained view controllers) - initial rotation broken.
when add viewcontroller (loaded xib) , add screen - despite portrait requirement - seems getting landscape size , it's getting fixed after rotate device first time portrait - it's keeping portrait-only mode.
what missing in whole process ?
i tried make viewcontroller rootviewcontroller uiwindow - problem same.
is there way enforce portrait mode viewcontroller way i'm doing ?
Comments
Post a Comment