如何在ios中动态调整基于String的UITextview高度

时间:2014-02-24 09:36:06

标签: ios iphone objective-c uitextview

我有一个简单的textView动态填充数据的人。我想在填充数据后调整textview的高度,以便我看不到垂直滚动,也不会剪切文本。我想以编程方式执行此任务。我有一个标签应该放在文本视图高度20 px之下,比如“感兴趣”。我正在尝试制作代码。但是我遇到了像Alignment问题这样的问题。如果我可以运行该程序,输出将显示如下。

enter image description here

这是我的Program.please帮助我任何人。

 lblHobbies = [[UILabel alloc]initWithFrame:CGRectMake(10, 310, 300, 20)];

 lblHobbies.text=@"Hobbies";

 lblHobbies.font=[UIFont systemFontOfSize:16.0];

 lblHobbies.textColor=[UIColor colorWithRed:153.0f/255.0f green:153.0f/255.0f blue:153.0f/255.0f alpha:1];

 [scrollView addSubview:lblHobbies];

 lblInterests = [[UILabel alloc]initWithFrame:CGRectMake(10, 420, 300, strSize.height+30)];

 lblInterests.text=@"Interests";

 lblInterests.font=[UIFont systemFontOfSize:16.0];

 lblInterests.textColor=[UIColor colorWithRed:153.0f/255.0f green:153.0f/255.0f blue:153.0f/255.0f alpha:1];

 [scrollView addSubview:lblInterests];

 NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:14]};

 CGRect rect =
         [tViewhobbies.text boundingRectWithSize:CGSizeMake(300, MAXFLOAT)
                                         options:NSStringDrawingUsesLineFragmentOrigin
                                      attributes:attributes
                                         context:nil];

 tViewhobbies=[[UITextView alloc]init];

 tViewhobbies.frame=CGRectMake(10, 330,300, rect.size.height);

 [tViewhobbies setUserInteractionEnabled:NO];

 tViewhobbies.backgroundColor=[UIColor colorWithRed:0.662745 green:0.662745 blue:0.662745 alpha:0.5];

 tViewhobbies.delegate=self;

 [scrollView addSubview:tViewhobbies];

 NSDictionary *attributes1 = @{NSFontAttributeName: [UIFont systemFontOfSize:14]};

 CGRect rect1 =
         [tViewInterests.text boundingRectWithSize:CGSizeMake(300, MAXFLOAT)
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                        attributes:attributes1
                                           context:nil];

 tViewInterests=[[UITextView alloc]init];

 tViewInterests.frame=CGRectMake(10, 450, 300, rect1.size.height);

 [tViewInterests setUserInteractionEnabled:NO];

 tViewInterests.backgroundColor=[UIColor colorWithRed:0.662745 green:0.662745 blue:0.662745 alpha:0.5];

 tViewInterests.delegate=self;

 [scrollView addSubview:tViewInterests];

5 个答案:

答案 0 :(得分:4)

