79

iOS 用のアプリを開発しており、AutoLayout をオンにして Storyboard を使用しています。私のView Controllerの1つには4つのボタンのセットがあり、特定の状況では最初のボタンを非表示にしたいと考えています。

このメソッドを使用するとsetHidden:TRUE、UIButton は非表示になりますが、それでも明らかにビュー内のスペースが必要です。その結果、埋めることができなかった「穴」ができて、残りの UIButton がメイン ビューの上部に向かって浮きます。

Android では単にView.GONE代わりに を使用View.INVISIBLEしていましたが、iOS ではこの動作に固執しており、唯一の解決策は手動で (つまりプログラムで) 残りの要素を一番上に移動することだとは信じたくありません。

Android のようにすべてを自動化するために何らかの制約を設定することができると思っていましたが、うまくいきませんでした。

Autolayout をオフにする前に、正しい方向を教えてもらえますか?

私は IB を使用していますが、プログラムによるものにも慣れています。

アップデート:

コンポーネントの高さを 0 に設定しても効果はありません。

私はこのようなことを試しました:

UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;
4

13 に答える 13

40

ビューの高さを 0 に設定する制約 (NSLayoutAttributeHeight) を追加すると、うまくいきました。

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]];
于 2014-03-26T19:06:03.023 に答える
20

この質問に対する回答はすべて非効率的です。iOS で Android の setVisibility:Gone メソッドに相当する最善の方法は、StackView最初にコンポーネントを選択し、次にエディタで埋め込み、Stack View、

新しいスタック ビューを IBOutlet に接続し、次に:

隠れた:

UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
        firstView.hidden = YES;

可視性:

UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0];
        firstView.hidden = NO;

スタック ビューを使用すると、すべての制約が保持されます。

書類

于 2016-09-25T12:47:04.567 に答える
8

iOS で Androids.GONE 機能を実現するには、UIStackView を使用します。その後、子を位置で非表示にします。(りんごのドキュメント)

スイフト 4:

let firstView = cell.rootStackView.arrangedSubviews[0]
    firstView.isHidden = true // first view gone

これは表のセルの例です。両方の内部を入れて、子のStack view項目を取得するだけです。GONE

ここに画像の説明を入力

于 2018-02-18T06:43:22.173 に答える
6

できることは、スタック ビューの下にビューをグループ化することです。次に、特定のビューを非表示にすると、残りのビューが自動的に移動してスペースを埋めます。

スタック ビューに関する Apple ドキュメントを参照してください: https://developer.apple.com/reference/uikit/uistackview

または次のようなオンライン チュートリアル: https://www.appcoda.com/stack-views-intro/

于 2017-02-05T05:03:26.660 に答える
1

https://github.com/tazihosniomar/LayoutManager

お役に立てば幸いです。

于 2014-05-13T15:33:10.350 に答える
1

1) ボタンが垂直に配置されているheight場合は、 を 0 に設定する必要があります。水平に配置されているボタンの場合は、 0 に設定widthするか、両方を 0 に設定してください。

また

button22)上に設定するこのアプローチを試すことができますbutton1

- (void)viewDidLoad
{
[super viewDidLoad];

UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button1 setTitle:@"hello" forState:UIControlStateNormal];

UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setTitle:@"world" forState:UIControlStateNormal];

[button1 sizeToFit]; [button2 sizeToFit];
[button2 setFrame:CGRectMake(button1.frame.origin.x, button1.frame.origin.y, button2.frame.size.width, button2.frame.size.height)];

[self.view addSubview:button1];
[self.view addSubview:button2];

}
于 2013-07-26T09:14:43.797 に答える
1

この質問はかなり古いものですが、私が見つけたクローゼットは追加の制約を設定することです(そのため、「なくなった」ビューの周りのビューは、欠落したときに何をすべきかを知っています)

A  which you want to be     A
|  after setting B to gone  |
B                           C
|                               
C                               
  1. C から A に低い優先順位 (750) の制約を設定します。
  2. B の上下の制約 (ビューを水平に折りたたむ場合は左右) を NSLayoutConstraint 配列に追加しbConstraintsます。これを行うには:
    1. 制約からViewControllerへのクリックアンドドラッグを制御します
    2. アウトレットからアウトレット コレクションへの接続の変更
    3. 名入れ用bConstraints
    4. 接続を押します。@IBOutlet var bConstraints: [NSLayoutConstraint]!これにより、ViewController にが作成されます
    5. 制約を追加するには: ストーリーボードの制約から @IBOutlet 変数名にドラッグします。
  3. 次にBを非表示にします

    B.hidden = true
    NSLayoutConstraint.deactivateConstraints(bConstraints)
    
  4. 再表示するには

    B.hidden = false
    NSLayoutConstraint.activateConstraints(bConstraints)
    

明らかに、ビューが増えるほど、各ビューから追加の制約が必要になるため、これはより複雑になります。

于 2017-01-06T21:59:52.273 に答える
0

Deniz によって提供された回答に基づいて、Swift で制約を使用したソリューションを次に示します。

例: 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 の間の垂直方向のスペースの量です

于 2015-02-25T04:30:18.000 に答える
0

ページ、またはページの少なくとも特定のセルをクリアして、全体を再定義することもできます。高速で、うまく機能します。私はコードを書きませんでしたが、私が取り組んでいるこの既存のプロジェクトで見つけました。すべてを管理するためのクラスを作成ManagementTableSectionします。ManagementTableCell申し訳ありませんが、より適切に定義されたコードを提供できません。

于 2014-09-17T14:38:39.063 に答える
0

「visible」と呼ばれるカスタム UIView 実装に新しいプロパティを追加しました。これを false に設定すると、ビューを折りたたむための制約が追加されます (リストが水平であるため、幅の制約のみを追加しましたが、最善の方法は、高さの制約も 0 です)。

var visible:Bool = true{
        didSet{
            if(visible){
                clipsToBounds = false;
                removeConstraint(hideConstraint!)
            }else{
                clipsToBounds = true
                addConstraint(hideConstraint!)
            }
        }
    }

ビューのゼロ幅制約を初期化し、フィールドとして追加する必要があります。

private var hideConstraint:NSLayoutConstraint?


func someInitFunction(){
    hideConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 0.0)
    ...
}
于 2015-02-25T13:32:58.610 に答える
0

私の調査が示しているように、AutoLayout でさえ役に立ちません。オプションで表示されるコンポーネントの影響を受けるビューを手動で置き換える必要があります (私の場合、オプション ビューの下部にあるすべてのビューですが、オプション ボタンの右側にあるすべてのボタンを処理するようにこれを適応させることができると確信しています) ):

- (IBAction)toggleOptionalView:(id)sender {
    if (!_expanded) {
        self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, _optionalHeight);
        self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y+_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
        _expanded = YES;
    } else {
        self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, 0);
        self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y-_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height);
        _expanded = NO;

    }
}

オプション コンポーネントの高さ/幅をハードコーディングしないことをお勧めします。そうしないと、XIB/ストーリーボードを編集するたびにコードが壊れます。viewDidLoadで設定したfloat _optionalHeightフィールドがあるので、常に最新です。

于 2014-03-14T10:05:44.973 に答える
-3

setHidden:TRUE/FALSE は、Android View.GONE/VISIBLE に最も近いものです。

表示されていない場合、ビューは必ずしもスペースを取るとは限りません!

ListView を他のビューの上に配置して ComboBox-Alike を作成しました。選択している間だけ表示されます:

ここに画像の説明を入力

于 2014-10-11T10:32:02.127 に答える