在scrollview中自动调整自定义视图

时间:2012-08-02 14:16:21

标签: ios uiview autoresizingmask

我创建了一个自定义视图,它是从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之后,一切看起来都很好:

enter image description here

旋转到横向模式后,布局仍然正常:

enter image description here

但是当转回到protrait时,它看起来像这样:

enter image description here

如果我在单个视图虚拟项目中测试它们,相同的文件.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);
        }
    }
}

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

1 个答案:

答案 0 :(得分:0)

确保UIViewAutoresizingMasks设置如下

1)Liegezeiten标签是flexibleWidth

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

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

  • 64应该有flexibleTopMargin,flexibleWidth和 flexibleRightMargin
  • 40应该有flexibleTopMargin,flexibleWidth, flexibleRightMargin,flexibleLeftMargin
  • 20应该有flexibleTopMargin,flexibleWidth, flexibleLeftMargin