iOS 의견 피드백 형식의 입력 표시 줄 구현

머리말
본 고 는 주로 iOS 를 이용 하여 의견 피드백 유형 을 어떻게 실현 하 는 지 에 대한 입력 란 을 소개 하고 참고 학습 을 제공 합 니 다.다음은 더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 해 보 겠 습 니 다.
의견 피드백 을 하려 면 TextField 는 한 줄 밖 에 없습니다.TextView 는 힌트 가 없습니다.좋 습 니 다.하나만 할 수 있 습 니 다.바로 TextView 를 입력 상자 로 하고 label 을 추가 하 는 것 입 니 다.여기 서 관건 은 입력 내용 의 제한 입 니 다.저 는 120 자 를 제 한 했 지만 여러 가지 고려 를 해 야 합 니 다.코드 를 보 세 요.
예제 코드

@property (nonatomic, strong) UILabel *placholderLabel; //      
@property (weak, nonatomic) IBOutlet UITextView *infoTF;
 
#define MAX_LIMIT_NUMS 120 //      
 
- (void)controlView {
 self.infoTF.layer.borderWidth = 0.5;//  
 self.infoTF.layer.cornerRadius = 5.0;//    
 self.infoTF.layer.borderColor =[UIColor grayColor].CGColor;
 self.infoTF.delegate = self;
 
 CGFloat width = self.infoTF.frame.size.width;
 
 self.placholderLabel = [[UILabel alloc] 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.placholderLabel setHidden:NO];
 [self.infoTF addSubview:_placholderLabel];
}
 
//        
- (void)textViewDidChange:(UITextView*)textView{
 if([textView.text length] == 0){
  _placholderLabel.hidden = NO;
 }else{
  _placholderLabel.hidden = YES;//    
 }
 
 UITextRange *selectedRange = [textView markedTextRange];
 //      
 UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];
 //             ,        
 if (selectedRange && pos) {
  return;
 }
 
 NSString *nsTextContent = textView.text;
 NSInteger existTextNum = nsTextContent.length;
 
 if (existTextNum > MAX_LIMIT_NUMS){
  //          (        should                   )
  NSString *s = [nsTextContent substringToIndex:MAX_LIMIT_NUMS];
  
  [textView setText:s];
 }
}
//        (120 )        textview     
- (BOOL)textView:(UITextView*)textView shouldChangeTextInRange:(NSRange)range
 replacementText:(NSString*)text{
 
 UITextRange *selectedRange = [textView markedTextRange];
 //      
 UITextPosition *pos = [textView positionFromPosition:selectedRange.start offset:0];
 
 //                         
 if (selectedRange && pos) {
  NSInteger startOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.start];
  NSInteger endOffset = [textView offsetFromPosition:textView.beginningOfDocument toPosition:selectedRange.end];
  NSRange offsetRange = NSMakeRange(startOffset, endOffset - startOffset);
  
  if (offsetRange.location < MAX_LIMIT_NUMS) {
   return YES;
  }else{
   return NO;
  }
 }
 
 NSString *comcatstr = [textView.text stringByReplacingCharactersInRange:range withString:text];
 
 NSInteger caninputlen = MAX_LIMIT_NUMS - comcatstr.length;
 
 if (caninputlen >= 0){
  return YES;
 }else{
  NSInteger len = text.length + caninputlen;
  //   text.length + caninputlen < 0 ,  rg.length           
  NSRange rg = {0,MAX(len,0)};
  
  if (rg.length > 0){
   NSString *s = @"";
   //           asc (         NO)
   BOOL asc = [text canBeConvertedToEncoding:NSASCIIStringEncoding];
   if (asc) {
    s = [text substringWithRange:rg];//   ascii           
   }else{
    __block NSInteger idx = 0;
    __block NSString *trimString = @"";//      
    //       ,           emoji    unicode    
    [text enumerateSubstringsInRange:NSMakeRange(0, [text length])
           options:NSStringEnumerationByComposedCharacterSequences
          usingBlock: ^(NSString* substring, NSRange substringRange, NSRange enclosingRange, BOOL* stop) {
           
           NSInteger steplen = substring.length;
           if (idx >= rg.length) {
            *stop = YES; //      break,    
            return ;
           }
           
           trimString = [trimString stringByAppendingString:substring];
           
           idx = idx + steplen;//     ,               
          }];
    
    s = trimString;
   }
   //rang              (              YES   didchange  )
   [textView setText:[textView.text stringByReplacingCharactersInRange:range withString:s]];
  }
  return NO;
 }
}
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 고 는 아직도 부족 합 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기