【问题标题】:Autoresizing of a custom view in a scrollview在滚动视图中自动调整自定义视图的大小
【发布时间】:2012-08-02 14:16:20
【问题描述】:

我创建了一个自定义视图,它是从 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);
        }
    }
}

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

【问题讨论】:

  • 发布您的 .xib 的屏幕截图会有所帮助。
  • 标签是您的 TachoView 的子视图吗?或者这两种观点之间的层次结构中是否存在另一种观点?
  • 其实层次结构是 NavigationView -> Scrollview (vertical) -> Scrollview (horizo​​ntal) -> TachoView -> Container view (for background color) -> labels

标签: ios uiview autoresizingmask


【解决方案1】:

确保 UIViewAutoresizingMask 设置如下

1) Liegezeiten 标签是flexibleWidth

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

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

  • 64 应该有 flexibleTopMargin、flexibleWidth 和 灵活的RightMargin
  • 40 应该有flexibleTopMargin、flexibleWidth、 灵活的RightMargin,灵活的LeftMargin
  • 20 应该有flexibleTopMargin、flexibleWidth、 灵活的LeftMargin

【讨论】:

  • 我不确定这些值在界面生成器中是什么,所以我以编程方式设置它们。不幸的是没有任何效果。此外,有关 IB 设置的一些屏幕截图,请参阅我上面的评论。谢谢。
  • 还请注意,完全相同的文件在单视图应用程序中按预期工作。所以我的设置应该是对的,还是?
  • 您是否在不使用 UIViewAutoresizingmasks 的情况下以编程方式进行所有大小调整和重新定位?
  • 调整大小仅在 TachoView 本身上完成。子视图没有被触及。它们应根据 TachoView 的大小变化自动调整大小/定位。
  • 我不确定它哪里出错了,但我猜它在 viewWillLayoutSubviews 中出错了,这对于您的计算来说可能太早/太晚了。或者,当您执行“for (int j=0; j 时,您的子视图并没有真正按照您的想法编入索引
猜你喜欢
  • 2013-03-08
  • 2011-11-21
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2014-06-28
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多