简单的自定义弹框

  作为初学者,很多人都是用的系统自带的弹框,非常的简单,完全不能满足用户的交互,所以这里,我们需要自定义一个弹框,把输入框、图片、按钮等添加到弹框里面。为了避免重复冗余的代码,参考了别人的代码,自己做了一个自定义弹框,可以在项目中使用到。给大家一个思路。  

  这是代码的接口定义,只需要调用一行代码就可以弹出一个自定义的视图啦。还会添加一些动画效果,让弹框弹出跟消失更美观。

+ (void)showPromptBoxWithCustomView:(UIView *)customView;

+ (void)promptBoxHiden;

// 不会消失,需要手动点击
+ (void)showPromptBoxWithImage:(UIImage *)image text:(NSString *)text;

// 在几秒有消失
+ (void)showPromptBoxWithText:(NSString *)text;

  动画效果跟显示框效果也是必须有的

/**
 *  显隐提示框
 */
- (void)promptBoxHidenWithView:(SQPromptBox *)view speed:(CGFloat)speed {
    [UIView animateWithDuration:speed animations:^{
        view.coverView.alpha = 0.0f;
    } completion:^(BOOL finished) {
        if (finished) {
            [view.coverView removeFromSuperview];
        }
    }];
}

/**
 *  动画效果
 */
- (void)presentWithDuration:(CGFloat)duration speed:(CGFloat)speed {
    [UIView animateWithDuration:speed animations:^{
        self.alpha = 1.0f;
        self.coverView.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.5f];
    } completion:^(BOOL finished) {
        if (finished) {
            if (!self.customView) {
                [self performBlock:^{
                    [self promptBoxHidenWithView:self speed:speed];
                } afterDelay:duration];
            }
        }
    }];
}

  

  还有一步很重要,需要通过字数来计算label的高度,如果没有这一步完成的效果就没有那么好看了。

- (CGSize)sizeWithText:(NSString *)text font:(UIFont *)font maxSize:(CGSize)maxSize {
    NSDictionary *attrs = @{NSFontAttributeName : font};
    return [text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}

  这是一个布局的方法,需要计算好,不然就不能自适应不能尺寸的iPhone了

- (void)layoutSubviews {

    if (!self.customView) {
        CGSize textSize = [self sizeWithText:self.textLabel.text font:self.textLabel.font maxSize:CGSizeMake(kWidth - 2 * kMagin, MAXFLOAT)];
        if (self.imageView.image) {
            self.imageView.frame = CGRectMake((self.frame.size.width - self.image.size.width) / 2.0f, kMagin, self.image.size.width, self.image.size.height);
            self.textLabel.frame = CGRectMake((kWidth - textSize.width) / 2.0f, CGRectGetMaxY(self.imageView.frame) +  kMagin, textSize.width, textSize.height);

        }else {
            CGFloat height = textSize.height < kHeight ? kHeight : textSize.height;
            self.textLabel.frame = CGRectMake((kWidth - textSize.width) / 2.0f, kMagin, textSize.width, height);
        }
        CGRect rect = [self typeFrame];
        rect.size.height = CGRectGetMaxY(self.textLabel.frame) + kMagin;
        self.frame = rect;
    }
}

  

  这是把弹框和蒙版加载当前显示控制器的view上,通过下面的方法来遍历,能获取到控制器

/**
 *  得到currentViewController
 */
- (UIViewController *)getCurrenViewController {
    UIViewController *currenVIewController = nil;

    // 返回一个app的实例,keyWindow(只读)
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    if (window.windowLevel != UIWindowLevelNormal) {
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for (UIWindow *tempWindow in windows) {
            if (tempWindow.windowLevel == UIWindowLevelNormal) {
                window = tempWindow;
                break;
            }
        }
    }

    UIView *frontView = [[window subviews] objectAtIndex:0];
    // 接受下一个响应者
    id nextResponder = [frontView nextResponder];

    if ([nextResponder isKindOfClass:[UIViewController class]]) {
        currenVIewController = nextResponder;
    } else {
        currenVIewController = window.rootViewController;
    }
    return currenVIewController;
}

  因为代码比较多,就没有一一展示出来,就提供一个小小的思路,供大家参考。

  最后就是上面代码的网站
      https://github.com/empty-sq/-.git

时间: 2024-10-13 05:43:52

简单的自定义弹框的相关文章

之前项目中用到的简单的自定义弹出提示框的实现,整理整理,当然开源的插件很多,但自己写的可以随意发挥

效果如下: html代码: <div class="container"> <div class="wrapper" style="background-color:white; position:relative;"> <div class="box" style="background-color:red; position:absolute; left:100px; top:300

js组件--自定义弹框

javascript自定义弹框 性能太差,有很大的改善空间 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <!--<link href="styles/reset.css" type="text/css&

Windows Phone开发学习笔记(1)---------自定义弹框

Windows Phone开发学习笔记(1) ---------自定义弹框 在WP中自定义弹框是可以通过Popup类实现的. Popup的语法为: [ContentPropertyAttribute("Child")] [LocalizabilityAttribute(LocalizationCategory.None)] public class Popup : FrameworkElement, IAddChild; 这是Popup使用的小列子 Popup codePopup =

自定义弹框加载方式

- (void)show { if ([UIApplication sharedApplication].keyWindow.rootViewController.navigationController) { [[UIApplication sharedApplication].keyWindow.rootViewController.navigationController.view addSubview:self]; }else{ [[UIApplication sharedApplica

自定义弹框

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv=&q

RN code push自定义弹框

最近在弄react native的code push热更新问题.开始是用的后台默默更新配置.由于微软服务器速度问题,经常遇到用户一直在下载中问题.而用户也不知道代码需要更新才能使用新功能,影响了正常业务流程.而目前公司也无力搭建自己的服务器和dns设置.所以比较快速的方案就是,前端自定义热更新弹框,在需要更新代码的情况下禁止用户向下操作. ok,废话少说,直接上代码: 这是构建一个弹框,强制文案提示和非强制文案提示弹框. /** * Created by susie on 2018/9/20.

swift 自定义弹框

// //  ViewController.swift //  animationAlert // //  Created by su on 15/12/9. //  Copyright © 2015年 tian. All rights reserved. // import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //灰色的遮挡板 let o

html自定义弹框

一.要实现的功能 1.弹框弹出时有遮罩 2.弹框内的文字过多时右侧有滚动条 3.根据执行结果变更弹框title的样式 二.具体实现 思路:定义一个有宽高的div,默认隐藏,当要显示时,设置为display=block来显示 1.定义div布局,一个遮罩层:一个弹框(弹框中有标题和内容两部分) <div id="dialogmask" class="dialogmask opacity"></div> <div id="dial

自定义弹框,点击提示框外空白区域,让弹框消失

tip: self.mainView  是提示框的全屏背景.一般是透明的黑色 self.bgImg   添加提示内容的主要view 方法一:正常情况下,各个页面都有touchesBegan:withEvent事件的触发.使用该方法 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [touches anyObject]; // 计算搜索框范围 CGPoint touchPoint