user3222991 user3222991 - 4 months ago 29
iOS Question

how to adjust UITextview height based on String dynamically in ios

I have a simple

textView
who's data gets populated dynamically. I want to resize the height of the textview once the data is populated so that I don't see a vertical scroll nor the text gets clipped.I want to do this task programatically. I have a label which should be placed 20 px below height of textview like "interested".I am trying to making the code.But i got some problems like Alignment issues. If i can run the program the output will display like this.

enter image description here

this is my Program.please help me anybody.

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];

Answer

go through below code hope helps u

  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;


 }