无法在UITableViewCell中查看自定义标签

时间:2017-08-03 11:02:08

标签: ios objective-c uitableview user-interface

我有一项作业,我必须在表格视图中加载以下项目

  1. 图像
  2. 标题
  3. 描述
  4. 页脚视图是一个约5个点的简单水平黑色规则。

    但只有图像可见,而不是标题和描述。不知何故,其他视图被图像视图遮挡了。

    My Custom TableView Cell in Storyboard

    我的自定义tableview单元格实现

    #import <UIKit/UIKit.h>
    
    @interface MeowFestTableViewCell : UITableViewCell
    @property (strong, nonatomic) IBOutlet UILabel *titleLabel;
    @property (strong, nonatomic) IBOutlet UILabel *descriptionLabel;
    @property (strong, nonatomic) IBOutlet UIImageView *imageView;
    
    @end
    

    和实施

    #import "MeowFestTableViewCell.h"
    
    @implementation MeowFestTableViewCell
    
    - (void)awakeFromNib {
        [super awakeFromNib];
        // Initialization code
    }
    
    - (id)initWithCoder:(NSCoder *)aDecoder {
        self = [super initWithCoder:aDecoder];
        if (self) {
        }
        return self;
    }
    
    - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    
        if (self) {
    
        }
        return self;
    }
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
    
        // Configure the view for the selected state
    }
    
    @end
    

    我的视图控制器

    #import "MeowFestViewController.h"
    #import "MeowFestTableViewCell.h"
    
    @interface MeowFestViewController ()
    
    @property (nonatomic, assign) NSInteger page;
    
    @property (nonatomic, strong) NSMutableArray* feedItems;
    
    @property (nonatomic, strong) NSMutableData* responseData;
    
    @property (nonatomic, assign) CGPoint currentOffset;
    @property (strong, nonatomic) IBOutlet UITableView *tableView;
    
    @end
    
    @implementation MeowFestViewController
    
    -(void) awakeFromNib {
        [super awakeFromNib];
    }
    
    -(void) loadView {
        [super loadView];
        // Force load.
        UIView* view = self.view;
        self.page = 0;
        self.currentOffset = CGPointZero;
    
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.tableView setDelegate:self];
        [self.tableView setDataSource:self];
        self.meowFestProtocolDelegate = self;
        [self.meowFestProtocolDelegate getTheFeed:self.page];
    
    }
    
    #pragma mark - MeowFestProtocol
    
    -(void) getTheFeed:(NSInteger) page {
        NSString* url =
            [NSString stringWithFormat:@"https://chex-triplebyte.herokuapp.com/api/cats?page=%d", self.page];
        NSURL* nsUrl = [[NSURL alloc] initWithString:url];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:nsUrl];
        [request setHTTPMethod:@"GET"];
    
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                                completionHandler:
            ^(NSData *data, NSURLResponse *response, NSError *error) {
                    self.feedItems = [NSJSONSerialization JSONObjectWithData: data
                        options: NSJSONReadingMutableContainers error: &error];
                    [self.tableView reloadData];
                dispatch_semaphore_signal(semaphore);
            }];
    
        [task resume];
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
    }
    
    
    
    #pragma Table Arguments.
    -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    
    -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return [self.feedItems count] + 1; // (10 items  + 1 button)
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
        if (indexPath.row == 10) {
            return 50.0f;
        }
        return 300.0f;
    }
    
    -(UIView*) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
        UIView* footerView =
            [[UIView alloc] initWithFrame:CGRectMake(
                0, 0, CGRectGetWidth(self.view.bounds), 5)];
        [footerView setBackgroundColor:[UIColor blackColor]];
        return footerView;
    }
    
    -(CGFloat)
    tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
        return 5.0f;
    }
    -(UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        if (indexPath.row != 10) {
            MeowFestTableViewCell* tableViewCell = (MeowFestTableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"meowFestCell"];
            if (tableViewCell == nil) {
                tableViewCell = [[MeowFestTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"meowFestCell"];
            }
    
            NSDictionary* dict = (NSDictionary*) [self.feedItems objectAtIndex:(self.page * 10 + indexPath.row)];
            // Initialise the data.
            tableViewCell.titleLabel.text = (NSString*) [dict objectForKey:@"title"];
            [tableViewCell.titleLabel sizeToFit];
            tableViewCell.descriptionLabel.text = (NSString*) [dict objectForKey:@"description"];
            [tableViewCell.descriptionLabel sizeToFit];
            UIImage* catImage =
            [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[dict objectForKey:@"image_url"]]]];
    
            tableViewCell.imageView.image = catImage;
            return tableViewCell;
        } else {
            UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"loadMoreCell"];
            if (cell == nil) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"loadMoreCell"];
            }
            cell.backgroundColor = [UIColor colorWithRed:0.50 green:0.00 blue:0.50 alpha:1.0];
            return cell;
        }
    }
    
    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        // rows in section 0 should not be selectable
        if (indexPath.row == 10) {
            return indexPath;
        }
        return nil;
    }
    
    - (void) scrollViewDidScroll:(UIScrollView *)scrollView {
        CGPoint offset = scrollView.contentOffset;
        CGSize size = scrollView.contentSize;
        if (abs(size.height - offset.y) < 10) {
            self.currentOffset = offset;
        } else if (offset.y < self.currentOffset.y) {
            if (offset.y == 0) {
                self.page = 0;
                self.currentOffset = CGPointZero;
            }
        }
    }
    
    - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
        if (indexPath.row == [self.feedItems count]) {
            [self.meowFestProtocolDelegate getTheFeed:(self.page + 1)];
            self.page = self.page + 1;
            [self.tableView reloadData];
        }
    
    }
    
    
    
    /*
    #pragma mark - Navigation
    
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
    
    @end
    

    模拟器中的输出在Simulator Output and Analysis of Views

    下面给出

    更新

    我试图根据@ vadian的建议添加缺少的约束,但该选项对我来说是禁用的。

    Add Constraints disabledAll subviews selected

    更新#2 :@ vadian&#39; s设置两个UILabels的高度限制,但有没有办法不必硬编码UILabels的高度?我通过进行API调用来获取内容,因此我无法控制返回的文本。文本可以尽可能长。我已经设置了行数= 0而行换行模式= Word Break。

2 个答案:

答案 0 :(得分:1)

  • 点击表格视图单元格(图片视图和标签外)
  • ⌘A
  • 从右下方的菜单栏菜单Resolve Auto Layout Issues
  • 中选择

enter image description here

答案 1 :(得分:1)

要进行此设置,您需要为标签添加垂直间距约束。

  1. 在图像和顶部标签之间添加垂直间距约束。
  2. 在两个标签之间添加垂直间距约束。
  3. 在底部标签和包含视图底部之间添加垂直间距约束。
  4. 现在,在每个标签上,将垂直内容压缩阻力设置为1000,并将垂直内容设置为1000.这应该允许标签自动调整大小并适合其内容。
  5. 在您的表格视图中(在代码中)将estimatedRowHeight设置为您认为您的单元格将采用的某个值,并将rowHeight设置为UITableViewAutomaticDimension。这将告诉表视图将行高度基于单元格的高度。 (这又取决于其中所有内容的高度。有关详细信息,请参阅this answer。)
  6. 更多内容大小

    this article检查Hector Matos,它解释了内容拥抱优先级和内容压缩阻力的概念。除此之外,本文还包含来自a tweet

    的有用图形

    Compression Resistance vs Content Hugginh