当超级视图更改大小时,UILabel位置未调整

时间:2018-11-14 17:01:48

标签: ios objective-c xcode uitableview layout

我对iOS和Objective-C还是陌生的。

我一直在尝试以编程方式生成的UITableView才能正常工作。该表使用了一个自定义UITableViewCell,位于它自己的xib文件MeetingsTableViewCell中。

.xib的外观如下:

.xib file

日期字段的约束:

date field constraints

这是运行时的外观:

simulation

日期和会议模式图标/标签在模拟中距离右侧太远了55点(?)。

主视图控制器的宽度为320(我似乎无法更改该宽度)。 .xib的宽度为375(我似乎也无法更改)。 55分。巧合?我猜不是。

当我使用调试视图层次结构时,我发现“单元包装视图”为375点。我添加了以下代码(可能超出了所需的数量,但我只是在尝试一切以查看是否可以解决):

cell.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
cell.autoresizesSubviews = true;
cell.cellWrapperView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
cell.cellWrapperView.autoresizesSubviews = true;

我还确保在layoutIfNeeded文件中有MeetingsTableCellView.m,并添加了用于调整cellWrapperView大小的代码

-(void)layoutIfNeeded {
    [super layoutIfNeeded];
    self.cellWrapperView.frame=self.contentView.bounds;
}

这样可以将视图正确调整为320,但是没有移动日期和会议模式图标/标签。

现在,调试视图如下所示:

Debug View

TableCellView及其内部的所有全角物件宽320点。根据调试视图,日期和会议模式图标/标签(正确)宽68点。 X位置是297。我不知道如何将日期和会议模式图标/标签放置在正确的位置。

作为一个旁注,如果我将手机转到横向,这些宽度都是375而不是320,但是现在不应该是568吗?

谢谢!

编辑:创建表的代码。

self.meetings=meetings;
self.meetingsTable=[[UITableView alloc] initWithFrame:self.tableWrapperView.bounds];
 self.meetingsTable.delegate = self;
 self.meetingsTable.dataSource = self;
 self.meetingsTable.autoresizesSubviews = true;
 self.meetingsTable.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
 self.tableWrapperView.autoresizesSubviews = true;

 UINib *cellNib=[UINib nibWithNibName:@"MeetingCellView" bundle:nil];
 [self.meetingsTable registerNib:cellNib forCellReuseIdentifier:@"MeetingsCell"];
 [self.meetingsTable reloadData];
 [self.tableWrapperView addSubview:self.meetingsTable];

1 个答案:

答案 0 :(得分:3)

我认为您使事情变得有些复杂。

对于一个,您不需要“ cellWrapperView”- # Python 3.6, line 378 in `multiprocessing.pool.py` if chunksize is None: chunksize, extra = divmod(len(iterable), len(self._pool) * 4) if extra: chunksize += 1 if len(iterable) == 0: chunksize = 0 做不到的任何目的。

第二,对于单元格布局,您在单元格类中不需要任何代码。

我做了一个快速测试,按照您的意愿(大约)布置了电池:

enter image description here

这是结果(我经常使用背景色来帮助查看元素框架):

enter image description here enter image description here

仅通过此代码即可完成...

contentView

//
//  MeetingsTableViewCell.h
//

#import <UIKit/UIKit.h>

@interface MeetingsTableViewCell : UITableViewCell

@property (strong, nonatomic) IBOutlet UILabel *theTitleLabel;
@property (strong, nonatomic) IBOutlet UILabel *theSubTitleLabel;
@property (strong, nonatomic) IBOutlet UILabel *theDateLabel;
@property (strong, nonatomic) IBOutlet UIImageView *theImageView;
@property (strong, nonatomic) IBOutlet UILabel *theModeLabel;

@end

//
//  MeetingsTableViewCell.m
//

#import "MeetingsTableViewCell.h"

@implementation MeetingsTableViewCell

@end

//
//  TableXIBViewController.h
//

#import <UIKit/UIKit.h>

@interface TableXIBViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@end

并且,为了帮助正确放置单元xib,这是xib的来源:

//
//  TableXIBViewController.m
//
//  Created by Don Mag on 11/14/18.
//

#import "TableXIBViewController.h"
#import "MeetingsTableViewCell.h"

@interface TableXIBViewController ()

@property UITableView *meetingsTable;
@property UIView *tableWrapperView;

@end

@implementation TableXIBViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.view.backgroundColor = [UIColor redColor];

    // inset the table wrapper view by 20-pts so we can see its frame
    self.tableWrapperView = [[UIView alloc] initWithFrame:CGRectInset(self.view.frame, 20, 20)];
    self.tableWrapperView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    [self.view addSubview:self.tableWrapperView];

    self.meetingsTable = [[UITableView alloc] initWithFrame:self.tableWrapperView.bounds];
    self.meetingsTable.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

    self.meetingsTable.dataSource = self;
    self.meetingsTable.delegate = self;

    [self.tableWrapperView addSubview:self.meetingsTable];

    UINib *cellNib = [UINib nibWithNibName:@"MeetingCellView" bundle:nil];
    [self.meetingsTable registerNib:cellNib forCellReuseIdentifier:@"MeetingsCell"];

}

- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    MeetingsTableViewCell *cell = [self.meetingsTable dequeueReusableCellWithIdentifier:@"MeetingsCell" forIndexPath:indexPath];

    cell.theTitleLabel.text = [NSString stringWithFormat:@"Meeting Title %li", indexPath.row + 1];
    cell.theSubTitleLabel.text = [NSString stringWithFormat:@"Meeting SubTitle %li", indexPath.row + 1];
    cell.theDateLabel.text = [NSString stringWithFormat:@"2018/01/0%li", indexPath.row + 1];

    return cell;
}

- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return  5;
}

@end