`
jsntghf
  • 浏览: 2512319 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Toast功能的实现

    博客分类:
  • iOS
阅读更多

这个功能和安卓平台的Toast类似,主要是依赖PGToast类实现。

 

PGToast.h

 

#import <Foundation/Foundation.h>

@interface PGToast : NSObject 

- (void)show;
+ (PGToast *)makeToast:(NSString *)text;

@end
 

PGToast.m

 

#import "PGToast.h"
#import <QuartzCore/QuartzCore.h>

#define bottomPadding 50
#define startDisappearSecond 3
#define disappeartDurationSecond 1.5

const CGFloat pgToastTextPadding = 5;
const CGFloat pgToastLabelWidth = 180;
const CGFloat pgToastLabelHeight = 60;
const CGFloat pgToastLabelWidth_PAD = 360;
const CGFloat pgToastLabelHeight_PAD = 100;

@interface PGToast() {
    BOOL showInNormal;
}

@property (nonatomic, retain) UILabel *pgLabel;
@property (nonatomic, copy) NSString *pgLabelText;

- (id)initWithText:(NSString *)text;
- (void)deviceOrientationChange;

@end

@implementation PGToast

@synthesize pgLabel;
@synthesize pgLabelText;

- (id)initWithText:(NSString *)text {
    if (self = [super init]) {
        self.pgLabelText = text;
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationChange) name:UIDeviceOrientationDidChangeNotification object:nil];
    }
    return self;
}

- (void)dealloc {
    [pgLabel release];
    [pgLabelText release];
    [super dealloc];
}

+ (PGToast *)makeToast:(NSString *)text {
    PGToast *pgToast = [[PGToast alloc] initWithText:text];
    return pgToast;
}

- (void)show {
    UIFont *font;
    CGSize textSize;
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        font = [UIFont systemFontOfSize:16];
        textSize = [pgLabelText sizeWithFont:font constrainedToSize:CGSizeMake(pgToastLabelWidth, pgToastLabelHeight)];
    }else{
        font = [UIFont systemFontOfSize:30];
        textSize = [pgLabelText sizeWithFont:font constrainedToSize:CGSizeMake(pgToastLabelWidth_PAD, pgToastLabelHeight_PAD)];
    }
    
    self.pgLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, textSize.width + 2 * pgToastTextPadding, textSize.height + 2 * pgToastTextPadding)];
    
    pgLabel.backgroundColor = [UIColor colorWithRed:174.0 / 255.0 green:174.0 / 255.0 blue:174.0 / 255.0 alpha:0.9];
    pgLabel.textColor = [UIColor whiteColor];
    pgLabel.layer.cornerRadius = 10;
    pgLabel.layer.borderWidth = 2;
    pgLabel.numberOfLines = 2;
    pgLabel.font = font;
    pgLabel.textAlignment = UITextAlignmentCenter;
    pgLabel.text = self.pgLabelText;
    
    [NSTimer scheduledTimerWithTimeInterval:startDisappearSecond target:self selector:@selector(toastDisappear:) userInfo:nil repeats:NO];
    
    UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
    
    [window addSubview:self.pgLabel];
    [self deviceOrientationChange];
}

- (void)deviceOrientationChange {
    CGFloat centerX, centerY;
    CGFloat windowCenterX = [[UIScreen mainScreen] bounds].size.width * 0.5;
    CGFloat windowCenterY = [[UIScreen mainScreen] bounds].size.height * 0.5;
    CGFloat windowWidth = [[UIScreen mainScreen] bounds].size.width;
    CGFloat windowHeight = [[UIScreen mainScreen] bounds].size.height;
    
    UIInterfaceOrientation currentOrient = [UIApplication sharedApplication].statusBarOrientation;
    
    if (currentOrient == UIInterfaceOrientationLandscapeRight) {
        CGAffineTransform rightTransform = CGAffineTransformMake(0.0, 1.0, -1.0, 0.0, 0.0, 0.0);
        self.pgLabel.transform = rightTransform;
        centerX = bottomPadding;
        centerY = windowCenterY;
        self.pgLabel.center = CGPointMake(centerX, centerY);
    } else if(currentOrient == UIInterfaceOrientationLandscapeLeft) {
        CGAffineTransform leftTransform = CGAffineTransformMake(0.0, -1.0, 1.0, 0.0, 0.0, 0.0);
        pgLabel.transform = leftTransform;
        centerX = windowWidth - bottomPadding;
        centerY = windowCenterY;
        self.pgLabel.center = CGPointMake(centerX, centerY);
    } else if(currentOrient == UIInterfaceOrientationPortraitUpsideDown) {
        CGAffineTransform upsideDownTransform = CGAffineTransformMake(-1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
        pgLabel.transform = upsideDownTransform;
        centerX = windowCenterX;
        centerY = bottomPadding;
        self.pgLabel.center = CGPointMake(centerX, centerY);
    } else if(currentOrient == UIInterfaceOrientationPortrait) {
        CGAffineTransform portraitTransform = CGAffineTransformMake(1.0, 0.0, 0.0, 1.0, 0.0, 0.0);
        pgLabel.transform = portraitTransform;
        centerX = windowCenterX;
        centerY = windowHeight - bottomPadding;
        self.pgLabel.center = CGPointMake(centerX, centerY);
    }
    showInNormal = YES;
}

- (void)toastDisappear:(NSTimer *)timer {
    [timer invalidate];
    [NSTimer scheduledTimerWithTimeInterval:1 / 60.0 target:self selector:@selector(startDisappear:) userInfo:nil repeats:YES];
}

- (void)startDisappear:(NSTimer *)timer {
    static int timeCount = 60 * disappeartDurationSecond;
    if (timeCount >= 0) {
        [self.pgLabel setAlpha:timeCount / 60.0];
        if (timeCount == 0) {
            [[NSNotificationCenter defaultCenter] removeObserver:self];
            [self release];
            self = nil;
        }
        timeCount--;
    } else {
        [timer invalidate];
        timeCount = 60 * disappeartDurationSecond;
    }
}

@end

 

调用就很简单了:

 

PGToast *toast = [PGToast makeToast:@"This is a tip."];
[toast show];
分享到:
评论

相关推荐

    Android 优化加载中的Toast,实现真正的夹在过渡动画 源码

    然而,Android原生的`Toast`功能有限,样式单一且无法自定义动画效果。针对这一问题,开发者们创建了各种扩展库,以增强`Toast`的功能,提升用户体验。本文将探讨一个名为"Android 优化加载中的Toast,实现真正的夹...

    c# winform 类似android toast消息功能

    在C# WinForm开发中,有时我们希望实现类似Android中的Toast功能,以便向用户显示短暂的通知消息。Android的Toast提供了一种轻量级的提示方式,可以在不中断用户操作的情况下展示信息。C# WinForm虽然没有内置的...

    C# Winform 类似Android Toast消息功能

    【C# Winform 类似Android Toast消息功能】是一种在Windows桌面应用中实现类似Android系统Toast功能的技术。在Android中,Toast是一种短暂显示信息的方式,它不会阻断用户与界面的交互,而是在屏幕某一位置短暂展示...

    Toast功能的实现(二)

    这篇博文“Toast功能的实现(二)”可能深入探讨了`Toast`的自定义实现和源码分析。虽然没有提供具体的博文内容,但我们可以根据`Toast`的一般特性和可能涉及的话题进行详细讲解。 ### 1. Toast的基本用法 `Toast`...

    C# 实现像toast的提示

    C# 实现像android toast的提示。不想做修改的话,直接调用就能使用,如想做的更加个性化,可自行修改。 var toast = new Toast("标题", "提示内容", 2(保持时间), 0x0(动画效果), 0x0); toast.Show();

    iOS 仿android 中的Toast实现

    Android的Toast功能可以在屏幕任意位置显示一个短暂的通知信息,而不影响用户与界面的交互。iOS虽然没有直接提供这样的组件,但可以通过自定义UIView或者使用一些第三方库来实现相同的功能。 首先,我们来理解一下...

    CocosCreator-Toast.rar

    在这个"CocosCreator-Toast.rar"压缩包中,包含的是一个适用于Cocos Creator的自定义Toast组件,这个组件模仿了Android平台上的Toast功能,用于在游戏界面中显示短暂的信息提示。 1. **Toast控件介绍**: Toast...

    cocos2d实现android Toast提示功能

    本文将详细讲解如何在Cocos2d-x中实现一个类似Android Toast的功能。 Cocos2d-x是一款基于C++的2D游戏开发框架,它提供了一个强大的渲染引擎以及一套丰富的游戏开发工具。由于Cocos2d-x主要处理游戏逻辑和图形渲染...

    Android中实现带声音提示的Toast (自定义扩展Toast)

    总结来说,通过自定义`Toast`并结合`MediaPlayer`,我们可以实现一个带声音提示的功能。这使得用户在收到`Toast`信息时不仅能看到文字,还能听到声音,提升了应用的交互体验。在实际项目中,可以根据需求进一步定制`...

    自定义Application级别toast Demo

    在这种情况下,我们可以创建自定义的Application级别的Toast来实现更灵活的功能。 自定义Toast意味着你可以控制其外观,包括背景颜色、文字颜色、字体大小、图标等。同时,通过在Application级别处理,可以确保...

    Android-Android实现Toast自定义样式

    本文将详细介绍如何在Android中实现`Toast`的自定义样式,包括自定义位置、添加图片以及自定义显示时长。 一、自定义`Toast`的位置 系统默认的`Toast`会在屏幕底部或中间显示,但这往往不能满足所有设计需求。我们...

    Qt仿Android的toast控件效果

    通过以上步骤,我们就可以在Qt环境中实现一个功能完备、性能高效的仿Android toast控件。这样的控件不仅可以在桌面应用中使用,还可以方便地移植到Qt支持的其他平台,如移动设备或嵌入式系统。在实际项目中,可以...

    自定义Toast

    自定义Toast通常会在一段时间后自动消失,因此在创建Dialog时,可以使用`Handler`和`Runnable`来实现延时关闭的功能。 **示例代码(Kotlin):** ```kotlin class CustomToastFragment : AppCompatDialogFragment...

    Android演示五种不同效果的Toast实现方法.rar

    Android实现五种不同外观样式的Toast弹出框效果,演示了自定义位置的Toast显示、带图片的Toast显示、完全自定义的Toast显示、长时间的Toast显示5种Toast,在效果测试时,你可以单击任意一种Toast,查看对应的弹出...

    微信小程序自定义toast

    下面我们将深入探讨如何在微信小程序中实现自定义`Toast`功能。 1. **创建自定义组件** 首先,我们需要创建一个自定义组件,通常命名为`custom-toast`。这个组件将包含显示文本、动画效果、背景颜色、字体样式等...

    android自定义Toast设定显示时间

    Android 自定义 Toast ...在 Android 开发中,自定义 Toast 的显示时间是一个非常重要的功能,可以满足不同的应用场景需求。使用 WindowManager 可以实现自定义 Toast 的显示时间,并提供了更加灵活的 Toast 显示方式。

    Toast的几行代码

    描述“简单的toast效果,几行代码,没啥的”表明实现这个功能并不复杂。接下来,我们将会深入探讨`Toast`的使用方法,以及如何自定义`Toast`以满足更个性化的展示需求。 1. **基础使用** 创建一个基本的`Toast`...

    toast五种效果

    标题“toast五种效果”暗示我们将探讨如何在Android应用中实现不同类型的Toast,包括默认样式、带有图片以及自定义样式的Toast。下面将详细介绍这五种效果。 1. **默认样式Toast** 默认的Toast样式是系统预设的,...

    Qt仿安卓Toast效果.zip

    在本文中,我们将深入探讨如何在Qt环境中实现一个仿安卓Toast效果的功能,这将帮助开发者在他们的Qt应用中创建类似Android系统中短暂显示信息的组件。这个功能是跨平台的,可以在Windows和Linux(如Ubuntu)等操作...

Global site tag (gtag.js) - Google Analytics