IOS开发基础知识--碎片37
1:iOS 使用NJKWebViewProgress做webview进度条
引入头文件:
#import "NJKWebViewProgressView.h"
#import "NJKWebViewProgress.h"
遵守协议
<UIWebViewDelegate, NJKWebViewProgressDelegate> 实现代码
@implementation ViewController
{
IBOutlet __weak UIWebView *_webView;
NJKWebViewProgressView *_webViewProgressView;
NJKWebViewProgress *_webViewProgress;
} - (void)viewDidLoad
{
[super viewDidLoad]; _webViewProgress = [[NJKWebViewProgress alloc] init];
_webView.delegate = _webViewProgress;
_webViewProgress.webViewProxyDelegate = self;
_webViewProgress.progressDelegate = self; CGRect navBounds = self.navigationController.navigationBar.bounds;
CGRect barFrame = CGRectMake(,
navBounds.size.height - ,
navBounds.size.width,
);
_webViewProgressView = [[NJKWebViewProgressView alloc] initWithFrame:barFrame];
_webViewProgressView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
[_webViewProgressView setProgress: animated:YES];
[self loadBaidu];
[self.navigationController.navigationBar addSubview:_webViewProgressView];
} -(void)loadBidu
{
NSURLRequest *req = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.baidu.com/"]];
[_webView loadRequest:req];
} #pragma mark - NJKWebViewProgressDelegate
-(void)webViewProgress:(NJKWebViewProgress *)webViewProgress updateProgress:(float)progress
{
[_webViewProgressView setProgress:progress animated:YES];
self.title = [_webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
2:解决输入框UITextField关于拼音或部首被当作内容响应
// 添加监听
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldDidChanged:)
name:UITextFieldTextDidChangeNotification
object:self.textField]; // 监听处理
- (void)textFieldDidChanged:(NSNotification *)notification {
NSString *text = self.textField.text; // 拼音输入时,拼音字母处于选中状态,此时不判断是否超长
UITextRange *selectedRange = [self.textField markedTextRange];
if (!selectedRange || !selectedRange.start) {
if (text.length > MAXLENGTH) {
self.textField.text = [text substringToIndex:MAXLENGTH];
}
}
}
这里主要使用了两个知识:
- 输入法输入时,拼音字母或者笔画处于选中状态,可以使用 markedTextRange 获取到
- 普通输入,以及将输入法的待选字填入输入框时,都会发出 UITextFieldTextDidChangeNotification, 可以监听这个通知,并事后对 UITextField 的内容做清理
另外除了使用监听 NSNotification 的方式,也可以使用 addTargetAction 的方式,代码如下:
[self.textField addTarget:self
action:@selector(textChange:)
forControlEvents:UIControlEventEditingChanged];
这与上面的方式是等价的,但是使用 NSNotification 需要在对象销毁时 removeObserver,而这种方式不需要
3:根据内容自适应UIButton的大小
NSString *str = @"这是按钮的标题";
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.titleLabel.font = [UIFont systemFontOfSize:13.0];
//对按钮的外形做了设定,不喜可删~
btn.layer.masksToBounds = YES;
btn.layer.borderWidth = ;
btn.layer.borderColor = [[UIColor blackColor] CGColor];
btn.layer.cornerRadius = ; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[btn setTitle:str forState:UIControlStateNormal]; //重要的是下面这部分哦!
CGSize titleSize = [str sizeWithAttributes:@{NSFontAttributeName: [UIFont fontWithName:btn.titleLabel.font.fontName size:btn.titleLabel.font.pointSize]}]; titleSize.height = ;
titleSize.width += ; btn.frame = CGRectMake(, , titleSize.width, titleSize.height);
[view addSubview:btn];
4:解决部分文字样式不同的方法
NSRange range = [title rangeOfString:targetname];
NSMutableAttributedString *mutableTitle = [[NSMutableAttributedString alloc] initWithString:title];
[mutableTitle addAttribute:NSForegroundColorAttributeName value:COLOR_WORD_GRAY_2 range:NSMakeRange(, title.length)]; if (range.length>) {
[mutableTitle addAttribute:NSForegroundColorAttributeName value:HEXCOLOR(0xf7ab00) range:range];
NSInteger startIndex = range.location+range.length;
[mutableTitle addAttribute:NSForegroundColorAttributeName value:COLOR_WORD_GRAY_2 range:NSMakeRange(startIndex, title.length-startIndex)];
[mutableTitle addAttribute:NSFontAttributeName value:CHINESE_SYSTEM() range:NSMakeRange(, title.length)];
} self.titleLabel.attributedText=mutableTitle;
5:Masonry scrollview循环布局
@interface ScrollViewController () @property (nonatomic, strong) UIScrollView *scrollView; @end @implementation ScrollViewController - (void)viewDidLoad {
[super viewDidLoad]; self.scrollView = [[UIScrollView alloc] init];
self.scrollView.pagingEnabled = NO;
[self.view addSubview:self.scrollView];
self.scrollView.backgroundColor = [UIColor lightGrayColor]; CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
UILabel *lastLabel = nil;
for (NSUInteger i = ; i < ; ++i) {
UILabel *label = [[UILabel alloc] init];
label.numberOfLines = ;
label.layer.borderColor = [UIColor greenColor].CGColor;
label.layer.borderWidth = 2.0;
label.text = [self randomText]; // We must preferredMaxLayoutWidth property for adapting to iOS6.0
label.preferredMaxLayoutWidth = screenWidth - ;
label.textAlignment = NSTextAlignmentLeft;
label.textColor = [self randomColor];
[self.scrollView addSubview:label]; [label mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo();
make.right.mas_equalTo(self.view).offset(-); if (lastLabel) {
make.top.mas_equalTo(lastLabel.mas_bottom).offset();
} else {
make.top.mas_equalTo(self.scrollView).offset();
}
}]; lastLabel = label;
} [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view); // 让scrollview的contentSize随着内容的增多而变化
make.bottom.mas_equalTo(lastLabel.mas_bottom).offset();
}];
} - (UIColor *)randomColor {
CGFloat hue = ( arc4random() % / 256.0 ); // 0.0 to 1.0
CGFloat saturation = ( arc4random() % / 256.0 ) + 0.5; // 0.5 to 1.0, away from white
CGFloat brightness = ( arc4random() % / 256.0 ) + 0.5; // 0.5 to 1.0, away from black
return [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:];
} - (NSString *)randomText {
CGFloat length = arc4random() % + ; NSMutableString *str = [[NSMutableString alloc] init];
for (NSUInteger i = ; i < length; ++i) {
[str appendString:@"测试数据很长,"];
} return str;
} @end
6:Masonry remake更新约束
@interface RemakeContraintsController () @property (nonatomic, strong) UIButton *growingButton;
@property (nonatomic, assign) BOOL isExpanded; @end @implementation RemakeContraintsController - (void)viewDidLoad {
[super viewDidLoad]; self.growingButton = [UIButton buttonWithType:UIButtonTypeSystem];
[self.growingButton setTitle:@"点我展开" forState:UIControlStateNormal];
self.growingButton.layer.borderColor = UIColor.greenColor.CGColor;
self.growingButton.layer.borderWidth = ;
self.growingButton.backgroundColor = [UIColor redColor];
[self.growingButton addTarget:self action:@selector(onGrowButtonTaped:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.growingButton];
self.isExpanded = NO;
} - (void)updateViewConstraints {
// 这里使用update也是一样的。
// remake会将之前的全部移除,然后重新添加
[self.growingButton mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo();
make.left.right.mas_equalTo();
if (self.isExpanded) {
make.bottom.mas_equalTo();
} else {
make.bottom.mas_equalTo(-);
}
}]; [super updateViewConstraints];
} - (void)onGrowButtonTaped:(UIButton *)sender {
self.isExpanded = !self.isExpanded;
if (!self.isExpanded) {
[self.growingButton setTitle:@"点我展开" forState:UIControlStateNormal];
} else {
[self.growingButton setTitle:@"点我收起" forState:UIControlStateNormal];
} // 告诉self.view约束需要更新
[self.view setNeedsUpdateConstraints];
// 调用此方法告诉self.view检测是否需要更新约束,若需要则更新,下面添加动画效果才起作用
[self.view updateConstraintsIfNeeded]; [UIView animateWithDuration:0.3 animations:^{
[self.view layoutIfNeeded];
}];
} @end
7:UIPickerView的运用
引入<UIPickerViewDataSource, UIPickerViewDelegate> 初始化: self.pickArrayData=@[@"",@"",@"",@"",@"",@"",@"",@""]; if (!self.myPickView) {
self.myPickView=[[UIPickerView alloc]init];
self.myPickView.showsSelectionIndicator=YES; self.myPickView.dataSource = self;
self.myPickView.delegate = self;
[self addSubview:self.myPickView];
[self.myPickView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo();
make.right.mas_equalTo();
make.top.mas_equalTo(self.topView.bottom).with.offset();
make.height.mas_equalTo();
}]; } #pragma mark UIPickerViewDataSource, UIPickerViewDelegate // pickerView 列数
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return ;
} // pickerView 每列个数
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
return self.pickArrayData.count;
} // 每列宽度
- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component { return (SCREEN_WIDTH-)/;
}
// 返回选中的行
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
NSLog(@"%ld-%@",(long)component,[self.pickArrayData objectAtIndex:row]);
} //返回当前行的内容,此处是将数组中数值添加到滚动的那个显示栏上
-(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [self.pickArrayData objectAtIndex:row];
} 获取选中的内容: -(void)confirmAction
{
NSMutableString *result=[[NSMutableString alloc]init];;
NSInteger row1=[self.myPickView selectedRowInComponent:];
if (row1!=) {
[result appendFormat:@"%@房",[self.pickArrayData objectAtIndex:row1]];
} NSInteger row2=[self.myPickView selectedRowInComponent:];
if (row2!=) {
[result appendFormat:@"%@厅",[self.pickArrayData objectAtIndex:row2]];
} NSInteger row3=[self.myPickView selectedRowInComponent:];
if (row3!=) {
[result appendFormat:@"%@卫",[self.pickArrayData objectAtIndex:row3]];
} NSInteger row4=[self.myPickView selectedRowInComponent:];
if (row4!=) {
[result appendFormat:@"%@厨",[self.pickArrayData objectAtIndex:row4]];
} NSInteger row5=[self.myPickView selectedRowInComponent:];
if (row5!=) {
[result appendFormat:@"%@阳台",[self.pickArrayData objectAtIndex:row5]];
} self.selectedResult=[NSString stringWithString:result]; if (self.confirmButtonBlock) {
self.confirmButtonBlock(self.selectedResult);
}
}
8:汉字转为拼音
- (NSString *)Charactor:(NSString *)aString getFirstCharactor:(BOOL)isGetFirst
{
//转成了可变字符串
NSMutableString *str = [NSMutableString stringWithString:aString];
//先转换为带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
//再转换为不带声调的拼音
CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformStripDiacritics, NO);
NSString *pinYin = [str capitalizedString];
//转化为大写拼音
if(isGetFirst)
{
//获取并返回首字母
return [pinYin substringToIndex:];
}
else
{
return pinYin;
}
}
IOS开发基础知识--碎片37的更多相关文章
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- IOS开发基础知识--碎片33
1:AFNetworking状态栏网络请求效果 直接在AppDelegate里面didFinishLaunchingWithOptions进行设置 [[AFNetworkActivityIndicat ...
- IOS开发基础知识--碎片42
1:报thread 1:exc_bad_access(code=1,address=0x70********) 闪退 这种错误通常是内存管理的问题,一般是访问了已经释放的对象导致的,可以开启僵尸对象( ...
- IOS开发基础知识--碎片50
1:Masonry 2个或2个以上的控件等间隔排序 /** * 多个控件固定间隔的等间隔排列,变化的是控件的长度或者宽度值 * * @param axisType 轴线方向 * @param fi ...
- IOS开发基础知识--碎片3
十二:判断设备 //设备名称 return [UIDevice currentDevice].name; //设备型号,只可得到是何设备,无法得到是第几代设备 return [UIDevice cur ...
- IOS开发基础知识--碎片11
1:AFNetwork判断网络状态 #import “AFNetworkActivityIndicatorManager.h" - (BOOL)application:(UIApplicat ...
- IOS开发基础知识--碎片14
1:ZIP文件压缩跟解压,使用ZipArchive 创建/添加一个zip包 ZipArchive* zipFile = [[ZipArchive alloc] init]; //次数得zipfilen ...
- IOS开发基础知识--碎片16
1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断对象类型 -(BOO ...
- IOS开发基础知识--碎片19
1:键盘事件顺序 UIKeyboardWillShowNotification // 键盘显示之前 UIKeyboardDidShowNotification // 键盘显示完成后 UIKeyboar ...
随机推荐
- Eclipse开发工具组合键介绍
1. 编辑类 Ctrl + Q 跳到最后一次的编辑处 Ctrl + 1 快速修复提示 Alt + ↓ ...
- 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模
我们前2篇文章:一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍 和一起学微软Power BI系列-官方文档-入门指南(2)获取源数据 中,我们介绍了官方入门文档与获取 ...
- 【原创】开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【开源】OSharp框架解说系列(6.1):日志系统设计
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- (转)使用minicpan创建本地CPAN
在临时的办公场所网络不畅,有时不能下载cpan上的软件包,所有只能自建一个cpan. 这里使用了工具'minicpan',简单地说:就是把互联网上的CPAN搬到自己的电脑里,它的最初想法来自Randa ...
- EntityFramework 7 Linq Contains In 奇怪问题
这篇博文纪录一下:当使用 EF7,Linq 实现类似 where filename in('','','') SQL 代码,使用 Contains 出现报错问题. project.json 配置文件( ...
- 初识MongoDB
1. 初识 接触MongoDB,是由于最近在工作中用到了MongoDB做数据存储.之前也听说过这个NoSQL数据库,但是一直没有尝试去使用它做开发.这次趁着这个机会,想好好学习下这个NoSQL数据库. ...
- 使用签名来保证ASP.NET MVC OR WEBAPI的接口安全
当我们开发一款App的时候,App需要跟后台服务进行通信获取或者提交数据.如果我们没有完善的安全机制则很容易被别用心的人伪造请求而篡改数据. 所以我们需要使用某种安全机制来保证请求的合法.现在最常用的 ...
- mysql 日期函数总结
1.0 格式化:DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 语法 DATE_FORMAT(date,format) date 参数是合法的日期.format 规定日期/时间的 ...
- 流行ORM产品优缺点分析--EntityFramework、NHibernate、PetaPoco
什么是ORM? ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操 ...