pod
'PopoverObjC'
- #import "ASViewController.h"
- #import <PopoverObjC/ASPopover.h>
- @interface ASViewController ()
- @property (weak, nonatomic) IBOutlet UIButton *btn;
- @property (nonatomic, strong) ASPopover *btnPopover;
- @property (nonatomic, strong) ASPopover *itemPopover;
- @end
- @implementation ASViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- [self.btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
- self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"item" style:UIBarButtonItemStylePlain target:self action:@selector(clickItem:)];
- }
- - (void)didReceiveMemoryWarning {
- }
- - (ASPopover * ) btnPopover {
- if (!_btnPopover) {
- ASPopoverOption * option = [[ASPopoverOption alloc] init];
- option.popoverType = ASPopoverTypeUp;
- option.autoAjustDirection = NO;
- option.arrowSize = CGSizeMake(9, 6);
- option.blackOverlayColor = [UIColor clearColor];
- option.popoverColor = [UIColor lightGrayColor];
- option.dismissOnBlackOverlayTap = YES;
- option.animationIn = 0.5;
- //...
- _btnPopover = [[ASPopover alloc] initWithOption: option];
- }
- return _btnPopover;
- }
- - (ASPopover * ) itemPopover {
- if (!_itemPopover) {
- ASPopoverOption * option = [[ASPopoverOption alloc] init];
- option.autoAjustDirection = NO;
- option.arrowSize = CGSizeMake(10, 6);
- option.blackOverlayColor = [UIColor clearColor];
- option.sideEdge = 7;
- option.dismissOnBlackOverlayTap = YES;
- option.popoverColor = [[UIColor blackColor] colorWithAlphaComponent: 0.7];
- option.autoAjustDirection = YES;
- option.animationIn = 0.4;
- option.springDamping = 0.5;
- option.initialSpringVelocity = 1;
- option.overlayBlur = [UIBlurEffect effectWithStyle: UIBlurEffectStyleLight];
- //...
- _itemPopover = [[ASPopover alloc] initWithOption: option];
- }
- return _itemPopover;
- }
popover 的属性可在 option 里设置。
- - (void)clickBtn:(id)sender {
- UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width - 50, 40)];
- [self.btnPopover show:view fromView:self.btn]; // in delegate window
- }
- - (void)clickItem:(id)sender {
- UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 200)];
- UIView *itemView = [self.navigationItem.rightBarButtonItem valueForKey:@"view"]; // you should use custom view in item;
- if (itemView) {
- // [self.itemPopover show:view fromView:itemView];
- CGPoint originPoint = [self.itemPopover originArrowPointWithView:view fromView:itemView];
- originPoint.y += 5;
- [self.itemPopover show:view atPoint:originPoint];
- }
- }
- @end
可在某一个视图或某一个 point 上弹出内容 view
- #import <UIKit/UIKit.h>
- #import "ASPopoverOption.h"
- typedef void (^ASPopoverBlock)(void);
- @interface ASPopover : UIView
- @property (nonatomic, copy) ASPopoverBlock willShowHandler;
- @property (nonatomic, copy) ASPopoverBlock willDismissHandler;
- @property (nonatomic, copy) ASPopoverBlock didShowHandler;
- @property (nonatomic, copy) ASPopoverBlock didDismissHandler;
- @property (nonatomic, strong) ASPopoverOption *option;
- - (instancetype)initWithOption:(ASPopoverOption *)option;
- - (void)dismiss;
- - (void)show:(UIView *)contentView fromView:(UIView *)fromView;
- - (void)show:(UIView *)contentView fromView:(UIView *)fromView inView:(UIView *)inView;
- - (void)show:(UIView *)contentView atPoint:(CGPoint)point;
- - (void)show:(UIView *)contentView atPoint:(CGPoint)point inView:(UIView *)inView;
- - (CGPoint)originArrowPointWithView:(UIView *)contentView fromView:(UIView *)fromView;
- - (CGPoint)arrowPointWithView:(UIView *)contentView fromView:(UIView *)fromView inView:(UIView *)inView popoverType:(ASPopoverType)type;
- @end
contentView: 要显示的内容; fromView: 气泡从某一个视图上 show; inview: 气泡绘制在某一个视图上,一般为 delegate window; atPoint: 气泡从某一点上 show; 可先获取 originPoint, 偏移;
- typedef NS_ENUM(NSInteger, ASPopoverType) {
- ASPopoverTypeUp = 0,
- ASPopoverTypeDown,
- };
- @interface ASPopoverOption : NSObject
- @property (nonatomic, assign) CGSize arrowSize;
- @property (nonatomic, assign) NSTimeInterval animationIn; // if 0, no animation
- @property (nonatomic, assign) NSTimeInterval animationOut;
- @property (nonatomic, assign) CGFloat cornerRadius;
- @property (nonatomic, assign) CGFloat sideEdge;
- @property (nonatomic, strong) UIColor *blackOverlayColor;
- @property (nonatomic, strong) UIBlurEffect *overlayBlur;
- @property (nonatomic, strong) UIColor *popoverColor;
- @property (nonatomic, assign) BOOL dismissOnBlackOverlayTap;
- @property (nonatomic, assign) BOOL showBlackOverlay;
- @property (nonatomic, assign) CGFloat springDamping;
- @property (nonatomic, assign) CGFloat initialSpringVelocity;
- @property (nonatomic, assign) ASPopoverType popoverType;
- @property (nonatomic, assign) BOOL highlightFromView;
- @property (nonatomic, assign) CGFloat highlightCornerRadius;
- @property (nonatomic, assign) BOOL autoAjustDirection; // down preferred, effect just in view not at point
- @end
来源: https://juejin.im/post/5a30902c5188253e2470f4f7