Android View.GONE 가시성 모드에 해당하는 iOS


79

iOS 용 앱을 개발 중이며 AutoLayout이 켜진 상태에서 Storyboard를 사용하고 있습니다. 내 뷰 컨트롤러 중 하나에는 4 개의 버튼 세트가 있으며 특정 상황에서는 첫 번째 버튼을 사라지게 만들고 싶습니다.

setHidden:TRUE메서드를 사용하면 UIButton이 보이지 않지만 여전히 뷰에서 공간을 차지하고 그 결과 나머지 UIButton이 메인 뷰의 상단을 향해 떠 있도록 채울 수없는 "구멍"이됩니다.

Android에서는 View.GONE대신 단순히을 사용 View.INVISIBLE했지만 iOS에서는이 동작에 갇혀 있고 유일한 해결책은 나머지 요소를 수동으로 (예, 프로그래밍 방식으로) 이동하는 것이라고 믿고 싶지 않습니다.

나는 안드로이드 에서처럼 모든 것을 자동으로 만들기 위해 일종의 Constraint를 설정할 수 있었을 것이라고 생각했지만 운이 없었습니다.

Autolayout을 끄기 전에 누군가 올바른 방향으로 나를 가리킬 수 있습니까?

IB를 사용하고 있지만 프로그래밍 방식에도 익숙합니다.

최신 정보:

구성 요소 높이를 0으로 설정하는 것도 도움이되지 않습니다.

나는 다음과 같이 시도했다.

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

버튼 높이를 0으로 설정하는 것은 어떻습니까?
cahn

나는 다음과 같은 것을 시도했다 : UIButton * b; CGRect frameRect = b.frame; frameRect.size.height = 0; b.frame = frameRect; 운이 없습니다 :(
elbuild

나는 이것이 매우 오래된 질문이라는 것을 알고 있지만 업데이트와 관련하여 자동 레이아웃을 사용하는 경우 프레임을 0으로 설정하는 것이 도움이되지 않습니다. 높이 제한을 0으로 설정해야합니다
wyu

답변:


40

뷰의 높이를 0으로 설정하는 제약 조건 (NSLayoutAttributeHeight)을 추가하면 저에게 효과적이었습니다.

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

11
Swift 버전 :self.view.addConstraint(NSLayoutConstraint(item: self.captchaView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 0))
iStar

1
이 대답 했어야
릭 Royd 포기를

2
원하는 뷰의 실제 높이를 모르는 경우 (예 : 조금 나중에 렌더링 된 컨테이너 뷰)?
A. Petrov

멋진 답변에 감사드립니다! 누군가를 위해 필요할 수 있습니다. 오류가 발생했습니다 Unable to simultaneously satisfy constraints. 보기에 대한 제약이 이미있는 동안. 나는하여 해결 stackoverflow.com/a/38625419/1270901
네빈 첸에게

나는 동일한 코드를 사용하고 있지만 ... 작동하지 않습니다 @iStar stackoverflow.com/questions/45454992/...
산 제이 Mangaroliya

20

이 질문에 대한 모든 답변은 비효율적입니다. iOS에서 Android setVisibility : Gone 메서드를 equvailent하는 가장 좋은 방법은 StackView먼저 구성 요소를 선택한 다음 편집기에서 삽입, 스택보기,

새 스택보기를 IBOutlet과 연결 한 다음 :

숨겨진:

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

시계:

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

스택 뷰를 사용하면 모든 제약 조건이 유지됩니다!

문서


실제로 정말 좋은 솔루션처럼 보이지만 iOS9 +가 필요하다는 점에 주목할 가치가 있습니다.
user3533716

나는 당신의 훌륭한 솔루션을 사용했지만 (+1, 정말 감사합니다 !!) IBOutlet을 통해 직접 표시하고 숨기려는 뷰를 연결했기 때문에 코드 한 줄만 입력하면됩니다! :)
Cristina De Rito

1
이 대답은 실제로 정확하지 않습니다. Android View.GONE은 UI에서보기를 제거합니다. 예를 들어 View.GONE을 요소로 설정하면 그 아래의 뷰가 위로 이동합니다. 따라서 귀하의 제안은 View.HIDE와 동일한 뷰를 숨 깁니다. 이 답변 봐 : stackoverflow.com/questions/11556607/...
에민을 니즈

나는 안드로이드 API에서 검색하지 않았다. 그러나 나는 모바일 개발자이기 때문에 메카닉을 알고있다 ... 부울 플래그 뷰가있는 안드로이드에서는 볼 수 있거나 볼 수 없을 것이다. (Gone, Visible) ui에서 제거하면 어려울 것이다. 공식적으로 일어날 숨겨진 속성을 IOS 또한있다 .... 다시 추가 ...하지만 IOS에서, 레이아웃하지만 공백없이 ... UIStackview 숨겨진 재산과 같은 안드로이드 View.Gone
Ucdemir

16

다음과 같이 뷰에 높이 제한을 추가합니다.여기에 이미지 설명 입력

그런 다음 viewController 파일에서 다음과 같이 높이 제약에 대한 콘센트를 만듭니다.여기에 이미지 설명 입력

& 그런 다음 viewDidLoad 메서드에서 제약 조건 높이를 다음과 같이 0으로 변경합니다.

override func viewDidLoad() {
    super.viewDidLoad()
nsLcButtonHeight.constant = 0
}

1
일정한 높이가 좋지 않습니다. 동일한 높이와 승수를 사용합니다. 예를 들어 상위 뷰의 25 %를 차지합니다. 이에 대한 예가 있습니까?
user924

8

