i'm using ecslidingviewcontroller in application display left menu.
is there way make main view controller 'darker' when it's moved , left menu displayed?
thanks.
i solved issue. classes example , changed it:
cpslidinganimationcontroller:
#import "cpslidinganimationcontroller.h" #import "ecslidinganimationcontroller.h" #import "ecslidingconstants.h" @interface cpslidinganimationcontroller () @property (nonatomic, copy) void (^coordinatoranimations)(id<uiviewcontrollertransitioncoordinatorcontext>context); @property (nonatomic, copy) void (^coordinatorcompletion)(id<uiviewcontrollertransitioncoordinatorcontext>context); @end @implementation cpslidinganimationcontroller @synthesize transition, animationfinishcallback; #pragma mark - uiviewcontrolleranimatedtransitioning - (nstimeinterval)transitionduration:(id <uiviewcontrollercontexttransitioning>)transitioncontext { return 0.25; } - (void)animatetransition:(id <uiviewcontrollercontexttransitioning>)transitioncontext { uiviewcontroller *topviewcontroller = [transitioncontext viewcontrollerforkey:ectransitioncontexttopviewcontrollerkey]; uiviewcontroller *toviewcontroller = [transitioncontext viewcontrollerforkey:uitransitioncontexttoviewcontrollerkey]; uiview *containerview = [transitioncontext containerview]; cgrect topviewinitialframe = [transitioncontext initialframeforviewcontroller:topviewcontroller]; cgrect topviewfinalframe = [transitioncontext finalframeforviewcontroller:topviewcontroller]; topviewcontroller.view.frame = topviewinitialframe; if (topviewcontroller != toviewcontroller) { cgrect toviewfinalframe = [transitioncontext finalframeforviewcontroller:toviewcontroller]; toviewcontroller.view.frame = toviewfinalframe; [containerview insertsubview:toviewcontroller.view belowsubview:topviewcontroller.view]; } nstimeinterval duration = [self transitionduration:transitioncontext]; [uiview animatewithduration:duration animations:^{ [uiview setanimationcurve:uiviewanimationcurvelinear]; if (self.coordinatoranimations) self.coordinatoranimations((id<uiviewcontrollertransitioncoordinatorcontext>)transitioncontext); topviewcontroller.view.frame = topviewfinalframe; } completion:^(bool finished) { if ([transitioncontext transitionwascancelled]) { topviewcontroller.view.frame = [transitioncontext initialframeforviewcontroller:topviewcontroller]; } if (self.coordinatorcompletion) self.coordinatorcompletion((id<uiviewcontrollertransitioncoordinatorcontext>)transitioncontext); [transitioncontext completetransition:finished]; if (transition) { if ([(nsobject*) transition respondstoselector:animationfinishcallback]) { [transition performselector:animationfinishcallback]; } } }]; } @end
medynamictransition.h:
#import "medynamictransition.h" #import "cpslidinganimationcontroller.h" @interface medynamictransition () { uivisualeffectview * effectview; } @property (nonatomic, strong) cpslidinganimationcontroller * defaultanimationcontroller; @property (nonatomic, strong) nsmutablearray *leftedgequeue; @property (nonatomic, assign) id<uiviewcontrollercontexttransitioning> transitioncontext; @property (nonatomic, strong) uidynamicanimator *animator; @property (nonatomic, strong) uicollisionbehavior *collisionbehavior; @property (nonatomic, strong) uigravitybehavior *gravitybehavior; @property (nonatomic, strong) uipushbehavior *pushbehavior; @property (nonatomic, strong) uidynamicitembehavior *topviewbehavior; @property (nonatomic, strong) uidynamicbehavior *compositebehavior; @property (nonatomic, assign) bool positivelefttoright; @property (nonatomic, assign) bool ispanningright; @property (nonatomic, assign) bool isinteractive; @property (nonatomic, assign) cgfloat fullwidth; @property (nonatomic, assign) cgrect initialtopviewframe; @end @implementation medynamictransition #pragma mark - ecslidingviewcontrollerdelegate - (id<uiviewcontrolleranimatedtransitioning>)slidingviewcontroller:(ecslidingviewcontroller *)slidingviewcontroller animationcontrollerforoperation:(ecslidingviewcontrolleroperation)operation topviewcontroller:(uiviewcontroller *)topviewcontroller { return self.defaultanimationcontroller; } - (id<uiviewcontrollerinteractivetransitioning>)slidingviewcontroller:(ecslidingviewcontroller *)slidingviewcontroller interactioncontrollerforanimationcontroller:(id <uiviewcontrolleranimatedtransitioning>)animationcontroller { self.slidingviewcontroller = slidingviewcontroller; return self; } #pragma mark - properties - (cpslidinganimationcontroller *)defaultanimationcontroller { if (_defaultanimationcontroller) return _defaultanimationcontroller; _defaultanimationcontroller = [[cpslidinganimationcontroller alloc] init]; _defaultanimationcontroller.transition = self; _defaultanimationcontroller.animationfinishcallback = @selector(blurcontrol); return _defaultanimationcontroller; } - (nsmutablearray *)leftedgequeue { if (_leftedgequeue) return _leftedgequeue; _leftedgequeue = [nsmutablearray arraywithcapacity:5]; return _leftedgequeue; } - (uidynamicanimator *)animator { if (_animator) return _animator; _animator = [[uidynamicanimator alloc] initwithreferenceview:self.slidingviewcontroller.view]; _animator.delegate = self; [_animator updateitemusingcurrentstate:self.slidingviewcontroller.topviewcontroller.view]; return _animator; } - (uicollisionbehavior *)collisionbehavior { if (_collisionbehavior) return _collisionbehavior; _collisionbehavior = [[uicollisionbehavior alloc] initwithitems:@[self.slidingviewcontroller.topviewcontroller.view]]; cgfloat containerheight = self.slidingviewcontroller.view.bounds.size.height; cgfloat containerwidth = self.slidingviewcontroller.view.bounds.size.width; cgfloat revealamount = self.slidingviewcontroller.anchorrightrevealamount; [_collisionbehavior addboundarywithidentifier:@"leftedge" frompoint:cgpointmake(-1, 0) topoint:cgpointmake(-1, containerheight)]; [_collisionbehavior addboundarywithidentifier:@"rightedge" frompoint:cgpointmake(revealamount + containerwidth + 1, 0) topoint:cgpointmake(revealamount + containerwidth + 1, containerheight)]; return _collisionbehavior; } - (uigravitybehavior *)gravitybehavior { if (_gravitybehavior) return _gravitybehavior; _gravitybehavior = [[uigravitybehavior alloc] initwithitems:@[self.slidingviewcontroller.topviewcontroller.view]]; return _gravitybehavior; } - (uipushbehavior *)pushbehavior { if (_pushbehavior) return _pushbehavior; _pushbehavior = [[uipushbehavior alloc] initwithitems:@[self.slidingviewcontroller.topviewcontroller.view] mode:uipushbehaviormodeinstantaneous]; return _pushbehavior; } - (uidynamicitembehavior *)topviewbehavior { if (_topviewbehavior) return _topviewbehavior; uiview *topview = self.slidingviewcontroller.topviewcontroller.view; _topviewbehavior = [[uidynamicitembehavior alloc] initwithitems:@[topview]]; // density ranges 1 5 ipad iphone _topviewbehavior.density = 908800 / (topview.bounds.size.width * topview.bounds.size.height); _topviewbehavior.elasticity = 0; _topviewbehavior.resistance = 1; return _topviewbehavior; } - (uidynamicbehavior *)compositebehavior { if (_compositebehavior) return _compositebehavior; _compositebehavior = [[uidynamicbehavior alloc] init]; [_compositebehavior addchildbehavior:self.collisionbehavior]; [_compositebehavior addchildbehavior:self.gravitybehavior]; [_compositebehavior addchildbehavior:self.pushbehavior]; [_compositebehavior addchildbehavior:self.topviewbehavior]; __weak typeof(self)weakself = self; _compositebehavior.action = ^{ // stop dynamic animation when value of left edge same 5 times in row. nsnumber *leftedge = [nsnumber numberwithfloat:weakself.slidingviewcontroller.topviewcontroller.view.frame.origin.x]; [weakself.leftedgequeue insertobject:leftedge atindex:0]; if (weakself.leftedgequeue.count == 6) [weakself.leftedgequeue removelastobject]; if (weakself.leftedgequeue.count == 5 && ((nsarray *)[weakself.leftedgequeue valueforkeypath:@"@distinctunionofobjects.self"]).count == 1) { [weakself.animator removeallbehaviors]; } }; return _compositebehavior; } #pragma mark - uiviewcontrollerinteractivetransitioning - (void)startinteractivetransition:(id<uiviewcontrollercontexttransitioning>)transitioncontext { self.transitioncontext = transitioncontext; uiviewcontroller *topviewcontroller = [transitioncontext viewcontrollerforkey:ectransitioncontexttopviewcontrollerkey]; topviewcontroller.view.userinteractionenabled = no; if (_isinteractive) { uiviewcontroller *underviewcontroller = [transitioncontext viewcontrollerforkey:ectransitioncontextunderleftcontrollerkey]; cgrect underviewinitialframe = [transitioncontext initialframeforviewcontroller:underviewcontroller]; cgrect underviewfinalframe = [transitioncontext finalframeforviewcontroller:underviewcontroller]; uiview *containerview = [transitioncontext containerview]; cgfloat finalleftedge = cgrectgetminx([transitioncontext finalframeforviewcontroller:topviewcontroller]); cgfloat initialleftedge = cgrectgetminx([transitioncontext initialframeforviewcontroller:topviewcontroller]); cgfloat fullwidth = fabs(finalleftedge - initialleftedge); cgrect underviewframe; if (cgrectisempty(underviewinitialframe)) { underviewframe = underviewfinalframe; } else { underviewframe = underviewinitialframe; } underviewcontroller.view.frame = underviewframe; [containerview insertsubview:underviewcontroller.view belowsubview:topviewcontroller.view]; self.positivelefttoright = initialleftedge < finalleftedge; self.fullwidth = fullwidth; } else { [self.defaultanimationcontroller animatetransition:transitioncontext]; } } #pragma mark - uipangesturerecognizer action - (void)handlepangesture:(uipangesturerecognizer *)recognizer { if ([self.animator isrunning]) return; uiview *topview = self.slidingviewcontroller.topviewcontroller.view; cgfloat translationx = [recognizer translationinview:self.slidingviewcontroller.view].x; cgfloat velocityx = [recognizer velocityinview:self.slidingviewcontroller.view].x; // blur effect [self blurcontrol]; switch (recognizer.state) { case uigesturerecognizerstatebegan: { bool ismovingright = velocityx > 0; calayer *presentationlayer = (calayer *)topview.layer.presentationlayer; self.initialtopviewframe = presentationlayer.frame; _isinteractive = yes; if (self.slidingviewcontroller.currenttopviewposition == ecslidingviewcontrollertopviewpositioncentered && ismovingright && self.slidingviewcontroller.underleftviewcontroller) { [self.slidingviewcontroller anchortopviewtorightanimated:yes]; } else if (self.slidingviewcontroller.currenttopviewposition == ecslidingviewcontrollertopviewpositioncentered && !ismovingright && self.slidingviewcontroller.underrightviewcontroller) { [self.slidingviewcontroller anchortopviewtoleftanimated:yes]; } else if (self.slidingviewcontroller.currenttopviewposition == ecslidingviewcontrollertopviewpositionanchoredleft) { [self.slidingviewcontroller resettopviewanimated:yes]; } else if (self.slidingviewcontroller.currenttopviewposition == ecslidingviewcontrollertopviewpositionanchoredright) { [self.slidingviewcontroller resettopviewanimated:yes]; } else { _isinteractive = no; } break; } case uigesturerecognizerstatechanged: { if (!_isinteractive) return; cgrect topviewinitialframe = self.initialtopviewframe; cgfloat newleftedge = topviewinitialframe.origin.x + translationx; if (newleftedge < 0) { newleftedge = 0; } else if (newleftedge > self.slidingviewcontroller.anchorrightrevealamount) { newleftedge = self.slidingviewcontroller.anchorrightrevealamount; } topviewinitialframe.origin.x = newleftedge; topview.frame = topviewinitialframe; if (!self.positivelefttoright) translationx = translationx * -1.0; cgfloat percentcomplete = (translationx / self.fullwidth); if (percentcomplete < 0) percentcomplete = 0; if (percentcomplete > 100) percentcomplete = 100; [self.transitioncontext updateinteractivetransition:percentcomplete]; break; } case uigesturerecognizerstateended: { [self blurcontrol]; }; case uigesturerecognizerstatecancelled: { if (!_isinteractive) return; _isinteractive = no; self.ispanningright = velocityx > 0; if (self.ispanningright) { [self blurcontrol]; } else { [self disableblur]; } self.gravitybehavior.gravitydirection = self.ispanningright ? cgvectormake(2, 0) : cgvectormake(-2, 0); self.pushbehavior.angle = 0; // velocity may negative self.pushbehavior.magnitude = velocityx; self.pushbehavior.active = yes; [self.animator addbehavior:self.compositebehavior]; break; } default: break; } } #pragma mark - uidynamicanimatordelegate - (void)dynamicanimatordidpause:(uidynamicanimator*)animator { [self.animator removeallbehaviors]; _collisionbehavior = nil; _topviewbehavior = nil; _pushbehavior = nil; _gravitybehavior = nil; _compositebehavior = nil; _animator = nil; self.slidingviewcontroller.topviewcontroller.view.userinteractionenabled = yes; uiviewcontroller *topviewcontroller = [self.transitioncontext viewcontrollerforkey:ectransitioncontexttopviewcontrollerkey]; if ((self.ispanningright && self.positivelefttoright) || (!self.ispanningright && !self.positivelefttoright)) { topviewcontroller.view.frame = [self.transitioncontext finalframeforviewcontroller:topviewcontroller]; [self.transitioncontext finishinteractivetransition]; } else if ((self.ispanningright && !self.positivelefttoright) || (!self.ispanningright && self.positivelefttoright)) { topviewcontroller.view.frame = [self.transitioncontext initialframeforviewcontroller:topviewcontroller]; [self.transitioncontext cancelinteractivetransition]; } [self.transitioncontext completetransition:yes]; } #pragma mark - blur - (void) setbluroffset:(cgfloat) offset { uiview *topview = self.slidingviewcontroller.topviewcontroller.view; if (!effectview) { uiblureffect * blureffect = [uiblureffect effectwithstyle:uiblureffectstyledark]; effectview = [[uivisualeffectview alloc] initwitheffect:blureffect]; effectview.frame = topview.bounds; effectview.alpha = 0.1f; [topview addsubview:effectview]; [effectview settranslatesautoresizingmaskintoconstraints:false]; [topview addconstraint:[nslayoutconstraint constraintwithitem:effectview attribute:nslayoutattributetop relatedby:nslayoutrelationequal toitem:topview attribute:nslayoutattributetop multiplier:1 constant:0]]; [topview addconstraint:[nslayoutconstraint constraintwithitem:effectview attribute:nslayoutattributebottom relatedby:nslayoutrelationequal toitem:topview attribute:nslayoutattributebottom multiplier:1 constant:0]]; [topview addconstraint:[nslayoutconstraint constraintwithitem:effectview attribute:nslayoutattributeleading relatedby:nslayoutrelationequal toitem:topview attribute:nslayoutattributeleading multiplier:1 constant:0]]; [topview addconstraint:[nslayoutconstraint constraintwithitem:effectview attribute:nslayoutattributetrailing relatedby:nslayoutrelationequal toitem:topview attribute:nslayoutattributetrailing multiplier:1 constant:0]]; } cgfloat c = offset / 100; if (c < 0.1f) c = 0.1f; else if (c > 0.5f) c = 0.5f; effectview.alpha = c; } - (void) disableblur{ if (effectview != null) { [effectview removefromsuperview]; effectview = null; } } - (void) blurcontrol{ uiview *topview = self.slidingviewcontroller.topviewcontroller.view; nslog(@"x: %f", topview.frame.origin.x); if (topview.frame.origin.x >= 15) { [self setbluroffset:topview.frame.origin.x]; } else { [self disableblur]; } } @end
Comments
Post a Comment