Skip to content

Commit a808070

Browse files
Add 3 styles of animation
1 parent f405091 commit a808070

7 files changed

Lines changed: 237 additions & 41 deletions

File tree

README.md

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ WYPopoverController is for the presentation of content in popover on iPhone / iP
1515

1616
* UIAppearance support
1717
* Works like UIPopoverController
18+
* Animation options
1819
* Automatic orientation support
1920
* UIStoryboard support
2021
* Keyboard show / hide support
2122
* iOS 6 & 7 support
2223

23-
2424
### UIAppearance support
2525

2626
---
@@ -94,6 +94,27 @@ Determines whether the default content appearance should be used for the popover
9494

9595
The margins that define the portion of the screen in which it is permissible to display the popover.
9696

97+
### Animation options
98+
99+
---
100+
101+
Introduced in release 0.1.7, there are 3 styles of animation :
102+
* Fade *(by default)*
103+
* Scale
104+
* Fade with Scale
105+
106+
#### Examples
107+
108+
```objective-c
109+
110+
popover = [[WYPopoverController alloc] initWithContentViewController:contentViewController];
111+
[popover presentPopoverFromRect:btn.bounds
112+
inView:btn
113+
permittedArrowDirections:WYPopoverArrowDirectionAny
114+
animated:YES
115+
options:WYPopoverAnimationOptionFadeWithScale];
116+
```
117+
97118
### ARC
98119
99120
---
@@ -108,13 +129,13 @@ WYPopoverController uses ARC.
108129
109130
#### Cocoapods
110131
111-
Add this line `pod 'WYPopoverController', '~> 0.1.5'` to your PodFile.
132+
Add this line `pod 'WYPopoverController', '~> 0.1.7'` to your PodFile.
112133
113134
Your PodFile should look like :
114135
115136
```Ruby
116137
platform :ios, '6.0'
117-
pod 'WYPopoverController', '~> 0.1.5'
138+
pod 'WYPopoverController', '~> 0.1.7'
118139
```
119140

120141
To use the `master` branch of the repo :

WYPopoverController/WYPopoverController.h

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Version 0.1.6
2+
Version 0.1.7
33
44
WYPopoverController is available under the MIT license.
55
@@ -30,7 +30,7 @@
3030
@protocol WYPopoverControllerDelegate;
3131

3232
#ifndef WY_POPOVER_DEFAULT_ANIMATION_DURATION
33-
#define WY_POPOVER_DEFAULT_ANIMATION_DURATION 0.20f
33+
#define WY_POPOVER_DEFAULT_ANIMATION_DURATION .20f
3434
#endif
3535

