iOS实现一个意见反馈类型的输入栏
前言
本文主要给大家介绍了关于利用iOS如何实现一个意见反馈类型的输入栏,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
要做个意见反馈,TextField只有一行,TextView没有提示,好尬,只有做一个了,就是使用TextView作为输入框,添加个label作为提示,这里的关键是输入内容的限制,我这里限制了120字,但是要考虑很多方面的东西,来看代码
示例代码
@property(nonatomic,strong)UILabel*placholderLabel;//提示字符串 @property(weak,nonatomic)IBOutletUITextView*infoTF; #defineMAX_LIMIT_NUMS120//文本最大长度 -(void)controlView{ self.infoTF.layer.borderWidth=0.5;//边宽 self.infoTF.layer.cornerRadius=5.0;//设置圆角 self.infoTF.layer.borderColor=[UIColorgrayColor].CGColor; self.infoTF.delegate=self; CGFloatwidth=self.infoTF.frame.size.width; self.placholderLabel=[[UILabelalloc]initWithFrame:CGRectMake(5,0,width-5,30)]; self.placholderLabel.numberOfLines=0; self.placholderLabel.text=setInternational(@"live.weibosummay.string"); self.placholderLabel.textColor=setRGBColor(176,176,176); self.placholderLabel.font=ZKP15Font; [self.placholderLabelsetHidden:NO]; [self.infoTFaddSubview:_placholderLabel]; } //限制文本输入长度 -(void)textViewDidChange:(UITextView*)textView{ if([textView.textlength]==0){ _placholderLabel.hidden=NO; }else{ _placholderLabel.hidden=YES;//这里给空 } UITextRange*selectedRange=[textViewmarkedTextRange]; //获取高亮部分 UITextPosition*pos=[textViewpositionFromPosition:selectedRange.startoffset:0]; //如果在变化中是高亮部分在变,就不要计算字符了 if(selectedRange&&pos){ return; } NSString*nsTextContent=textView.text; NSIntegerexistTextNum=nsTextContent.length; if(existTextNum>MAX_LIMIT_NUMS){ //截取到最大位置的字符(由于超出截部分在should时被处理了所在这里这了提高效率不再判断) NSString*s=[nsTextContentsubstringToIndex:MAX_LIMIT_NUMS]; [textViewsetText:s]; } } //设置超出最大字数(120字)即不可输入也是textview的代理方法 -(BOOL)textView:(UITextView*)textViewshouldChangeTextInRange:(NSRange)range replacementText:(NSString*)text{ UITextRange*selectedRange=[textViewmarkedTextRange]; //获取高亮部分 UITextPosition*pos=[textViewpositionFromPosition:selectedRange.startoffset:0]; //如果有高亮且当前字数开始位置小于最大限制时允许输入 if(selectedRange&&pos){ NSIntegerstartOffset=[textViewoffsetFromPosition:textView.beginningOfDocumenttoPosition:selectedRange.start]; NSIntegerendOffset=[textViewoffsetFromPosition:textView.beginningOfDocumenttoPosition:selectedRange.end]; NSRangeoffsetRange=NSMakeRange(startOffset,endOffset-startOffset); if(offsetRange.location=0){ returnYES; }else{ NSIntegerlen=text.length+caninputlen; //防止当text.length+caninputlen<0时,使得rg.length为一个非法最大正数出错 NSRangerg={0,MAX(len,0)}; if(rg.length>0){ NSString*s=@""; //判断是否只普通的字符或asc码(对于中文和表情返回NO) BOOLasc=[textcanBeConvertedToEncoding:NSASCIIStringEncoding]; if(asc){ s=[textsubstringWithRange:rg];//因为是ascii码直接取就可以了不会错 }else{ __blockNSIntegeridx=0; __blockNSString*trimString=@"";//截取出的字串 //使用字符串遍历,这个方法能准确知道每个emoji是占一个unicode还是两个 [textenumerateSubstringsInRange:NSMakeRange(0,[textlength]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString*substring,NSRangesubstringRange,NSRangeenclosingRange,BOOL*stop){ NSIntegersteplen=substring.length; if(idx>=rg.length){ *stop=YES;//取出所需要就break,提高效率 return; } trimString=[trimStringstringByAppendingString:substring]; idx=idx+steplen;//这里变化了,使用了字串占的长度来作为步长 }]; s=trimString; } //rang是指从当前光标处进行替换处理(注意如果执行此句后面返回的是YES会触发didchange事件) [textViewsetText:[textView.textstringByReplacingCharactersInRange:rangewithString:s]]; } returnNO; } }
总结
以上就是这篇文章的全部内容了,本文还有许多不足,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。