98 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
|  | #import "TDToastView.h"
 | ||
|  | 
 | ||
|  | @implementation TDToastView
 | ||
|  | {
 | ||
|  |     UITextView *_textView;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | #define TOAST_HORIZONTAL_PADDING 20.0
 | ||
|  | #define TOAST_VERTICAL_PADDING 15.0
 | ||
|  | 
 | ||
|  | - (instancetype)initWithFrame:(CGRect)frame {
 | ||
|  |     if ((self = [super initWithFrame:frame])) {
 | ||
|  |         _textView = [[UITextView alloc] initWithFrame:CGRectZero];
 | ||
|  |         _textView.opaque = NO;
 | ||
|  |         _textView.editable = NO;
 | ||
|  |         _textView.selectable = NO;
 | ||
|  |         _textView.textColor = [UIColor whiteColor];
 | ||
|  |         _textView.backgroundColor = [UIColor clearColor];
 | ||
|  |         _textView.userInteractionEnabled = YES;
 | ||
|  |         [self addSubview:_textView];
 | ||
|  |         self.alpha = 0.9;
 | ||
|  |         self.backgroundColor = [UIColor darkGrayColor];
 | ||
|  |         self.layer.cornerRadius = 20.0;
 | ||
|  |         self.opaque = NO;
 | ||
|  |         self.userInteractionEnabled = YES;
 | ||
|  |         [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_tapHandler:)]];
 | ||
|  |     }
 | ||
|  |     return self;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | + (instancetype)showInWindow:(UIWindow *)window text:(NSString *)text duration:(NSTimeInterval)duration {
 | ||
|  |     TDToastView *toast = [[self alloc] initWithFrame:CGRectZero];
 | ||
|  |     toast.text = text;
 | ||
|  |     [toast showInWindow:window duration:duration];
 | ||
|  |     return toast;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | - (void)showInWindow:(UIWindow *)window duration:(NSTimeInterval)duration {
 | ||
|  |     if (window == nil) {
 | ||
|  |         return;
 | ||
|  |     }
 | ||
|  |     CGRect windowBounds = CGRectInset(window.bounds, 20.0, 20.0);
 | ||
|  |     CGRect toastBounds = CGRectZero;
 | ||
|  |     toastBounds.size = [self sizeThatFits:windowBounds.size];
 | ||
|  |     self.bounds = toastBounds;
 | ||
|  |     self.center = CGPointMake(CGRectGetMidX(windowBounds), CGRectGetMidY(windowBounds));
 | ||
|  |     CGFloat alpha = self.alpha;
 | ||
|  |     self.alpha = 0.0;
 | ||
|  |     [window addSubview:self];
 | ||
|  |     [UIView animateWithDuration:0.3 animations:^{
 | ||
|  |         self.alpha = alpha;
 | ||
|  |     } completion:^(BOOL finishedShowing) {
 | ||
|  |         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 | ||
|  |             [self dismiss];
 | ||
|  |         });
 | ||
|  |     }];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (NSString *)text {
 | ||
|  |     return _textView.text;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)setText:(NSString *)text {
 | ||
|  |     _textView.text = text;
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)dismiss {
 | ||
|  |     if (!self.superview) {
 | ||
|  |         return;
 | ||
|  |     }
 | ||
|  |     [UIView animateWithDuration:0.3 animations:^{
 | ||
|  |         self.alpha = 0.0;
 | ||
|  |     } completion:^(BOOL finishedHiding) {
 | ||
|  |         [self removeFromSuperview];
 | ||
|  |     }];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)_tapHandler:(UITapGestureRecognizer *)tapGestureRecognizer {
 | ||
|  |     [self dismiss];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)layoutSubviews {
 | ||
|  |     [super layoutSubviews];
 | ||
|  |     _textView.frame = CGRectInset(self.bounds, TOAST_HORIZONTAL_PADDING, TOAST_VERTICAL_PADDING);
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (CGSize)sizeThatFits:(CGSize)size {
 | ||
|  |     CGSize textConstrainedSize = CGSizeMake(size.width - 2 * TOAST_HORIZONTAL_PADDING,
 | ||
|  |                                           size.height - 2 * TOAST_VERTICAL_PADDING);
 | ||
|  |     CGSize textSize = [_textView sizeThatFits:textConstrainedSize];
 | ||
|  |     CGFloat width = MIN(size.width, textSize.width + 2 * TOAST_HORIZONTAL_PADDING);
 | ||
|  |     CGFloat height = MIN(size.height, textSize.height + 2 * TOAST_VERTICAL_PADDING);
 | ||
|  |     return CGSizeMake(width, height);
 | ||
|  | }
 | ||
|  | 
 | ||
|  | @end
 |