Pop上手體驗(i-v)
阿新 • • 發佈:2019-02-02
Pop上手體驗(i)
Facebook一直為開發者提供自己的開原始碼庫非常令人感激。最新的一個是Pop,在Github上不到24小時就已經獲得3500個星了(目前是將近6000個)。
(文中涉及動態圖,可能會載入的慢,請耐心檢視!)
Facebook官方闡述:
我使用Pop建立一個非常簡單的例子。我只是想看看它是如何很好地實現使用者輸入框帶有的陰影效果,它確實做得很棒。我還想快速的建立我所知道的東西。在使用POPSpringAnimation這個例子中,我覺得這個程式碼跟我寫過的其他程式碼很相似。
至於研究這個庫,我的策略是查閱這些檔案中的.h檔案(這庫也有Objective-C++版本):
POPBasicAnimation
POPDecayAnimation
POPPropertyAnimation
POPSpringAnimation
POPCustomAnimation
POPAnimation
POPAnimatableProperty
Pop的一些東西確實很酷,即當你新增一個動畫時,展示層和模型層是同步的。Sam Page( @sampage)中使用Pop的圓圈例子就是這樣。由於strokeEnd和strokeStart不是預設屬性的一部分,所以你需要建立自己的自定義屬性(不過我可能錯失了什麼),如下:
Pop是一個適用於iOS和OS X平臺的可擴充套件動畫引擎。除了基本的靜態動畫,Pop還支援spring和decay動畫,有助於打造一個逼真的,基於物理的互動。你可以通過Pop的API把Pop快速整合到現有的Objective-C程式碼庫中,並在任何物件上實現動畫的任何屬性。這是一個成熟的並且經過良好測試的框架,承載了Paper中所有的動畫和互動。 |
- [POPAnimatableProperty propertyWithName:@"strokeStart" initializer:^(POPMutableAnimatableProperty *prop) {
- prop.readBlock = ^(id obj, CGFloat values[]) {
- values[0] = [obj strokeStart];
- };
- prop.writeBlock = ^(id obj, const CGFloat values[]) {
- [obj setStrokeStart:values[0]];
- };
- }];
- - (void)rotate:(UIPanGestureRecognizer*)recognizer
- {
- CGPoint velocity = [recognizer velocityInView:self.view];
- POPSpringAnimation *spring = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerRotation];
- spring.velocity = [NSValue valueWithCGPoint:velocity];
- [_outletView.layer pop_addAnimation:spring forKey:@"rotationAnimation"];
- }
- - (void)rotate:(UIPanGestureRecognizer*)recognizer
- {
- CGPoint velocity = [recognizer velocityInView:self.view];
- POPSpringAnimation *positionAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPosition];
- positionAnimation.velocity = [NSValue valueWithCGPoint:velocity];
- positionAnimation.dynamicsTension = 5;
- positionAnimation.dynamicsFriction = 5.0f;
- positionAnimation.springBounciness = 20.0f;
- [_outletView.layer pop_addAnimation:positionAnimation forKey:@"positionAnimation"];
- POPSpringAnimation *sizeAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerSize];
- sizeAnimation.velocity = [NSValue valueWithCGPoint:velocity];
- sizeAnimation.springBounciness = 1.0f;
- sizeAnimation.dynamicsFriction = 1.0f;
- [_outletView.layer pop_addAnimation:sizeAnimation forKey:@"sizeAnimation"];
- }
- - (void)hidePopup
- {
- _isMenuOpen = NO;
- POPBasicAnimation *opacityAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerOpacity];
- opacityAnimation.fromValue = @(1);
- opacityAnimation.toValue = @(0);
- [_popUp.layer pop_addAnimation:opacityAnimation forKey:@"opacityAnimation"];
- POPBasicAnimation *positionAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPosition];
- positionAnimation.fromValue = [NSValue valueWithCGPoint:VisiblePosition];
- positionAnimation.toValue = [NSValue valueWithCGPoint:HiddenPosition];
- [_popUp.layer pop_addAnimation:positionAnimation forKey:@"positionAnimation"];
- POPSpringAnimation *scaleAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
- scaleAnimation.fromValue = [NSValue valueWithCGSize:CGSizeMake(1.0f, 1.0f)];
- scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(0.5f, 0.5f)];
- [_popUp.layer pop_addAnimation:scaleAnimation forKey:@"scaleAnimation"];
- }
- - (void)showPopup
- {
- _isMenuOpen = YES;
- POPBasicAnimation *opacityAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerOpacity];
- opacityAnimation.fromValue = @(0);
- opacityAnimation.toValue = @(1);
- opacityAnimation.beginTime = CACurrentMediaTime() + 0.1;
- [_popUp.layer pop_addAnimation:opacityAnimation forKey:@"opacityAnimation"];
- POPBasicAnimation *positionAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPosition];
- positionAnimation.fromValue = [NSValue valueWithCGPoint:VisibleReadyPosition];
- positionAnimation.toValue = [NSValue valueWithCGPoint:VisiblePosition];
- [_popUp.layer pop_addAnimation:positionAnimation forKey:@"positionAnimation"];
- POPSpringAnimation *scaleAnimation = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerScaleXY];
- scaleAnimation.fromValue = [NSValue valueWithCGSize:CGSizeMake(0.5, 0.5f)];
- scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(1.0f, 1.0f)];//@(0.0f);
- scaleAnimation.springBounciness = 20.0f;
- scaleAnimation.springSpeed = 20.0f;
- [_popUp.layer pop_addAnimation:scaleAnimation forKey:@"scaleAnimation"];
- }
- POPAnimatableProperty *constantProperty = [POPAnimatableProperty propertyWithName:@"constant" initializer:^(POPMutableAnimatableProperty *prop){
- prop.readBlock = ^(NSLayoutConstraint *layoutConstraint, CGFloat values[]) {
- values[0] = [layoutConstraint constant];
- };
- prop.writeBlock = ^(NSLayoutConstraint *layoutConstraint, const CGFloat values[]) {
- [layoutConstraint setConstant:values[0]];
- };
- }];
- POPSpringAnimation *constantAnimation = [POPSpringAnimation animation];
- constantAnimation.property = constantProperty;
- constantAnimation.fromValue = @(_layoutConstraint.constant);
- constantAnimation.toValue = @(200);
- [_layoutConstraint pop_addAnimation:constantAnimation forKey:@"constantAnimation"];
- [POPAnimatableProperty propertyWithName:@"strokeStart" initializer:^(POPMutableAnimatableProperty *prop) {
- prop.readBlock = ^(id obj, CGFloat values[]) {
- values[0] = [obj strokeStart];
- };
- prop.writeBlock = ^(id obj, const CGFloat values[]) {
- [obj setStrokeStart:values[0]];
- };
- }];
- {kPOPViewBackgroundColor,
- ^(UIView *obj, CGFloat values[]) {
- POPUIColorGetRGBAComponents(obj.backgroundColor, values);
- },
- ^(UIView *obj, const CGFloat values[]) {
- obj.backgroundColor = POPUIColorRGBACreate(values);
- },
- 1.0
- },
- void POPUIColorGetRGBAComponents(UIColor *color, CGFloat components[])
- {
- return POPCGColorGetRGBAComponents(color.CGColor, components);
- }
- UIColor *POPUIColorRGBACreate(const CGFloat components[])
- {
- CGColorRef colorRef = POPCGColorRGBACreate(components);
- UIColor *color = [[UIColor alloc] initWithCGColor:colorRef];
- CGColorRelease(colorRef);
- return color;
- }