【问题标题】:Smooth scaling when adding/removing subviews to/from a UIView向/从 UIView 添加/删除子视图时平滑缩放
【发布时间】:2011-01-07 03:02:39
【问题描述】:

我正在使用 UIView 的子类(以编程方式)包含和管理许多要彼此相邻放置的子视图(主要是 UIImageViews),这样没有一个重叠。可以安全地假设子视图都具有相同的高度(最初绘制时),但宽度不同。容器可能会调整大小,在这种情况下,我希望子视图按比例缩放。此外,有时我需要添加/删除/编辑任何给定的子视图(这可能会改变其宽度)。

我在使用方面取得了一些成功:

[self setAutoresizesSubviews:YES];
[self setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin  |
                               UIViewAutoresizingFlexibleWidth       |
                               UIViewAutoresizingFlexibleRightMargin |
                               UIViewAutoresizingFlexibleTopMargin   |
                               UIViewAutoresizingFlexibleHeight      |
                               UIViewAutoresizingFlexibleBottomMargin)];

让容器在其框架发生变化时自动调整其子视图的大小。

不幸的是,当子视图的内容发生变化时,我在处理这种情况时遇到了很多麻烦,导致它变宽或收缩。简单地设置“setNeedsLayout”并为子视图定义“layoutSubviews”似乎并不能解决问题,因为在“layoutSubviews”的开头,子视图的框架尚未调整。如果我强制它,那么当前的内容会被拉伸或收缩,这看起来很糟糕。

如果有人能解释在这种情况下应该如何使用 sizeToFit、layoutSubviews、sizeThatFits:、setAutoresizesSubviews:、setAutoresizingMask: 和 setContentMode:,我将不胜感激。我的意思是,如果我想调整子视图的内容(并扩大它),那么我该怎么做:

  • 子视图被加宽(没有不利地拉伸或自动调整其中的任何其他内容)
  • 容器按比例加宽
  • 其他子视图均不受影响

?

提前致谢!

【问题讨论】:

    标签: iphone uikit uiview


    【解决方案1】:

    对于调整视图大小的动画,请执行以下操作:

    [UIView beginAnimations:@"resizeAnimation" context:nil];
    youView.frame = newFrame;
    [UIView commitAnimations];
    

    如果您不希望元素自动调整大小,只需将其 autoresize 设置为 UIViewAutoresizingNone

    如果我正确理解了您的情况,您不希望容器及其子视图自动调整大小,但您提到的子视图除外。该视图应该启用一些自动调整大小选项(我不确切知道您想要的那些,只需尝试一些并查看它们的效果)。该子视图也应该禁用其子视图调整大小。

    【讨论】:

      【解决方案2】:

      我最终选择了手动路线,使用 sizeThatFits: 和 layoutSubviews 来明确控制所有内容的重绘和组织方式。我发现 setAutoresizesSubviews: 和 setAutoresizingMask: 有助于简单的布局,但如果我尝试任何不典型的东西,就很难调试。

      我的建议:第一次尝试编程布局时,请为所有(子)视图定义 sizeThatFits,并为每个视图定义 layoutSubviews。使用调试语句记录所有内容的位置。一旦您感到满意,请考虑将自动调整大小合并到您的代码中(如果可能的话)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 2017-07-13
        相关资源
        最近更新 更多