2015-02-04 2 views
3

Я рисую довольно простой пользовательский UITableViewCell - миниатюру слева, имя и метки ссылок справа. Я хочу, чтобы мои имена и метки ссылок были однострочными, обрезая хвост, если тексты превышают ширину ячейки. Я уверен, что я правильно добавляю свои ограничения, но мои имена и метки ссылок не будут их соблюдать.Подсмотры UITableViewCell не соблюдают ограничения Autolayout

Это то, что клетки выглядят так же как на iPhone 4S работает IOS 8:

enter image description here

В моем коде, я добавляю в 10 пунктов косого ограничение для имен и ссылок меток на надтаблицы (ячейка contentView), и все же обратите внимание, что даже в условиях ландшафта iOS, похоже, не соблюдает ограничения.

Может ли кто-нибудь показать мне, что я делаю неправильно? Это мой код для всей ячейки. Я создаю представления программно, и у меня есть ограничения Autolayout в инициализаторе ячейки таблицы.

#import "PopularWikiCell.h" 

// Models 
#import "Wiki.h" 

// Pods 
#import "UIImageView+AFNetworking.h" 

// Constants 
static const CGFloat kPadding = 10; 
static const CGFloat kImageSize = 100; 
const CGFloat kPopularWikiCellHeight = kImageSize + kPadding * 2; 

@interface PopularWikiCell() 

@property (nonatomic, strong) UIImageView *thumbnailView; 
@property (nonatomic, strong) UILabel *nameLabel; 
@property (nonatomic, strong) UILabel *linkLabel; 

@end 

@implementation PopularWikiCell 

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 
     // Initialise the subviews. 
     _thumbnailView = [[UIImageView alloc] init]; 
     _thumbnailView.contentMode = UIViewContentModeScaleAspectFill; 
     _thumbnailView.clipsToBounds = YES; 

     _nameLabel = [[UILabel alloc] init]; 
     _nameLabel.backgroundColor = [UIColor blueColor]; 
     _nameLabel.numberOfLines = 1; 
     _nameLabel.lineBreakMode = NSLineBreakByTruncatingTail; 
     _nameLabel.text = @"Name"; 

     _linkLabel = [[UILabel alloc] init]; 
     _linkLabel.backgroundColor = [UIColor redColor]; 
     _linkLabel.text = @"Link"; 
     _linkLabel.numberOfLines = 1; 
     _linkLabel.lineBreakMode = NSLineBreakByTruncatingTail; 

     // Add the subviews. 
     [self.contentView addSubview:_thumbnailView]; 
     [self.contentView addSubview:_nameLabel]; 
     [self.contentView addSubview:_linkLabel]; 

     _thumbnailView.translatesAutoresizingMaskIntoConstraints = NO; 
     _nameLabel.translatesAutoresizingMaskIntoConstraints = NO; 
     _linkLabel.translatesAutoresizingMaskIntoConstraints = NO; 
     self.contentView.translatesAutoresizingMaskIntoConstraints = NO; 

     // Add the layout constraints. 

     NSDictionary *metrics = @{@"kPadding" : @(kPadding), 
            @"kImageSize" : @(kImageSize)}; 
     NSDictionary *views = @{@"thumbnailView" : _thumbnailView, 
           @"nameLabel" : _nameLabel, 
           @"linkLabel" : _linkLabel}; 

     NSArray *constraints = @[@"H:|-kPadding-[thumbnailView(kImageSize)]-kPadding-[nameLabel]-kPadding-|", 
           @"H:[thumbnailView]-kPadding-[linkLabel]-kPadding-|", 
           @"V:|-kPadding-[nameLabel]-0-[linkLabel]", 
           @"V:|-kPadding-[thumbnailView(kImageSize)]"]; 

     [self.contentView addConstraintsFromVisualFormatStrings:constraints 
                 options:0 
                 metrics:metrics 
                  views:views]; 
    } 
    return self; 
} 

