两行代码搞定iOS自定义HUD风格动画弹窗(支持选择记录) - SKChoosePopView的使用和实现思路

原文地址----> MyBlog
HUD风格的选项弹窗是我们在日常开发中经常会碰到的一类需求,通常因为项目周期等因素,很少会专门抽出时间来对此类弹窗进行专门的定制开发和维护。常见的情况就是google类似的效果控件,如果恰好匹配需求,效果上说得过去,那么便可以节省不少的时间和精力,但更多的情况是,我们花费了更多的时间去修改、去填坑,效果缺不见得如意,导致开发者最后不得不吐槽:还不如自己写。对于注重追求效率的开发者,似乎什么轮子都可以上路跑,只要它ok,但对于更注重用户体验和效果的开发者而言,就很难将就了,但人的精力总归有限,抽不开身怎么办呢?这个时候就很需要一款效果很赞,使用方便、简洁、可快速集成的组件了:SKChoosePopView便应运而生了。
简述
SKChoosePopView是一个HUD风格的可定制化选项弹窗的快速解决方案,集成了上、下、左、右、中5个进场方向的6种动画效果,如果不能满足你对酷炫效果的需要,SKChoosePopView同样支持自定义动画,以及选择记录、动画的开闭、点击特效、行列数量控制等。如果你觉得还不错,star支持一下吧!
效果图