3636
typedef NS_OPTIONS(NSUInteger, WYPopoverArrowDirection) {
@@ -43,6 +43,12 @@ typedef NS_OPTIONS(NSUInteger, WYPopoverArrowDirection) {
4343
WYPopoverArrowDirectionUnknown = NSUIntegerMax
4444
};
4545

46+
typedef NS_OPTIONS(NSUInteger, WYPopoverAnimationOptions) {
47+
WYPopoverAnimationOptionFade = 1UL << 0, // default
48+
WYPopoverAnimationOptionScale = 1UL << 1,
49+
WYPopoverAnimationOptionFadeWithScale = WYPopoverAnimationOptionFade | WYPopoverAnimationOptionScale
50+
};
51+
4652
////////////////////////////////////////////////////////////////////////////////////////////////////////
4753

4854
@interface WYPopoverBackgroundView : UIView
@@ -106,6 +112,20 @@ typedef NS_OPTIONS(NSUInteger, WYPopoverArrowDirection) {
106112

107113
- (void)presentPopoverAsDialogAnimated:(BOOL)animated;
108114

115+
- (void)presentPopoverFromRect:(CGRect)rect
116+
inView:(UIView *)view
117+
permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections
118+
animated:(BOOL)animated
119+
options:(WYPopoverAnimationOptions)options;
120+
121+
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item
122+
permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections
123+
animated:(BOOL)animated
124+
options:(WYPopoverAnimationOptions)options;
125+
126+
- (void)presentPopoverAsDialogAnimated:(BOOL)animated
127+
options:(WYPopoverAnimationOptions)options;
128+
109129
- (void)dismissPopoverAnimated:(BOOL)animated;
110130

111131
@end

WYPopoverController/WYPopoverController.m

Lines changed: 115 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Version 0.1.6
2+
Version 0.1.7
33
44
WYPopoverController is available under the MIT license.
55
@@ -1339,6 +1339,8 @@ @interface WYPopoverController () <WYPopoverOverlayViewDelegate>
13391339
__weak UIBarButtonItem *barButtonItem;
13401340
CGRect keyboardRect;
13411341
BOOL hasAppearanceProxyAvailable;
1342+
1343+
WYPopoverAnimationOptions options;
13421344
}
13431345

13441346
@property (nonatomic, strong, readonly) UIView *rootView;
@@ -1403,12 +1405,14 @@ - (UIView *)rootView
14031405

14041406
if (result.subviews.count > 0)
14051407
{
1406-
for (UIView *view in result.subviews) {
1407-
if(!view.isHidden){
1408-
return view;
1409-
}
1410-
}
1411-
// result = [result.subviews lastObject];
1408+
for (UIView *view in result.subviews)
1409+
{
1410+
if(!view.isHidden)
1411+
{
1412+
return view;
1413+
}
1414+
}
1415+
// result = [result.subviews lastObject];
14121416
}
14131417

14141418
return result;
@@ -1492,14 +1496,47 @@ - (CGSize)contentSizeForViewInPopover
14921496
return result;
14931497
}
14941498