通过以下代码希望帮助你

  self.scrollView.contentSize = CGSizeMake(320, 700);
  UILabel *lblHobbies = [[UILabel alloc]initWithFrame:CGRectMake(self.scrollView.bounds.origin.x + 2, self.scrollView.bounds.origin.y + 2, 75, 40)];
  lblHobbies.text=@"Hobbies";
  lblHobbies.font=[UIFont systemFontOfSize:16.0];
  lblHobbies.textColor=[UIColor colorWithRed:153.0f/255.0f green:153.0f/255.0f blue:153.0f/255.0f alpha:1];

  [self.scrollView addSubview:lblHobbies];


  //add this after the hobbies textview so u need to calculate the height, so wy dont you put some helper method that returns the height for the text
  //i took some long text that u want to display
  NSString *str = @"BARCELONA, Spain -- Nokia is targeting emerging markets with three low-cost smartphones that use Google's Android operating system rather than the Windows Phone software from Microsoft, which is about to buy Nokia's phone business";


  CGSize hobbiesTextViewSize = [self calculateHeightForString:str];
  //now set the hobbiesTextView frame and also the text
  UITextView *tViewhobbies = [[UITextView alloc]initWithFrame:CGRectMake(self.scrollView.bounds.origin.x + 2, self.scrollView.bounds.origin.y + 40, hobbiesTextViewSize.width, hobbiesTextViewSize.height+ 5)];
  tViewhobbies.font = [UIFont systemFontOfSize:17.0f];
  tViewhobbies.text = str;//set the text hear
  [self.scrollView addSubview:tViewhobbies];

  //now add the lblInterests label
  UILabel *lblInterests = [[UILabel alloc]initWithFrame:CGRectMake(self.scrollView.bounds.origin.x + 2, self.scrollView.bounds.origin.y + lblHobbies.frame.size.height + hobbiesTextViewSize.height + 2, 75, 40)];
 lblInterests.text=@"Interests";

 lblInterests.font=[UIFont systemFontOfSize:16.0];

 lblInterests.textColor=[UIColor colorWithRed:153.0f/255.0f green:153.0f/255.0f blue:153.0f/255.0f alpha:1];
 [self.scrollView addSubview:lblInterests];


 NSString *str1 = @"Nokia will ditch many of the Google services that come with Android, which Google lets phone makers customize at will. Instead, the new Nokia X line announced Monday will emphasize Microsoft services such as Bing search, Skype communications and OneDrive file storage. Its home screen sports larger, resizable tiles resembling those on Windows phone.";

   //now calculate the height for Interests text
  CGSize interestTextViewSize = [self calculateHeightForString:str1];
  UITextView *tViewInterests = [[UITextView alloc]initWithFrame:CGRectMake(self.scrollView.bounds.origin.x + 2, self.scrollView.bounds.origin.y + lblHobbies.frame.size.height + lblInterests.frame.size.height + tViewhobbies.frame.size.height + 4, interestTextViewSize.width + 2, interestTextViewSize.height+ 2)];
  tViewInterests.font = [UIFont systemFontOfSize:17.0f];
  tViewInterests.text = str1;
  [self.scrollView addSubview:tViewInterests];



}

 //our helper method
 - (CGSize)calculateHeightForString:(NSString *)str
{
   CGSize size = CGSizeZero;

UIFont *labelFont = [UIFont systemFontOfSize:17.0f];
NSDictionary *systemFontAttrDict = [NSDictionary dictionaryWithObject:labelFont forKey:NSFontAttributeName];

NSMutableAttributedString *message = [[NSMutableAttributedString alloc] initWithString:str attributes:systemFontAttrDict];
CGRect rect = [message boundingRectWithSize:(CGSize){320, MAXFLOAT}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];//you need to specify the some width, height will be calculated
size = CGSizeMake(rect.size.width, rect.size.height + 5); //padding

return size;


 }

答案 1 :(得分:1)

我是这样做的:

+(CGFloat)getLabelDymanicHeightOfStringWithText:(NSString *)text andFont:(UIFont *)font andFrame:(CGRect )frame {
     CGSize maxSize = CGSizeMake(frame.size.width, 999999.0);
     int height = 0;

 NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                       font, NSFontAttributeName,
                                       nil];

 if (IS_IOS_6)//iOS 6 macro
 {
     CGSize size = [text sizeWithFont:font
                          constrainedToSize:maxSize
                              lineBreakMode:NSLineBreakByWordWrapping];
     height = size.height;
 }
 else
 {
     CGRect frame = [text boundingRectWithSize:maxSize
                                             options:NSStringDrawingUsesLineFragmentOrigin
                                          attributes:attributesDictionary
                                             context:nil];
     height = frame.size.height;
 }

 return height+5; 
}

将此方法传递给文本文本字体和框架。

答案 2 :(得分:0)

您可以使用自定义UITextView来解决问题:

请查看:https://github.com/HansPinckaers/GrowingTextView

Textview将根据用户的输入字符串动态设置高度。

希望,这会对你有帮助,

:)

答案 3 :(得分:0)

在此处输入代码您可以使用标签。

myLabel.text = @"Your String";
CGSize labelSize = [myLabel.text sizeWithFont:myLabel.font 
                            constrainedToSize:CGSizeMake(320,MAX_HEIGHT_YOU_WANT_TO_SET) 
                                lineBreakMode:NSLineBreakByWordWrapping];
CGRect frame = myLabel.frame;
frame.size.height = labelSize.height;
myLabel.frame = frame;

答案 4 :(得分:0)

您只需将textView的高度更改为textView.contentSize.height的高度即可。这样做,textView将更新并显示它包含的所有文本。

textView.frame = CGRectMake(textView.frame.origin.x, textView.frame.origin.y, textView.frame.size.width,textView.contentSize.height);

希望这会对你有所帮助。 快乐编码:)