【问题标题】:Evenly spaced UIButtons in UIScrollViewUIScrollView 中均匀分布的 UIButtons
【发布时间】:2014-08-23 19:53:40
【问题描述】:

有没有一种简单的方法可以在 iOS 中的 UIScrollView 上将两个 UIButton 水平均匀地隔开?

例如查看图片。请注意按钮在横向上是如何变宽的。

我想要:

  1. 用于填充所有可用水平空间的按钮。
  2. 拥有等宽按钮。
  3. 不让 UIScrollView 水平滚动。
  4. 从纵向翻转到横向时自动调整大小。
  5. 最好只使用 Interface Builder 约束,但如有必要,我会使用代码。

【问题讨论】:

  • 您使用的是自动布局,还是老式的弹簧和支柱?
  • 自动布局。 IOS 7。 Xcode 5.

标签: ios uiscrollview uibutton interface-builder constraints


【解决方案1】:

由于您使用的是 autoLayout,它应该相当简单:

首先,您需要确保在两个按钮上都设置了顶部、底部、前导和尾随约束。 (请记住,您的前导和尾随约束在这里很重要。您可能需要调整顶部和底部间距约束,以便按钮的高度不会在旋转时调整大小。)

完成后,使用 cmd+click 选择两个按钮,然后单击该框以添加另一个自动布局约束,并选择“等宽”:

编辑:我最初的示例是在 UIView 中制作的,我最初并没有认为 UIScrollView 的 contentSize 是由其子视图中的最后一个元素决定的。 Here is a related question regarding handling autolayout for a UIScrollView in landscape. 一旦您能够在旋转时修改滚动视图的 contentSize,按钮上的自动布局应该可以工作。

【讨论】:

  • 做到了。但这会导致 UIScrollView 水平滚动。按钮变宽了,显然 UIScrollView 内容大小变宽了。切换到横向时,按钮不会调整大小。 (每个按钮都有四个约束,加上上面提到的等宽约束。)
  • 我已根据您的 cmets 编辑了我的初始回复。如果提供的链接有帮助,请告诉我。
  • 设置 UIScrollView contentSize 没有帮助。它只是剪辑第二个按钮,因此您无法滚动到它的右边缘。我在想你不能将任何东西限制在 UIScrollView 的右边缘。换句话说,您不能强制子视图移动到 UIScrollView 的右边缘。这是不正确的吗?我错过了一些简单的方法吗?
  • 我上周四继续研究这个问题,但在假期周末之前无法提出一个可行的例子。通常我会说尝试将按钮放在与滚动视图的 contentView 大小相同的容器视图中。但是,我仍然无法让容器在旋转时正确调整大小。如果我想出一个可行的例子,我会告诉你的。
  • 我使用代码重新定位按钮,因为我认为视图不能被限制在 UIScrollView 的右边缘。我可能错了。我希望这是一个 100% 的 IB 解决方案,但代码有效。
【解决方案2】:

我最终使用了下面这样的代码,因为我找不到将视图限制在 UIScrollView 右侧或底部的方法。这样的约束似乎只设置了滚动视图的 contentSize,而不是移动或调整子视图的大小。

+ (void)resizeBtnsHorz:(UIButton*)btn1 Button2:(UIButton*)btn2
{
    if (btn1 == nil || btn2 == nil || btn1.superview == nil || btn2.superview == nil || btn1.superview != btn2.superview)
        return;

    int nSideMargins = 0;
    int nSpaceBetween = 10;
    int nTotalWidth = btn1.superview.frame.size.width;
    int nBtnSpace = nTotalWidth - (nSideMargins*2) - nSpaceBetween;
    int nBtnWidth = nBtnSpace / 2;

    // Remove from view so we can set new frame rects
    // Autolayout prevents this, so the buttons must be removed and readded
    UIView* view1 = btn1.superview;
    [btn1 removeFromSuperview];
    [btn2 removeFromSuperview];
    [btn1 setTranslatesAutoresizingMaskIntoConstraints:YES];
    [btn2 setTranslatesAutoresizingMaskIntoConstraints:YES];

    // Button 1
    CGRect rBtn = btn1.frame;
    rBtn.origin.x = nSideMargins;
    rBtn.size.width = nBtnWidth;
    btn1.frame = rBtn;

    // Button 2
    rBtn = btn2.frame;
    rBtn.origin.x = nSideMargins + nBtnWidth + nSpaceBetween;
    rBtn.size.width = nBtnWidth;
    btn2.frame = rBtn;

    [view1 addSubview:btn1];
    [view1 addSubview:btn2];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多