1495-
- (void)presentPopoverFromRect:(CGRect)aRect inView:(UIView *)aView permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections animated:(BOOL)aAnimated
1499+
- (void)presentPopoverFromRect:(CGRect)aRect
1500+
inView:(UIView *)aView
1501+
permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections
1502+
animated:(BOOL)aAnimated
1503+
{
1504+
[self presentPopoverFromRect:aRect
1505+
inView:aView
1506+
permittedArrowDirections:arrowDirections
1507+
animated:aAnimated
1508+
options:WYPopoverAnimationOptionFade];
1509+
}
1510+
1511+
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item
1512+
permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections
1513+
animated:(BOOL)aAnimated
1514+
{
1515+
[self presentPopoverFromBarButtonItem:item
1516+
permittedArrowDirections:arrowDirections
1517+
animated:aAnimated
1518+
options:WYPopoverAnimationOptionFade];
1519+
}
1520+
1521+
- (void)presentPopoverAsDialogAnimated:(BOOL)aAnimated
1522+
{
1523+
[self presentPopoverAsDialogAnimated:aAnimated
1524+
options:WYPopoverAnimationOptionFade];
1525+
}
1526+
1527+
- (void)presentPopoverFromRect:(CGRect)aRect
1528+
inView:(UIView *)aView
1529+
permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections
1530+
animated:(BOOL)aAnimated
1531+
options:(WYPopoverAnimationOptions)aOptions
14961532
{
14971533
NSAssert((arrowDirections != WYPopoverArrowDirectionUnknown), @"WYPopoverArrowDirection must not be UNKNOWN");
14981534

14991535
rect = aRect;
15001536
inView = aView;
15011537
permittedArrowDirections = arrowDirections;
15021538
animated = aAnimated;
1539+
options = aOptions;
15031540

15041541
CGSize contentViewSize = self.contentSizeForViewInPopover;
15051542

@@ -1567,11 +1604,23 @@ - (void)presentPopoverFromRect:(CGRect)aRect inView:(UIView *)aView permittedArr
15671604

15681605
if (animated)
15691606
{
1570-
containerView.alpha = 0;
1607+
if ((options & WYPopoverAnimationOptionFade) == WYPopoverAnimationOptionFade)
1608+
{
1609+
containerView.alpha = 0;
1610+
}
1611+
15711612
[viewController viewWillAppear:YES];
15721613

1614+
if ((options & WYPopoverAnimationOptionScale) == WYPopoverAnimationOptionScale)
1615+
{
1616+
CGAffineTransform transform = [self transformTranslateForArrowDirection:containerView.arrowDirection];
1617+
transform = CGAffineTransformScale(transform, 0, 0);
1618+
containerView.transform = transform;
1619+
}
1620+
15731621
[UIView animateWithDuration:WY_POPOVER_DEFAULT_ANIMATION_DURATION animations:^{
15741622
containerView.alpha = 1;
1623+
containerView.transform = CGAffineTransformIdentity;
15751624
} completion:^(BOOL finished) {
15761625
if ([viewController isKindOfClass:[UINavigationController class]] == NO)
15771626
{
@@ -1614,6 +1663,63 @@ - (void)presentPopoverFromRect:(CGRect)aRect inView:(UIView *)aView permittedArr
16141663
}
16151664
}
16161665

1666+
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item
1667+
permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections
1668+
animated:(BOOL)aAnimated
1669+
options:(WYPopoverAnimationOptions)aOptions
1670+
{
1671+
barButtonItem = item;
1672+
UIView *itemView = [barButtonItem valueForKey:@"view"];
1673+
arrowDirections = WYPopoverArrowDirectionDown | WYPopoverArrowDirectionUp;
1674+
[self presentPopoverFromRect:itemView.bounds
1675+
inView:itemView
1676+
permittedArrowDirections:arrowDirections
1677+
animated:aAnimated
1678+
options:aOptions];
1679+
}
1680+
1681+
- (void)presentPopoverAsDialogAnimated:(BOOL)aAnimated
1682+
options:(WYPopoverAnimationOptions)aOptions
1683+
{
1684+
[self presentPopoverFromRect:CGRectZero
1685+
inView:nil
1686+
permittedArrowDirections:WYPopoverArrowDirectionNone
1687+
animated:aAnimated
1688+
options:aOptions];
1689+
}
1690+
1691+
- (CGAffineTransform)transformTranslateForArrowDirection:(WYPopoverArrowDirection)arrowDirection
1692+
{
1693+
CGAffineTransform transform = CGAffineTransformIdentity;
1694+
1695+
if (containerView.arrowHeight > 0)
1696+
{
1697+
CGSize containerViewSize = containerView.frame.size;
1698+
1699+
if (arrowDirection == WYPopoverArrowDirectionDown)
1700+
{
1701+
transform = CGAffineTransformTranslate(CGAffineTransformIdentity, containerView.arrowOffset, containerViewSize.height / 2);
1702+
}
1703+
1704+
if (arrowDirection == WYPopoverArrowDirectionUp)
1705+
{
1706+
transform = CGAffineTransformTranslate(CGAffineTransformIdentity, containerView.arrowOffset, -containerViewSize.height / 2);
1707+
}
1708+
1709+
if (arrowDirection == WYPopoverArrowDirectionRight)
1710+
{
1711+
transform = CGAffineTransformTranslate(CGAffineTransformIdentity, containerView.frame.size.width / 2, containerView.arrowOffset);
1712+
}
1713+
1714+
if (arrowDirection == WYPopoverArrowDirectionLeft)
1715+
{
1716+
transform = CGAffineTransformTranslate(CGAffineTransformIdentity, -containerView.frame.size.width / 2, containerView.arrowOffset);
1717+
}
1718+
}
1719+
1720+
return transform;
1721+
}
1722+
16171723
- (void)setPopoverNavigationBarBackgroundImage
16181724
{
16191725
if (wantsDefaultContentAppearance == NO && [viewController isKindOfClass:[UINavigationController class]])
@@ -1644,19 +1750,6 @@ - (void)setPopoverNavigationBarBackgroundImage
16441750
}
16451751
}
16461752

1647-
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections animated:(BOOL)aAnimated
1648-
{
1649-
barButtonItem = item;
1650-
UIView *itemView = [barButtonItem valueForKey:@"view"];
1651-
arrowDirections = WYPopoverArrowDirectionDown | WYPopoverArrowDirectionUp;
1652-
[self presentPopoverFromRect:itemView.bounds inView:itemView permittedArrowDirections:arrowDirections animated:aAnimated];
1653-
}
1654-
1655-
- (void)presentPopoverAsDialogAnimated:(BOOL)aAnimated
1656-
{
1657-
[self presentPopoverFromRect:CGRectZero inView:nil permittedArrowDirections:WYPopoverArrowDirectionNone animated:aAnimated];
1658-
}
1659-
16601753
- (void)positionPopover
16611754
{
16621755
CGSize contentViewSize = self.contentSizeForViewInPopover;

WYPopoverController/WYStoryboardPopoverSegue.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Version 0.1.6
2+
Version 0.1.7
33
44
WYPopoverController is available under the MIT license.
55
@@ -28,6 +28,13 @@
2828

2929
@interface WYStoryboardPopoverSegue : UIStoryboardSegue
3030

31-
- (WYPopoverController*)popoverControllerWithSender:(id)sender permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
31+
- (WYPopoverController*)popoverControllerWithSender:(id)sender
32+
permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections
33+
animated:(BOOL)animated;
34+
35+
- (WYPopoverController*)popoverControllerWithSender:(id)sender
36+
permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections
37+
animated:(BOOL)animated
38+
options:(WYPopoverAnimationOptions)options;
3239

3340
@end

WYPopoverController/WYStoryboardPopoverSegue.m

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Version 0.1.6
2+
Version 0.1.7
33
44
WYPopoverController is available under the MIT license.
55
@@ -30,9 +30,10 @@ of this software and associated documentation files (the "Software"), to deal
3030

3131
@interface WYStoryboardPopoverSegue()
3232
{
33-
WYPopoverController* popoverController;
33+
WYPopoverController *popoverController;
3434
id sender;
3535
WYPopoverArrowDirection arrowDirections;
36+
WYPopoverAnimationOptions options;
3637
BOOL animated;
3738
}
3839

@@ -46,20 +47,41 @@ - (void)perform
4647
{
4748
if ([sender isKindOfClass:[UIBarButtonItem class]])
4849
{
49-
[popoverController presentPopoverFromBarButtonItem:(UIBarButtonItem*)sender permittedArrowDirections:arrowDirections animated:animated];
50+
[popoverController presentPopoverFromBarButtonItem:(UIBarButtonItem*)sender
51+
permittedArrowDirections:arrowDirections
52+
animated:animated
53+
options:options];
5054
}
5155
else if ([sender isKindOfClass:[UIView class]])
5256
{
53-
UIView* view = (UIView*)sender;
54-
[popoverController presentPopoverFromRect:view.bounds inView:view permittedArrowDirections:arrowDirections animated:animated];
57+
UIView *view = (UIView *)sender;
58+
[popoverController presentPopoverFromRect:view.bounds
59+
inView:view
60+
permittedArrowDirections:arrowDirections
61+
animated:animated
62+
options:options];
5563
}
5664
}
5765

58-
- (WYPopoverController*)popoverControllerWithSender:(id)aSender permittedArrowDirections:(WYPopoverArrowDirection)aArrowDirections animated:(BOOL)aAnimated
66+
- (WYPopoverController *)popoverControllerWithSender:(id)aSender
67+
permittedArrowDirections:(WYPopoverArrowDirection)aArrowDirections
68+
animated:(BOOL)aAnimated
69+
{
70+
return [self popoverControllerWithSender:aSender
71+
permittedArrowDirections:aArrowDirections
72+
animated:aAnimated
73+
options:WYPopoverAnimationOptionFade];
74+
}
75+
76+
- (WYPopoverController *)popoverControllerWithSender:(id)aSender
77+
permittedArrowDirections:(WYPopoverArrowDirection)aArrowDirections
78+
animated:(BOOL)aAnimated
79+
options:(WYPopoverAnimationOptions)aOptions
5980
{
6081
sender = aSender;
6182
arrowDirections = aArrowDirections;
6283
animated = aAnimated;
84+
options = aOptions;
6385

6486
popoverController = [[WYPopoverController alloc] initWithContentViewController:self.destinationViewController];
6587

0 commit comments

Comments
 (0)