iOS 控件像 android 一样隐藏和消失
Posted
技术标签:
【中文标题】iOS 控件像 android 一样隐藏和消失【英文标题】:iOS controls hide and gone like android 【发布时间】:2014-05-07 11:20:06 【问题描述】:我在 UI 设计中使用了带有自动布局的情节提要。基本上在 android 中会有三个不同的属性,比如 Visible、Invisible 和 Gone。
例如:
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 一样使用侧面板隐藏或滑动