iOS에서 Androids.GONE 기능을 달성하려면 UIStackView를 사용합니다. 그 후 위치별로 아이를 숨 깁니다. ( 사과 문서 )

SWIFT 4 :

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

그것은 테이블 셀 예제입니다. 두 가지 모두 안에 넣고 아이를 Stack view위한 아이템을 얻으십시오 GONE.

여기에 이미지 설명 입력



1

1) 버튼이 수직으로 배치 height된 경우를 0으로 설정하고 수평으로 배치 된 버튼의 경우 width0으로 설정 하거나 둘 다 0으로 설정할 수 있습니다.

또는

2) 당신은 설정이 방법을 시도 할 수 button2의 상단에를 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];

}


1

이 질문은 꽤 오래되었지만 내가 찾은 옷장은 추가 제약 조건을 설정하는 것입니다 (따라서 "사라진"뷰 주변의 뷰는 누락 된 경우 수행 할 작업을 알 수 있습니다).

A  which you want to be     A
|  after setting B to gone  |
B                           C
|                               
C                               
  1. C에서 A로 낮은 우선 순위 (750) 제약 조건을 설정합니다.
  2. NSLayoutConstraint 배열에 B의 위쪽 및 아래쪽 제약 조건 (또는 뷰를 가로로 축소하려는 경우 왼쪽 및 오른쪽)을 추가합니다 bConstraints. 다음과 같이하십시오.
    1. 제약 조건에서 ViewController로 클릭 및 드래그 제어
    2. 아울렛에서 아울렛 컬렉션으로 연결 변경
    3. 이름 넣어 bConstraints.
    4. 연결을 누르십시오. 이것은 @IBOutlet var bConstraints: [NSLayoutConstraint]!ViewController에 생성됩니다.
    5. 제약 조건을 추가하려면 : Storyboard의 제약 조건에서 @IBOutlet 변수 이름으로 드래그하십시오.
  3. 그런 다음 B 숨기기

    B.hidden = true
    NSLayoutConstraint.deactivateConstraints(bConstraints)
    
  4. 숨기기를 해제하려면

    B.hidden = false
    NSLayoutConstraint.activateConstraints(bConstraints)
    

분명히 더 많은 뷰를 가질수록 각 뷰에서 추가 제약이 필요하므로 더 복잡해집니다.


당신은 당신이 구현할 수없는 이유를 설명하는 경우가 더 도움이 될 것입니다
wyu

두 번째 요점. 그래도 Xamarin에서 일하고 있습니다. 여전히이 문제에 대한 해결책을 찾지 못했습니다. B 제약 조건으로 NSLayoutConstraint 배열을 어떻게 구성해야하는지 모르겠습니다. 나는 그것이 프로그래밍 방식으로 수행되었다고 가정하고 그 코드를 보는 것이 좋을 것입니다. 귀하의 방법은이 문제를 해결하는 가장 합리적인 방법 인 것 같습니다.하지만 의사 코드만으로 구현하기가 쉽지는 않습니다
Gustavo Baiocchi Costa

Xamarin을 사용하지 않았습니다. XCode에서 수행하는 방법은 다음과 같습니다. Ctrl 키를 누른 채로 제약 조건에서 ViewController로 드래그합니다 (이는 xcode에서 IBOutlet을 만드는 방법과 유사합니다). 나타나는 팝업 ( i.stack.imgur.com/JegLK.png 와 유사 )에서 "연결"드롭 다운 메뉴를에서 Outlet로 변경합니다 Outlet Collection. 추가 제약 조건의 경우 Ctrl을 변수 이름으로 직접 드래그합니다. 오늘 늦게 (~ 8 시간 후) sceenshot을 업로드 할 수 있습니다
wyu

NSLayoutConstraint 배열이 출구 모음입니다, 그래서 하하 여기 손실을 조금 가지고, 내 질문 : 대답하기 위해 시간을내어 TKS
구스타보 Baiocchi 코스타를

예, 더 명확하게 답변을 업데이트하겠습니다. 솔루션이 효과가 있습니까?
wyu

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 필드가 있으므로 항상 최신 상태입니다.


0

페이지 또는 페이지의 특정 셀을 지우고 전체를 재정의 할 수도 있습니다. 빠르고 잘 작동합니다. 코드를 작성하지는 않았지만 작업중인 기존 프로젝트에서 발견했습니다. 모든 것을 관리 할 수있는 클래스를 ManagementTableSection만들고 ManagementTableCell클래스를 만듭니다 . 더 잘 정의 된 코드를 제공 할 수 없습니다.


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 사이의 수직 공간의 양입니다.


0

"visible"이라는 사용자 지정 UIView 구현에 새 속성을 추가했습니다.이 속성은 false로 설정하면 뷰를 축소하는 제약 조건을 추가합니다 (목록이 수평이기 때문에 너비 제약 조건 만 추가했지만 가장 좋은 방법은 높이 제약도 0).

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

뷰에서 너비가 0 인 제약 조건을 초기화하고 필드로 추가해야합니다.

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)
    ...
}

-3

setHidden : TRUE / FALSE는 Android View.GONE / VISIBLE에 가장 가까운 값입니다.

보기가 보이지 않으면 반드시 공간을 차지하지는 않습니다!

ListView가 다른 뷰 위에 놓인 ComboBox-Alike를 만들었습니다. 다음을 선택하는 동안에 만 표시됩니다.

여기에 이미지 설명 입력


당신은 안드로이드에서 우리는 또한 view.invisible을 가지고 있다는 것을 잊었습니다 ... view.gone은 setHidden과 비슷하지 않습니다 ... setHidden
Nav
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.