- (void)setWiki:(Wiki *)wiki 
{ 
    _wiki = wiki; 

    self.thumbnailView.image = nil; 
    self.thumbnailView.backgroundColor = [UIColor darkGrayColor]; 
    __weak typeof(self) weakSelf = self; 
    [self.thumbnailView setImageWithURLRequest:[NSURLRequest requestWithURL:wiki.thumbnailURL] 
           placeholderImage:nil 
             success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
              __strong typeof(self) strongSelf = weakSelf; 
              strongSelf.thumbnailView.image = image; 
              strongSelf.thumbnailView.backgroundColor = [UIColor whiteColor]; 
             } 
             failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { 

             }]; 

    self.nameLabel.text = wiki.name; 
    self.linkLabel.text = wiki.URL; 

    [self.contentView setNeedsLayout]; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 

    // Selection removes all background colors so re-set it. 
    [self resetSubviewBackgroundColors]; 

    [self.contentView setNeedsLayout]; 
} 

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated 
{ 
    [super setHighlighted:highlighted animated:animated]; 

    // Highlighing removes all background colors so re-set it. 
    [self resetSubviewBackgroundColors]; 

    [self.contentView setNeedsLayout]; 
} 

- (void)resetSubviewBackgroundColors 
{ 
    if (self.thumbnailView.image) { 
     self.thumbnailView.backgroundColor = [UIColor whiteColor]; 
    } else { 
     self.thumbnailView.backgroundColor = [UIColor darkGrayColor]; 
    } 
} 

@end 
+0

Вы добавляете ограничение в IB? – YuviGr

+0

@YuviGr Привет, нет. Все мои взгляды и подпрограммы создаются программно в этом приложении. –

+0

, тогда вам нужно рассчитать длину строки, плохо ответить – YuviGr

ответ

9

Проблема скрыта в

self.contentView.translatesAutoresizingMaskIntoConstraints = NO; 

удаления этого кода исправляет проблему.

если вы не хотите traslate Autoresizing Mask Into Constraints - установите желаемые ограничения для cell.contentView.

0

Сначала я настоятельно рекомендую использовать autolayout, он решает много проблем размера и много вычислений

Но, если вы не установив ограничения, то вы должны вычислить длину строки, чтобы соответствовать ширина метки, которую вы хотите

NSString *string = @"this is a very long string to fit into a UILabel"; 
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 50, 150, 20)]; 
UIFont *font = [UIFont fontWithName:@"Helvetica Neue" size:15.0]; 
label.font = font; 
label.text = string; 
CGSize stringSize = [string sizeWithAttributes:@{NSFontAttributeName : font}]; 

// check if the string is wider then the label 
if (stringSize.width > label.bounds.size.width) { 
    NSString *newString = [string substringWithRange:NSMakeRange(0, string.length/2)]; <---- i just divided the string into two ----- 
    // check if the newString fits the label 
    // if not the divide again 

    label.text = newString; 
}else{ 
    label.text = string; 
} 
[self.view addSubview:label]; 

как я написал в коде, я просто разделил строку на две строки. Это может не сработать, если у вас очень длинная строка, поэтому вам нужно продолжать проверять строку в соответствии с меткой.

Вы можете использовать:

[NSString stringWithFormat:@"%@...", [string substringToIndex:20]]; 

добавить "..." в конце строки

1

В вашем cellForRow: метод убедитесь, что вы звоните:

cell = [tableView dequeueReusableCellWithReuseIdentifier:@"" forIndexPath:(IndexPath *) 

, вызывающий это возвращает ячейку правильного размера (важно для автоотключения)

если это не исправит i т, внутри клетки реализовать:

-(void)layoutSubview{ 
    [super layoutSubviews]; 

    [self layoutIfNeeded]; 
} 
0

Привет, вы можете попробовать это в пользовательских UITableViewCell, установить рамку представления содержимого или этикетки или каких-либо элементов, используя их: -

В декларации: -

GRect usableSpace; 
CGFloat usableWidth, usableHeight; 

В реализации: -

usableSpace = [[UIScreen mainScreen] applicationFrame]; 
usableWidth = usableSpace.size.width; 
usableHeight = usableSpace.size.height; 

, а затем установить рамку с помощью этих ширина и высота

0

Я не могу загрузить ваше изображение, поэтому я не уверен, какая у вас проблема.

Я вижу этот код, есть ли опечатка?

NSArray *constraints = 
@[ 
@"H:|-kPadding-[thumbnailView(kImageSize)]-kPadding-[nameLabel]-kPadding-|", 
@"H:[thumbnailView]-kPadding-[linkLabel]-kPadding-|", //this line you forgot the left edge 
@"V:|-kPadding-[nameLabel]-0-[linkLabel]", 
@"V:|-kPadding-[thumbnailView(kImageSize)]" 
]; 
Смежные вопросы