【问题标题】:How do you shrink a UIPickerView on the iPhone?如何在 iPhone 上缩小 UIPickerView?
【发布时间】:2010-10-28 16:54:10
【问题描述】:

我想在我的 iPhone 应用程序中降低 UIPickerView 的高度,以便它只显示一行和一列。选择器视图的高度应该等于一行的高度。

我正在使用 Interface Builder 构建 UIPickerView,但我找不到重新调整此控件大小的简单方法。

如何缩小UIPickerView

【问题讨论】:

  • 尝试 UIScrollView 并在代理的 didScroll: 方法中,如果滚动速度低于阈值,则执行捕捉。

标签: ios interface-builder uipickerview picker


【解决方案1】:

实际上,您可以通过对封闭视图应用仿射变换来稍微缩小整个 UIPickerView。例如:

CGSize pickerSize = [pickerView sizeThatFits:CGSizeZero];

pickerTransformView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, pickerSize.width, pickerSize.height)];
pickerTransformView.transform = CGAffineTransformMakeScale(0.75f, 0.75f);

[pickerTransformView addSubview:pickerView];
[self.view addSubview:pickerTransformView];
[pickerTransformView release];

通过将选取器放置在包含视图中并对该视图应用缩放变换,将其缩放到其原始大小的 75%。将转换直接应用于 UIPickerView 会导致不良的绘图伪影。

但是,您正在寻找的调整大小最好通过创建自定义控件来实现。

【讨论】:

  • +1 我从未想过将转换应用于超级视图!我一直试图将其应用于pickerview,但结果并不令人满意。如果可以的话,我会投票 10 次。
  • 旋转后,我无法将触摸事件发送到 PickerView。想法?
  • @mark - 您确定选择器及其周围的视图仍在其包含视图的范围内吗?如果它们在 superview 之外,触摸事件将不会到达它们。
  • 解决了所有问题 - IB 中的一些连接不正确。谢谢布拉德 - 你摇滚!
  • Apple 可以接受UIPickerView 上的这种转换吗?
【解决方案2】:

这是可能的,而且很容易!

只需以纯文本格式打开 nib 文件,然后找到选取器视图并调整度量:

<object class="IBUIPickerView" id="783900772">
<reference key="NSNextResponder" ref="191373211"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{85, 68}, {150, 116}}</string>

就是这样!

【讨论】:

  • 当我在此处添加您所写的粗体文本时,没有任何反应。于是我修改了下一项-->NSFrameSize为{320, 116}(原为320, 216)。这行得通。
  • 我建议将 "NSFrameSize" 设置为 {320, 130},因为这将显示前 3 行,包括选择器的指示器。但副作用是这不会显示选择器的底部框架,用户除了前 3 行之外什么都看不到。
  • 这对我没有任何改变。
  • 对我不起作用...此方法仅在界面 xib 中更改高度,但在运行时选择器视图保持不变...:-(
【解决方案3】:

如果您使用故事板和/或自动布局,user2248258 的答案实际上有效。在那里,我想按照 Nilambar 的建议添加屏幕截图。

  1. 在另一个容器视图中放置你想要的尺寸

  2. 检查clipSubviews 以获取容器视图

  3. 在该容器视图中将选择器水平和垂直居中对齐,同时为尾随和前导位置提供零约束

这样,选择器视图会被剪裁到正确的大小(不会调整大小)。

结果:

【讨论】:

  • 这是一个很棒的建议,很适合我的样子。
【解决方案4】:

在 Interface Builder 中创建一个简单的 UIView。设置所需的位置和大小,添加约束。选中“剪辑子视图”复选框。然后将 Picker View 作为子视图拖放到此视图中。为选取器添加约束以在容器内水平和垂直对齐。应该做的工作。

【讨论】:

  • 一些带有解释的例子会很棒。
  • 不幸的是,我的 Stackoverflow 帐户的“声誉”不允许我上传图片。如果您愿意,我可以将详细信息邮寄给您。
【解决方案5】:

据我所知,缩了就乱了。

a) UITableView+UIPickerView
我建议您使用“UITableView+UIPickerView 中的一行来执行此操作。您可以像 Windows 中的 dropDownList 一样在 tableView 中使用一行,当您点击该行时将显示pickerView(最初隐藏)。

b) 如果 tableView 中有很长的数据列表,并且只有一个 item 需要选择数据,则应使用以下方法滚动视图(确保计算 pickerView 的原始位置,因为它会一起向上/向下移动) :


-(void)setViewMove:(BOOL)moveUP offset:(CGFloat)offset
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    CGRect rect = self.view.frame;

    if(moveUP)
    {
        rect.origin.y-=offset;
        rect.size.height+=offset;
    }
    else    //move down
    {
        rect.origin.y+=offset;
        rect.size.height-=offset;
    }
    self.view.frame = rect;
    [UIView commitAnimations];
}

c) 您还可以为选择器添加另一个视图,并在您选择某些内容后返回此视图。

我的结论是:
如果 tableView 中只有几行,请使用 a.
如果您在 tableView 中有很多行但只有其中一个需要选择器,请使用 b。
如果您在 tableView 中有很多行并且其中很多需要选择器,请使用 c。

【讨论】:

  • 有没有办法像我们在网页中看到的那样创建一个下拉选择器
  • 在网页中,下拉列表最初是由Windows平台上的其他工具创建的。 Safari 为查看 dropDownList 添加了一个独特的控件,但 Apple 并未将其添加到 xcode。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多