0

我有一个自定义视图:

-(id)initWithFrame:(CGRect)frame
{
    CGRect frameRect = CGRectMake(0, NAVIGATION_BAR_HEIGHT , frame.size.width, 4 * ROW_HEIGHT + NAVIGATION_BAR_HEIGHT + MESSAGE_BODY_PADDING);
    self = [super initWithFrame:frameRect];
    if (self) {
        _selectionViewWidth = &frame.size.width;

        [self initView];
    }
    return self;
}

-(void)initView
{
    CGRect sectionSize = CGRectMake(0, 0 , *(_selectionViewWidth), ROW_HEIGHT * 4);
    _selectionView = [[UIView alloc] initWithFrame:sectionSize];
    [_selectionView setBackgroundColor:[UIColor clearColor]];

我在视图控制器中使用的下一种方式:

_mailAttributesView = [[MailAttributesView alloc]initWithFrame:self.view.frame];
    _mailAttributesView.delegate = self;
    [self.view addSubview:_mailAttributesView];

因此,当方向从 P 变为 LI 时,会出现下一个问题:

在此处输入图像描述

获取方向更改回调并重绘我的自定义视图的最佳方法是什么?

4

1 回答 1

1

您可能需要覆盖您的UIView layoutSubviews方法并继续在那里手动布局您的子视图(看起来像 to/from/cc/subject 控件)。

或者,您可以更好地配置子视图 spring/struts(或自动布局约束)以进行自动布局。您可以在代码中或通过 nib 或故事板执行此操作。

编辑:附加信息,因为您似乎没有在方向更改时获得 layoutSubviews。

我的猜测是 viewcontroller-view 也没有调整 MailAttributes 视图的大小/重新定位。

也不清楚将 MailAttributesView 添加到 veiwcontroller 视图的时间/位置。如果您在 viewDidLoad 中执行此操作,您的 viewcontroller 视图可能有也可能没有有效的帧大小(取决于它是否从笔尖加载)。在 viewDidLoad 中最好不要依赖 viewcontroller-view 框架来进行布局。

相反,在 viewWillLayoutSubviews 中布局任何 viewcontroller-view 子视图。那里将设置您的 viewcontroller-view 框架。

其他人可能会指出,您可以在 viewDidLoad 中为任何子视图设置 autoresizingFlags,但有一些问题。主要是如果父视图的大小为零,并且您的子视图将被插入但定义了弹簧/支柱以将它们粘合到父视图边缘。

整体 IMO 的最佳解决方案是为视图控制器视图中包含的所有内容设置自动布局约束。

于 2013-08-09T19:43:35.957 回答