98 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
| #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
 |