0

我创建了一个从 xib 文件加载的自定义视图,如下所示:

- (id)initWithFrame:(CGRect)frame {
  self = [super initWithFrame:frame];
  if (self) {
    // Initialization code.
    [[NSBundle mainBundle] loadNibNamed:@"TachoView" owner:self options:nil];
    [self addSubview:self.view];
    [self initUi];
  }
  return self;
}

当设备方向发生变化时,我现在遇到一些子视图的自动调整大小和定位问题。这些屏幕截图描述了行为。

viewDidLoad 之后一切看起来都很好:

在此处输入图像描述

旋转到横向模式后,布局仍然很好:

在此处输入图像描述

但是当旋转回纵向时,它看起来像这样:

在此处输入图像描述

如果我在单视图虚拟项目中测试它们,相同的文件 .h、.m 和 .xib 可以正常工作。所以我认为,在xib中定位和调整大小的设置是可以的。我的应用程序的不同之处在于,该视图位于具有其他几个视图的滚动视图上。在方向更改时,我会更改所有这些视图的大小,以便按预期布局所有内容。相关代码是最里面的for循环:

-(void) viewWillLayoutSubviews {
    float h = self.view.frame.size.height;
    float w = self.view.frame.size.width;

    // set the size of the vertical scrollview
    verticalView.frame = CGRectMake(0, 0, w, h * gridHeight);
    verticalScrollView.frame = CGRectMake(0, 0, w, h);
    [verticalScrollView setContentSize:CGSizeMake(w, h * gridHeight)];
    [verticalScrollView layoutIfNeeded];

    // set the size of the horizontal scrollviews
    for (int i=0; i<verticalView.subviews.count; i++) {
        UIScrollView *scrollView = (UIScrollView *) [verticalView.subviews objectAtIndex:i];
        UIView *container = (UIView *) [[scrollView subviews] objectAtIndex:0];
        int subviewCount = container.subviews.count;
        scrollView.frame = CGRectMake(0, h*i, w, h);
        [scrollView setContentSize:CGSizeMake(w * subviewCount, h)];
        container.frame = CGRectMake(0, 0, w * subviewCount, h);

        // set the size of the actual views
        for (int j=0; j<container.subviews.count; j++) {
            UIView *view = [container.subviews objectAtIndex:j];
            // FIXME manchmal crashed hier die WebView. Muss das hier im
            // ui thread ausgeführt werden? wird diese methode nicht vom
            // ui thread aufgerufen?
            view.frame = CGRectMake(w*j, 0, w, h);
        }
    }
}

任何想法,第二个方向改变出了什么问题?我可以手动布局整个视图,但我认为自动调整大小功能也可以。

4

1 回答 1

0

确保 UIViewAutoresizingMask 设置如下

1) Liegezeiten 标签是flexibleWidth

2) Wert in % 标签只需要有flexibleTopMargin,flexibleWidth 和flexibleRightMargin

3)下面的数字标签(64、40、20):

  • 64 应该有flexibleTopMargin、flexibleWidth 和flexibleRightMargin
  • 40 应该有flexibleTopMargin、flexibleWidth、flexibleRightMargin、flexibleLeftMargin
  • 20 应该有flexibleTopMargin、flexibleWidth、flexibleLeftMargin
于 2012-08-02T14:26:54.863 回答