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 ...
随机推荐
- .NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化
所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件:http://www.cnblo ...
- 创建 flat network - 每天5分钟玩转 OpenStack(87)
上一节我们讨论了 flat network 的原理,今天就来创建 "flat_net" 并分析底层网络的实现. 打开菜单 Admin -> Networks,点击 “Crea ...
- ASP.NET MVC之国际化(十一)
前言 在项目中遇到国际化语言的问题是常有的事情,之前在做关于MVC国际化语言时,刚开始打算全部利用AngularJS来实现,但是渐渐发现对于页面Title难以去控制其语言转换,于是对于页面Tiltle ...
- EntityFramework之异步、事务及性能优化(九)
前言 本文开始前我将循序渐进先了解下实现EF中的异步,并将重点主要是放在EF中的事务以及性能优化上,希望通过此文能够帮助到你. 异步 既然是异步我们就得知道我们知道在什么情况下需要使用异步编程,当等待 ...
- Mac OSX网络诊断命令
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 下面是一些Mac OSX下常用的网络诊断命令.它们能帮助我们发现网络问题.文中提到 ...
- Expression Template(表达式模板,ET)
1.前言 在前一篇文章自己实现简单的string类中提到在实现+操作符重载函数时,为了防止返回时生成的临时对象调用拷贝构造函数动态申请内存空间,使用了一个叫move的函数,它是C++0x新增的特性.既 ...
- 制作动画或小游戏——CreateJS基础类(一)
前面曾经记录过Canvas的基础知识<让自己也能使用Canvas>,在实际使用中,用封装好的库效率会高点. 使用成熟的库还能对基础知识有更深入的理解,CreateJS是基于HTML5开发的 ...
- 让自己也能使用Canvas
<canvas> 是 HTML5 新增的元素,可使用JavaScript脚本来绘制图形.例如:画图,合成照片,创建动画甚至实时视频处理与渲染. 兼容性方面,除了一些骨灰级浏览器IE6.IE ...
- 3d效果的图片轮播
CSS3的3d变换 CSS3给我们提供了一个新的功能,那就是3d变换.3d变换和2d变换的基本API函数类似,只不过多了些在Z轴上的操作,不难使用. 但是,为了让元素拥有3d变换的功能,我们需要给他的 ...
- java多线程--定时器Timer的使用
定时的功能我们在手机上见得比较多,比如定时清理垃圾,闹钟,等等.定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术. Time类主要负责完成定时计划任务的功能,就是在指定 ...