【问题标题】:iOS equivalent to View.GONEiOS 相当于 View.GONE
【发布时间】:2014-09-02 15:27:01
【问题描述】:

是否有与 Android View.GONE 等效的 iOS 版本?

在 Android 中,将视图设置为 GONE 会使其不可见,并确保视图不会占用布局中的任何空间。我知道在 iOS 上,您可以使用

将视图设置为隐藏
[viewName setHidden:true];

但是视图仍然占用布局中的空间,我认为完全删除视图并稍后重新创建它会效率低下。

(注意:我看过这篇文章:iOS equivalent for Android View.GONE visibility mode,但没有可接受的答案,并且将高度设置为 0 对我不起作用,因为在我的视图被删除后页面上的后续视图没有改变)

【问题讨论】:

  • 那篇文章可能会给你一个想法。 LinkIsHere

标签: android ios uiviewcontroller autolayout hidden


【解决方案1】:

constant = 0 的宽度/高度约束添加到your View 将使your View 的宽度和高度= 0(喜欢它GONE

// set the height constraint to 0 
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:theGoneView
                                                                   attribute:NSLayoutAttributeHeight
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:nil
                                                                   attribute:NSLayoutAttributeNotAnAttribute
                                                                  multiplier:1.0
                                                                    constant:0]];

// set the width constraint to 0            
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:theGoneView
                                                               attribute:NSLayoutAttributeWidth
                                                               relatedBy:NSLayoutRelationEqual
                                                                  toItem:nil
                                                               attribute:NSLayoutAttributeNotAnAttribute
                                                              multiplier:1.0
                                                                constant:0]];

在斯威夫特中

// set the width constraint to 0
let widthConstraint = NSLayoutConstraint(item: theGoneView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0)
view.addConstraint(widthConstraint)

// set the height constraint to 0        
let heightConstraint = NSLayoutConstraint(item: theGoneView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0)
    view.addConstraint(heightConstraint)

或者这个 UIView 扩展

extension UIView {        

    func goAway() {
        // set the width constraint to 0
        let widthConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0)
        superview!.addConstraint(widthConstraint)

        // set the height constraint to 0
        let heightConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0)
        superview!.addConstraint(heightConstraint)
    }

}

希望有帮助

【讨论】:

  • 很好的答案!!!顺便说一句,“theGoneView”是一个想要消失的视图的名称。
  • @Phan Van Linh 我使用了相同的代码,但它不起作用...stackoverflow.com/questions/45454992/…
  • 如果我想看到视图我会怎么做?
【解决方案2】:

只有可能的等价物可以是 AFAIK:

[yourView removeFromSuperview]

在您从superview 中的superview 中删除view 之前,它会占用布局中的空间。

因此,根据您的需要,您可以在需要时添加或删除视图(与 android 中的 view.GONE 相同)。

【讨论】:

  • 感谢您的回复。我尝试添加这个,但似乎 removeView 下面的视图没有上移。这是我需要包含的其他内容吗?
  • 好的,要向上移动视图,您必须手动移动它们,或者您可以尝试使用Auto Layout 功能。删除视图后;将其下方view 的位置更改为等于移除视图高度的上方。检查此链接以移动视图:http://stackoverflow.com/questions/5161096/simple-way-to-change-the-position-of-uiview
【解决方案3】:

我目前正在使用 Swift 在 Android 和 iOS 之间进行转换,这是我遇到的第一个问题。在网上搜索后发现有些人通过将UIView的高度或宽度设置为0,效果很好,这取决于您是希望视图垂直消失还是水平消失。为了在我的应用中实现这个想法,我定义了两个函数,如下所示:

enum Direction {
    case HORIZONTAL, VERTICAL
}

func removeView(view: UIView, direction: Direction) {
    // Removing the view vertically
    if direction == .VERTICAL {
        let constraint = NSLayoutConstraint(item: view as UIView,
                                            attribute: NSLayoutAttribute.Height,
                                            relatedBy: .Equal,
                                            toItem: nil,
                                            attribute: NSLayoutAttribute.NotAnAttribute,
                                            multiplier: 0,
                                            constant: 0)
        view.addConstraint(constraint)
    } else { // Removing the view horizontally
        let constraint = NSLayoutConstraint(item: view as UIView,
                                            attribute: NSLayoutAttribute.Width,
                                            relatedBy: .Equal,
                                            toItem: nil,
                                            attribute: NSLayoutAttribute.NotAnAttribute,
                                            multiplier: 0,
                                            constant: 0)
        view.addConstraint(constraint)
    }
}

// Removing the view both horizontally and vertically
func removeView(view: UIView) {
    let constraintH = NSLayoutConstraint(item: view as UIView,
                                            attribute: NSLayoutAttribute.Height,
                                            relatedBy: .Equal,
                                            toItem: nil,
                                            attribute: NSLayoutAttribute.NotAnAttribute,
                                            multiplier: 0,
                                            constant: 0)
    let constraintW = NSLayoutConstraint(item: view as UIView,
                                            attribute: NSLayoutAttribute.Width,
                                            relatedBy: .Equal,
                                            toItem: nil,
                                            attribute: NSLayoutAttribute.NotAnAttribute,
                                            multiplier: 0,
                                            constant: 0)
    view.addConstraint(constraintH)
    view.addConstraint(constraintW)
}

它似乎在模拟器上工作。希望这会有所帮助。

【讨论】:

    【解决方案4】:

    对我来说最干净的解决方案是将要“移动”的组件嵌入到UIStackView(iOS 9.0+)中,然后通过在所需的UIView 上设置UIView.isHidden = true,您可以完全实现@ 987654324@ 效果,因为UIStackView 包装了内容并自动对其子视图大小的变化做出反应。

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 2018-02-09
      • 2012-09-14
      • 1970-01-01
      • 2015-06-06
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多