iOS 控件像 android 一样隐藏和消失

Posted

技术标签:

【中文标题】iOS 控件像 android 一样隐藏和消失【英文标题】:iOS controls hide and gone like android 【发布时间】:2014-05-07 11:20:06 【问题描述】:

我在 UI 设计中使用了带有自动布局的情节提要。基本上在 android 中会有三个不同的属性,比如 VisibleInvisibleGone

例如:

   1) android:visibility="gone" // used to hide the control and as well as space
      (or)
      CONTROLNAME.setVisibility(View.GONE);
   2)  android:visibility="invisible" // used to hide the control but it will take space
      (or)
      CONTROLNAME.setVisibility(View.INVISIBLE);

ios 中,

objective-c

  1) ?
  2) [CONTROLNAME setHidden:TRUE]; // used to hide the control but it will take space

迅速

  1) ?
  2) CONTROLNAME.isHidden = true  // used to hide the control but it will take space

作为 iOS 中的 Gone 我已经从谷歌搜索但我无法找到解决方案。

【问题讨论】:

查看自动布局。签出:How to use auto-layout to move other views when a view is hidden? 我认为没有这样的功能,但你可以用相对视图的自动布局来做到这一点 虽然当视图(或控件)被移除时自动布局会帮助您布局其他视图,但自动布局本身并不能帮助您移除视图占用的“空间”。 看看@nevin chen 的解决方案,我认为这是您的案例的完美解决方案 实现这一点的唯一方法是在界面构建器中使用“堆叠视图” 【参考方案1】:

要删除视图(控件)占用的空间,可以将其框架的size 减少为零或将其从视图层次结构中删除。 IE。通过在控件上调用removeFromSuperview

例如,如果您必须删除UITextField(比如CONTROLNAME)占用的空间,那么您可以使用:

CGRect tempFrame = CONTROLNAME.frame;
CGSize currentSize = tempFrame.size; //for later use
tempFrame.size = CGSizeZero;
CONTROLNAME.frame = tempFrame;

CGRect currentFrame = CONTROLNAME.frame; //for later use
[CONTROLNAME removeFromSuperview];

更新:

在第一种情况下,您必须存储较早的大小才能将控件恢复到其初始位置。

CGRect tempFrame = CONTROLNAME.frame;
tempFrame.size = currentSize; //set to initial value
CONTROLNAME.frame = tempFrame;

在第二种情况下,您将必须存储控件的框架以将其带回其初始位置(如果它是局部变量或弱实例变量,则还包括控件本身)

CONTROLNAME.frame = currentFrame;

【讨论】:

回复你写的代码和你得到的o/p。否则任何人都很难帮助你。【参考方案2】:

以你的观点为例

@property (weak, nonatomic) IBOutlet SearchBarView *searchBar;

已经有一个约束。通过将约束拖到 .h file.ex 来添加新的 IBLayout:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *constraintSearBarHeight;

在任何你喜欢的地方做这个

self.constraintSearBarHeight.constant = 0;

如果您的视图还没有约束。我发现this answer 很有帮助。就在下面做

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.searchBar attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];

【讨论】:

我应该补充一点,Interface builder 用户对此并不感冒。您可以像从任何控件中一样从约束拖动到源代码,它会将您的约束链接到视图控制器中的相关属性 知道这非常有用,因为以编程方式尝试在 Xib 中查找特定约束有点像噩梦【参考方案3】:

删除子视图和调整框架都不适合我,因此作为替代解决方案,我以编程方式添加了一个自动调整差异的约束。

例如:如果您有 3 个视图,A_view B_view 和 C_view 以该顺序垂直对齐,并且您想“隐藏”B 并调整差异,请添加约束

B_view.removeFromSuperView()
var constr = NSLayoutConstraint(item: C_view, 
                                attribute: NSLayoutAttribute.Top, 
                                relatedBy: NSLayoutRelation.Equal, 
                                toItem: A_view, 
                                attribute: NSLayoutAttribute.Bottom,
                                multiplier: 1,
                                constant: 20)
view.addConstraint(constr)

常量是(在这种情况下)C_view 和 A_view 之间的垂直空间量

它对我有用,但需要了解约束

【讨论】:

界面生成器用户对此并不感冒。您可以像从任何控件中一样从约束拖动到源代码,它会将您的约束链接到视图控制器中的相关属性 知道这非常有用,因为以编程方式尝试在 Xib 中查找特定约束有点像噩梦

以上是关于iOS 控件像 android 一样隐藏和消失的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 - 切换控件后,即使在纵向模式下,旋转也会使状态栏消失

在颤动中,我可以使用Android或iOS小部件,就像反应原生一样

iOS 7,状态栏和导航栏:像 Reeder 一样使用侧面板隐藏或滑动

安卓开发中 滑动条(seekbar)控件显示异常,是否我的开发环境有问题,能设置吗?图如下:

c#winform如何画像vs一样的界面

如何隐藏Android库中的函数定义