一.如何使用
1.如何开始
1.从GitHub上Clone-->SKChoosePopView, 然后查看Demo
2.请仔细阅读下方特别指出的部分和需要注意问题
3.在项目中使用SKChoosePopView,直接将SKPopView文件夹拷贝到工程中
4.SKChoosePopView基于Masonry布局,请确保你的工程里已存在Masonry,下载地址
2.使用方法
头文件导入
#import "SKPopView.h"
初始化
/** 初始化方法
* @param title 标题数组
* @param iconNormal 默认图标数组
* @param iconSelected 选中图标数组, 若不需要传入nil即可
* @param titleColor 选中的选项标题字体颜色, 若不需要传入nil即可
* @param delegate 代理协议
* @param completion 弹窗出现后的回调操作,若不需要传入nil即可
*/
SKPopView * popView = [[SKPopView alloc] initWithOptionsTitle:kDate.title OptionsIconNormal:kDate.normalIconsOptionsIconSelected:kDate.selectedIcons selectedTitleColor:[UIColor orangeColor] delegate:self completion:^{// TODO: 如果这里不需要就nil
}];
显示
[popView show];
消失
[popView dismiss];
设置动画类型
popView.animationType = SK_TYPE_SPRING;
设置动画方向
popView.animationDirection = SK_SUBTYPE_FROMBOTTOM;
动画时间
popView.animationDuration = 0.5;
开启/关闭选择记录
popView.enableRecord = YES;
开启/关闭动画效果
popView.enableAnimation = YES;
行数设置
popView.optionsLine = 2;
列数设置
popView.optionsRow = 3;
最小行间距
popView.minLineSpacing = 10;
最小列间距
popView.minRowSpacing = 10;
动画设置
SK_TYPE_SPRING,// 弹簧效果
SK_TYPE_ROTATION,// 旋转效果
SK_TYPE_FADE,// 渐变效果
SK_TYPE_LARGEN,// 变大效果
SK_TYPE_ROTATION_LARGEN,// 旋转变大效果
SK_TYPE_TRANSFORMATION// 变形效果
动画进场方向
SK_SUBTYPE_FROMRIGHT,// 从右侧进入
SK_SUBTYPE_FROMLEFT,// 从左侧进入
SK_SUBTYPE_FROMTOP,// 从顶部进入
SK_SUBTYPE_FROMBOTTOM,// 从底部进入
SK_SUBTYPE_FROMCENTER// 从屏幕中间进入
获取已选择的选项row(代理协议方法)
- (void)selectedWithRow:(NSUInteger)row;
注意事项
1.optionsLine
和optionsRow
属性是必须设置的, 且遵循垂直布局原则,请确保optionsLine * optionsRow于选项数量相等
2.最小行、列间距如不需要可以不设置,默认为0
3.如果开启动画,请确保animationType
、animationDirection
和animationDuration
属性已经设置
4.使用代理协议方法前,请确保已遵循<SKPopViewDelegate>
4.如果遇到其它问题,欢迎提交issues,我会及时回复
二.实现思路
1.设计思路
首先,在总体设计上我们采取模块化的思路,主要分为两部分:
SKPopView
(视图)和SKPopAnimationManger
(动画管理),各司其职。SKPopView
负责处理界面控件的创建和布局约束、外部对弹窗配置信息设置的响应(如是否开启动画效果、点击效果、选择记录、动画类型/方向、需要显示的行/列等)、已选择的选项回调等。SKPopAnimationManger
则负责动画的相关管理,如对动画进场方向的轨迹控制、动画效果的具体实现等。
2.功能实现
布局
在整体上,
SKPopView
充当了一个父UIView
的角色,在其内部添加grayBackground1
(灰色的背景)和popView
(HUD弹窗部分),总体结构简单明了,所以在调用的时候我们是直接将SKPopView
整个添加到我们需要显示的界面当中来使用的。在
SKPopView
中,grayBackground
作为灰色背景率先addSubview到SKPopView
中[self addSubview:grayBackground]
,而弹窗则作为插入部分,插入到grayBackground
之上[self insertSubview:self.popView aboveSubview:grayBackground]
, 而在popView
内部,我们内嵌了一个UICollectionView
,作为选项按钮的展示。
弹窗的出现与消失
- 弹窗的出现原理:当弹窗被调用时,
SKPopView
整体便会添加到当前视图的图层之上,而弹窗popView
此时会根据调用时在初始化方法里配置的SK_TYPE(动画类型)和SK_SUBTYPE(动画方向),在屏幕外选择一个入场前的坐标和入场时的动画效果,当初始化完成开始调用SKPopView
的show
方法时,popView
便开始入场、完成动画。
#pragma mark - 外部调用
- (void)show
{if (self.enableAnimation == YES) {// 如果开启动画效果[self displayAnimation];}
}
#pragma mark - 动画设置
- (void)displayAnimation
{self.animationManger = [[SKPopAnimationManger alloc] init];switch (self.animationType) {// 动画类型case SK_TYPE_SPRING:self.animationManger.type = SK_ANIMATION_TYPE_SPRING;break;case SK_TYPE_ROTATION:self.animationManger.type = SK_ANIMATION_TYPE_ROTATION;break;case SK_TYPE_FADE:self.animationManger.type = SK_ANIMATION_TYPE_FADE;break;case SK_TYPE_LARGEN:self.animationManger.type = SK_ANIMATION_TYPE_LARGEN;break;case SK_TYPE_ROTATION_LARGEN:self.animationManger.type = SK_ANIMATION_TYPE_ROTATION_LARGEN;break;case SK_TYPE_TRANSFORMATION:self.animationManger.type = SK_ANIMATION_TYPE_TRANSFORMATION;break;
}switch (self.animationDirection) {// 动画进场方向case SK_SUBTYPE_FROMRIGHT:self.animationManger.animationDirection = SK_ANIMATION_SUBTYPE_FROMRIGHT;break;case SK_SUBTYPE_FROMLEFT:self.animationManger.animationDirection = SK_ANIMATION_SUBTYPE_FROMLEFT;break;case SK_SUBTYPE_FROMTOP:self.animationManger.animationDirection = SK_ANIMATION_SUBTYPE_FROMTOP;break;case SK_SUBTYPE_FROMBOTTOM:self.animationManger.animationDirection = SK_ANIMATION_SUBTYPE_FROMBOTTOM;break;case SK_SUBTYPE_FROMCENTER:self.animationManger.animationDirection = SK_ANIMATION_SUBTYPE_FROMCENTER;break;default:break;
}// 对进场动画进行设置[self.animationManger animateWithView:self.popView Duration:self.animationDuration animationType:self.animationManger.type animationDirection:self.animationManger.animationDirection];
}
- 由于支持对已选择的按钮进行记录保存,所以在使用上,用户仅能通过对灰色背景的点击来达到让弹窗消失的目的,我们通过对
grayBackground
添加点击手势来达到目的, 注意:grayBackground
在这里是一个UIImageView
,在添加手势时,一定要将userInteractionEnabled = YES
,开启用户交互,否则手势将失效。
// 灰色背景
UIImageView * grayBackground = [UIImageView new];
[self addSubview:grayBackground];
grayBackground.backgroundColor = [UIColor colorWithWhite:0.3 alpha:0.5];;
grayBackground.userInteractionEnabled = YES;
[grayBackground mas_makeConstraints:^(MASConstraintMaker *make) {make.edges.equalTo(self).with.insets(UIEdgeInsetsMake(0, 0, 0, 0));
}];
// 添加手势
UITapGestureRecognizer * dismissGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cancel)];
[grayBackground addGestureRecognizer:dismissGesture];
#pragma mark - 手势响应
- (void)cancel
{[self dismissAnimation];
}
- (void)dismissAnimation
{if (self.enableAnimation == YES) {// 如果开启动画效果[self.animationManger dismissAnimationForRootView:self];// 使用离场动画} else {[self removeFromSuperview];// 直接移除整个SKPopView}
}
- 如果需求上有取消按钮,可以在取消按钮的点击方法内手动调用
SKPopView
的dismiss
方法,十分方便。
如
- (void)clickCancel // 取消按钮方法
{[popView dismiss];
}
选项的数量与显示把控
- 因为我们在
popView
中镶嵌了一个UICollectionView
,而UICollectionView
提供了几个很好的方法可以让我们相对轻松的对选项的数量及在弹窗内的显示方式进行把控,我们主要应用了下面几个方法
// 设置item的size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
// 最小列(横向)间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
// 最小行(纵向)间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
然后根据我们在SKPopView
的头文件中暴露的外部配置信息optionsLine
(显示的行数)、optionsRow
(显示的列数)、minLineSpacing
(最小行间距)、minRowSpacing
(最小列间距),来对具体的样式进行修改,具体转换算法请参考SKPopView.m中外部配置
标签下的代码段
动画
- 动画部分我们分为:进场动画、撤场动画和选项点击动画三个部分
1.进场动画:
首先我们要弄明白一点,进场动画,顾名思义:就是由进场+动画两个效果部分组成的
由于默认集成了来自5个方向的6种不同效果的动画,导致动画在进行相应配置时,对于每种动画效果都需要考虑5种不同的进场起始坐标,所以,我们用一个统一的方法对动画的进场方向进行统一管理,同样的,考虑到一些动画效果需要使用动画组, 对动画在进场过程中的位移路径也需要做一个统一管理
#pragma mark - 动画方向初始化- (void)animationDirectionInitialize{if (_animationDirection == SK_ANIMATION_SUBTYPE_FROMRIGHT) {// 从右侧进场_animationView.center = CGPointMake(MyWidth + 1000, WindowCenter.y);} else if (_animationDirection == SK_ANIMATION_SUBTYPE_FROMLEFT) {// 从左侧进场_animationView.center = CGPointMake(MyWidth - 1000, WindowCenter.y);} else if (_animationDirection == SK_ANIMATION_SUBTYPE_FROMTOP) {// 从顶部进场_animationView.center = CGPointMake(WindowCenter.x, MyHeight - 1000);} else if (_animationDirection == SK_ANIMATION_SUBTYPE_FROMBOTTOM) {// 从底部进场_animationView.center = CGPointMake(WindowCenter.x, MyHeight + 1000);} else {// 中间进场_animationView.center = WindowCenter;}}#pragma mark - 动画通用位移- (CAKeyframeAnimation *)partOfTheAnimationGroupPosition:(CGPoint)startPosition{CAKeyframeAnimation * animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];// 创建关键帧位移动画NSValue * startValue, * endValue;startValue = [NSValue valueWithCGPoint:startPosition];// 起始坐标endValue = [NSValue valueWithCGPoint:WindowCenter];// 结束坐标animation.values = @[startValue, endValue];// 设置动画路径animation.duration = _animationDuration;// 持续时间return animation;}
- 其中
弹簧效果
的动画由于不是并发动画效果,所以是没有用到通用位移
的,所以它的位移方法是独立出来的
#pragma mark - 弹簧效果- (void)springAnimation{[self animationDirectionInitialize];// 初始化方向[self displacementWithStartPosition:_animationView.center];}/** 弹簧效果位移部分* @param startPosition 位移起始坐标*/- (void)displacementWithStartPosition:(CGPoint)startPosition{CAKeyframeAnimation * animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];// 创建关键帧动画NSValue * startValue, * endValue;startValue = [NSValue valueWithCGPoint:startPosition];endValue = [NSValue valueWithCGPoint:WindowCenter];animation.values = @[startValue, endValue];animation.duration = _animationDuration;animation.delegate = self;// 设置CAAnimationDelegate[_animationView.layer addAnimation:animation forKey:@"pathAnimation"];}/** 弹簧效果晃动部分*/- (void)partOfTheSpringGroupShaking{NSString * keyPath = @"";if (_animationDirection == SK_ANIMATION_SUBTYPE_FROMLEFT || _animationDirection == SK_ANIMATION_SUBTYPE_FROMRIGHT) {// 判断弹窗的来向keyPath = @"transform.translation.x";} else {keyPath = @"transform.translation.y";}CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:keyPath];animation.fromValue = [NSNumber numberWithFloat:-20.0];animation.toValue = [NSNumber numberWithFloat:20.0];animation.duration = 0.1;animation.autoreverses = YES;// 是否重复animation.repeatCount = 2;// 重复次数[_animationView.layer addAnimation:animation forKey:@"shakeAnimation"];}- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag// 监听动画停止{[self partOfTheSpringGroupShaking];}
2.撤场动画
撤场动画就相对简单很多, 由于撤场方式是统一的,只需要对撤出坐标做处理,然后removeFromSuperview
- (void)dismissAnimationForRootView:(UIView *)view {[UIView animateWithDuration:0.5 animations:^{_animationView.center = CGPointMake(WindowCenter.x, MyHeight + 1000);} completion:^(BOOL finished) {[view removeFromSuperview];}]; }
3.选项点击动画
当点击动画效果被开启时,才会调用这个方法,即
enableClickEffect = YES
时,SKPopViewCollectionViewCell
中会调用点击动画- (void)setEnableClickEffect:(BOOL)enableClickEffect {_enableClickEffect = enableClickEffect;if (enableClickEffect == YES) {SKPopAnimationManger * animationManger = [[SKPopAnimationManger alloc] init];[animationManger clickEffectAnimationForView:self.basementView];} }
而在
SKPopAnimationManger
中,我们只是巧妙的对其做了一个缩放的效果,即可达到果冻式的触感- (void)clickEffectAnimationForView:(UIView *)view {CABasicAnimation * scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];scaleAnimation.fromValue = [NSNumber numberWithFloat:1];scaleAnimation.toValue = [NSNumber numberWithFloat:0.8];scaleAnimation.duration = 0.1;scaleAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];[view.layer addAnimation:scaleAnimation forKey:nil]; }
感谢你花时间阅读以上内容, 如果这个项目能够帮助到你,记得告诉我
Email: shevakuilin@gmail.com
或者直接在文章下留言哦~
相关文章:

yii2框架随笔29
今天我们来看UrlRule.php <?php /*** link http://www.yiiframework.com/* copyright Copyright (c) 2008 Yii Software LLC* license http://www.yiiframework.com/license/*/ namespace yii\web; use Yii; use yii\base\Object; use yii\base\InvalidConfigException; /*…

八种简易健康减肥瘦身法
①原地跑,紧实大腿肌肉;②上楼梯,瘦小腿、大腿、臀;③步行,瘦腿、腰;④瑜珈,瘦全身;⑤跳舞,瘦全身;⑥跳绳,瘦大腿、小腿;⑦晨操&#…

LaZagne检测windows本地存储的密码
LaZagne项目是用于检索存储在本地计算机上的大量密码的开源应用程序。 每个软件使用不同的技术(明文,API,自定义算法,数据库等)存储其密码。 该工具的开发是为了找到最常用的软件的密码。 下载到windows机器࿰…

通知提示SCPromptView
作者 陈小翰 关注 2017.03.24 18:01 字数 138 阅读 62评论 0喜欢 1SCPromptView SCPromptView : 显示在顶部的提示控件 你的star是我最大的动力 effect.gif安装 手动安装 下载源码,将SCPromptView文件夹拖进项目 CocoaPod pod SCPromptView 使用 SCPromptView 的用…

4566: [Haoi2016]找相同字符 SAM
折腾了好久。不过收获还是很多的。第一次自己去画SAM所建出来fail树。深入体会了这棵树的神奇性质。 当然,我最终靠着自己A掉了。(这是我第一次推SAM的性质(以前都是抄别人的,感觉自己好可耻),不过感觉好像…

NYOJ-232 How to eat more Banana
How to eat more Banana 时间限制:1000 ms | 内存限制:65535 KB难度:4描述A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, …

UIView Animation
作者 嘿o大远 关注 2017.03.23 17:02* 字数 402 阅读 47评论 1喜欢 3今天总结一下UIView动画就是 UiView动画是基于高层API封装进行封装的,对UIView的属性进行修改时候所产生的动画. 基本动画 下面两种方法是最常用的两种. (void)animateWithDuration:(NSTimeInterval)duratio…

[转]Ext Grid控件的配置与方法
http://www.blogjava.net/wangdetian168/archive/2011/04/12/348651.html 1、Ext.grid.GridPanel 主要配置项: store:表格的数据集 columns:表格列模式的配置数组,可自动创建ColumnModel列模式 autoExpandColumn:自动充…
永久设置SecureCRT的背景色和文字颜色方案
对于默认的连接颜色感觉不舒服,一通乱搞,总结出这些。 一、对于临时设置,可以如下操作: 首先options -- session - appearance 此处可以设置临时的窗口背景,字体颜色,大小等等,为什么说是临时&a…

利用Procdump+Mimikatz获取Windows帐户密码
0x01 前言: 前段时间拿下一个网站的shell,很幸运的是直接就是System权限,结果发现执行添加用户命令并不能成功回显 看了下系统进程,原来是开启了360的主动防御,奈何也不会做免杀,上传exp运行就被杀&#x…

一个逻辑清晰的购物车模型
效果图 2017-03-25 18.28.23.gifGitHub: https://github.com/lll1024/JVShopcart 说明 这是一个具备常规功能并方便改造的购物车模型 一共包含五个模块: JVShopcartViewController: 购物车控制器 负责协调Model和View 只有100多行代码JVShopcartFormat: 负责网络请求…

Nginx基本配置、性能优化指南
转载自:http://www.chinaz.com/web/2015/0424/401323.shtml 大多数的Nginx安装指南告诉你如下基础知识——通过apt-get,或yum安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了!而且ÿ…

关于批量修改AD域用户的脚本
最近几天帮人弄了个脚本,是修改域用户属性的脚本,今天看到徐火军写的 关于批量修改用户属性 脚本,觉得有必要把我的成果分享给大家。什么都不说了,上脚本: Dim oFSO, oTF, iDim sLineDim sLoginName 用户批量文件Const…

Python multiprocess 多进程模块
转发:http://www.langzi.fun/Python multiprocess 多进程模块.html 需要注意的是,如果使用多线程,用法一定要加上if __name____main__:(Python中的multiprocess提供了Process类,实现进程相关的功能。但是它基于fork机制ÿ…

PHP正则数组
<?php //正则表达式//斜杠代表定界符 /^$///$str "好厉害18653378660了hi请勿嫁得好15165339515安徽dah矮冬瓜 拍行业大概啊好广东也欺负偶怕哈";//$reg "/(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}/";//echo preg_repl…

iOS Socket Client 通讯
iOS Socket Client 通讯 阅读 239收藏 192017-03-29原文链接:https://github.com/guangzhouxia/JTSocketiOS Socket Client 通讯(偏流程和代码展示),具体原理可以在网上搜索到很多,就不多做追叙复制了。。。 —— 由广…
api工程IOS学习:在IOS开发中使用GoogleMaps SDK
今天一直在学习api工程之类的问题,今天正好有机会和大家分享一下. 官方文档地址:https://developers.google.com/maps/documentation/ios/start#getting_the_google_maps_sdk_for_ios 一、申请一个收费的API KEY 要应用GoogleMaps SDK,必须要为你的应用申…

Python多进程与进程锁的基本使用
Python的multiprocessing模块提供了多种进程间通信的方式,如Queue、Pipe等。 Queue是multiprocessing提供的一个模块,它的数据结构就是"FIFO——first in first out"的队列,常用的方法有:put(object)入队;g…

[容易]比较字符串
题目来源:http://www.lintcode.com/zh-cn/problem/compare-strings/ 先贴上错误代码,测试案例没有全部通过。不一定是顺序的。 1 class Solution {2 public:3 /**4 * param A: A string includes Upper Case letters5 * param B: A string…

iOS 一行命令发布 Pod 框架
作者 ripperhe 关注 2017.03.30 23:38* 字数 5589 阅读 27评论 0喜欢 2前言 目前比较流行的组件化开发,针对多个 app 要用同一套代码,将其做成 pod 仓库是比较好的解决方案。代码只有一份放在组件仓库,需要集成的 app 只需要将其 pod 到工程内…

[bbk4966]第70集 第8章 -性能维护 01
本章前言: 每秒钟,产生的日志文件多少,如果产生很多的redo log 信息,说明负荷量大差生的原因是DML操作太多. 假如oracle database 属于dedicate server,使用top session方式排查数据库性能问题,是比较适合的.根据SESSI…

Python中正则匹配与中文的问题
笔者改写了一个爬虫,来爬取补天SRC的漏洞认领页面,将单位名称、漏洞名称、漏洞危害等级爬取下来,但是在正则匹配"漏洞名称"的过程中遇到了一些麻烦。 如上图,想要把"SQL注入漏洞"字符串正则匹配出来…

项目/程序的流程走向
领导用户需求前景准备分析(OOA)设计(OOD)实现(OOP)测试部署发布跟踪维护升级新田月会|新细胞|君宁天下|htttp://www.xintianyuehui.cn 作者:宁骑 联系QQ:1075858260转载于:https://www.cnblogs.com/ncellit/p/5491828.html

使用 UIBezierPath 进行简单的图形绘制
这篇文章介绍UIBezierPath的详细的使用, 以及一些细节! 创建一个XTBezierPath继承于UIView的类 使用drawRect 完成图形的绘制 在drawRect方法完成绘制 使用 moveToPoint, addLineToPoint两个方法绘制一个任意多边形 其中w, h 代表自定义View的宽, 高 代码如下: // 初始化一个UI…

利用python实现IP扫描
需求:写一个脚本,判断192.168.11.0/24网络里,当前在线ip有哪些? 知识点: 1 使用subprocess模块,来调用系统命令,执行ping 192.168.11.xxx 命令 2 调用系统命令执行ping命令的时候,会有返回值…

EFQRCode:自动生成花式二维码
原文链接:https://github.com/EyreFree/EFQRCodeEFQRCode:自动生成花式二维码。# 为开源点赞# —— 由SwiftLanguage分享EFQRCode is a tool to generate QRCode UIImage or recognize QRCode from UIImage, in Swift. It is based on CIDetector and CI…

centos删除系统自带的httpd
centos删除系统自带的httpd 1、[rootlocalhost etc]# rpm -qa|grep httpd,查看与httpd相关软件包。 httpd-tools-2.2.15-15.el6.centos.i686 httpd-2.2.15-15.el6.centos.i686 www.2cto.com 2、然后删除httpd: [rootlocalhost etc]# rpm -e httpd 出现问…

[C#]ASP.NET MVC 3 在线学习资料
最近在研究如何把Twitter Bootstrap移植到ASP.NET MVC 3上,攒了点资料,先贴在之里,以后整理了写心得。 1. http://www.codeproject.com/Articles/404633/Transform-ASP-NET-MVC3-Default-Template-with-Twitt 这是一篇介绍如何把默认的ASP.NE…

域渗透提权之MS14-068
0x00 前言 在做渗透测试时,当遇到域环境,获取到一个域成员账号后,如果域控制器未打好补丁,则可以利用本文所提到的漏洞,快速获取到域控制器权限。笔者这里总结网上已有资料,加以描述,希望你能在…