iOS 7 - 动态调整标签高度和滚动视图

时间:2014-02-05 06:46:57

标签: ios objective-c resize label scrollview

Sooo ...我在使用iOS7 / xcode5上的scrollview和fit文本标签时遇到了问题,我对此问题感到沮丧,因为在iOS6 / xcode4上很容易处理这个...

以下是我的代码预览......

ViewController.h

#import <UIKit/UIKit.h>
#import "ViewControllerOther.h"

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITableView *tableview;

@property (strong, nonatomic) NSArray *meepo;
@property (strong, nonatomic) NSArray *icon;

@property (strong, nonatomic) NSArray *taunt;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.tableview setDataSource:self];
    [self.tableview setDelegate:self];

    self.meepo = [[NSArray alloc] initWithObjects:
                    @"Meepo No. 1",
                    @"Meepo No. 2",
                    @"Meepo No. 3",
                    @"Meepo No. 4",
                    @"Meepo No. 5",
                    nil];
    self.icon = [[NSArray alloc] initWithObjects:
                   [UIImage imageNamed:@"meepo.jpg"],
                   [UIImage imageNamed:@"meepo.jpg"],
                   [UIImage imageNamed:@"meepo.jpg"],
                   [UIImage imageNamed:@"meepo.jpg"],
                   [UIImage imageNamed:@"meepo.jpg"],
                   nil];

    self.taunt = [[NSArray alloc] initWithObjects:
                 @"Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, Meepo No. 1 reporting, ",
                 @"Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, Meepo No. 2 reporting, ",
                 @"Meepo No. 3 reporting, Meepo No. 3 reporting, Meepo No. 3 reporting, Meepo No. 3 reporting, Meepo No. 3 reporting, Meepo No. 3 reporting, Meepo No. 3 reporting, Meepo No. 3 reporting, Meepo No. 3 reporting, Meepo No. 3 reporting, Meepo No. 3 reporting, ",
                 @"Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, Meepo No. 4 reporting, ",
                 @"Meepo No. 5 reporting, Meepo No. 5 reporting, Meepo No. 5 reporting, Meepo No. 5 reporting, Meepo No. 5 reporting, Meepo No. 5 reporting, Meepo No. 5 reporting, Meepo No. 5 reporting, Meepo No. 5 reporting, Meepo No. 5 reporting, Meepo No. 5 reporting, ",
                 nil];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.meepo count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }

    NSString *meepos = [self.meepo objectAtIndex:indexPath.row];
    UIImage *icon = [self.icon objectAtIndex:indexPath.row];
    [cell.textLabel setText:meepos];
    cell.imageView.image = icon;
    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    ViewControllerOther *other = [self.storyboard instantiateViewControllerWithIdentifier:@"Delegate"];
    other.meepono = [self.meepo objectAtIndex:indexPath.row];
    other.index = [self.taunt objectAtIndex:indexPath.row];

    [self.navigationController pushViewController:other animated:YES];
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

ViewControllerOther.h

#import <UIKit/UIKit.h>

@interface ViewControllerOther : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *meepo;
@property (weak, nonatomic) IBOutlet UILabel *taunt;
@property (weak, nonatomic) IBOutlet UIScrollView *scroller;

@property (nonatomic, strong) NSString *meepono;
@property (nonatomic, strong) NSString *index;

@end

ViewControllerOther.m(*)

#import "ViewControllerOther.h"

@interface ViewControllerOther ()

@end

static CGRect size;
static CGSize maxSize;
static CGRect labelRect;

@implementation ViewControllerOther

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.meepo setText:self.meepono];

    [self.scroller setScrollEnabled:YES];



    labelRect = [self.taunt frame];
}

- (void)viewWillAppear:(BOOL)animated
{

}

-(void)viewWillLayoutSubviews
{
    [self.taunt setNumberOfLines:0];
    [self.taunt setText:self.index];
    maxSize = CGSizeMake(self.taunt.frame.size.width, MAXFLOAT);
    size = [self.taunt.text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:self.taunt.font} context:nil];

    labelRect.size.height = size.size.height;

    [self.taunt setFrame:labelRect];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (IBAction)sample:(id)sender {
    [self.scroller setContentSize:CGSizeMake(320, 1000)];
}
@end

这是输出

1st - http://i.imagefra.me/b52js8zk

第二名 - http://i.imagefra.me/313js8zl

我在第二个视图上的目标是根据文本的长度动态调整标签的高度,同时调整滚动视图的高度并使其可滚动...

注意: 这只是我做的一个示例项目,所以我可以问这些问题。

更新1:

好的,所以我设法通过将代码从viewDidLoad方法转移到viewWillLayoutSubviews方法来使调整大小标签工作,但不幸的是,当我将[self.scroller setContentSize:CGSizeMake(320, 1000)];标签恢复到正常大小时。我错过了什么吗?

1 个答案:

答案 0 :(得分:13)

要使UILabel符合其内容,请使用 sizeToFit

1)将行数设置为零yourLabel.numberOfLines = 0; //重要的事情

2)设置文本调用sizeToFit [YourLabel sizeToFit];

3)这将根据其内容动态调整标签的高度。

UILabel *testLabel = [[UILabel alloc]initWithFrame:CGRectMake(0,0,320,100)];
testLabel.numberOfLines = 0;
testLabel.text = @"add your string here";
[testLabel sizeToFit];

现在您可以使用label的高度动态设置scrollview的ContentSize。

[self.scroller setContentSize:CGSizeMake(self.scroller.frame.size.width,testLabel.frame.size.height)];

希望这会对你有帮助..