programing

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

codeshow 2023. 8. 5. 11:05
반응형

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

저는 iOS용 앱을 개발하고 있으며 스토리보드를 자동 레이아웃 ON으로 사용하고 있습니다.제 뷰 컨트롤러 중 하나에는 4개의 버튼이 있으며, 특정 상황에서는 첫 번째 버튼을 사라지게 하고 싶습니다.

를 하면,setHidden:TRUE방법은 UIButton이 보이지 않게 되지만 여전히 뷰에서 공간을 차지하는 것이 분명하며, 그 결과 남은 UIButton이 메인 뷰의 상단을 향해 뜨게 하는 "구멍"을 채우지 못했습니다.

Android에서 나는 단순히 사용했을 것입니다.View.GONEView.INVISIBLE하지만 iOS에서는 이러한 동작에 얽매여 있으며 유일한 해결책이 수동으로(예, 프로그래밍 방식으로) 나머지 요소를 맨 위로 이동하는 것이라고 믿고 싶지 않습니다.

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

자동 레이아웃을 끄기 전에 누가 올바른 방향을 알려줄 수 있습니까?

저는 IB를 사용하고 있지만 프로그래밍적인 것에도 익숙합니다.

업데이트:

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

저는 다음과 같은 것을 시도했습니다.

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

제약 조건 추가(NS 레이아웃 속성)높이) 보기의 높이를 0으로 설정하는 작업이 수행되었습니다.

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

이 질문에 대한 모든 대답은 비효율적입니다.Android 세트 가시성을 충족하는 가장 좋은 방법:iOS에서 사라진 방법은StackView한 후 뷰, 스택 뷰, 편집기, 편집기, 편집기, 편집기를 합니다.

IBOutlet을 사용하여 새 스택 뷰를 연결한 다음:

숨김:

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

가시성:

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

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

문서

다음과 enter image description here같이 보기에 높이 제약 조건을 추가합니다.

그런 다음 다음 enter image description here뷰 컨트롤러 파일의 높이 제약 조건에 대한 배출구를 다음과 같이 만듭니다.

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

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

Androids를 달성하기 위해.iOS에서 GONE 기능은 UISackView를 사용하는 것입니다.그런 다음 위치별로 아이를 숨깁니다.(애플 설명서)

SWIFT 4:

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

예입니다, 에 둘 다 . 양쪽 모두를 삽입하십시오.Stack view다음에 대한 항목 가져오기GONE아이

enter image description here

스택 보기 아래에서 보기를 그룹화할 수 있습니다.그런 다음 특정 보기를 숨기면 나머지 보기가 자동으로 이동하여 공간을 채웁니다.

스택 보기에서 Apple 설명서를 확인할 수 있습니다. https://developer.apple.com/reference/uikit/uistackview

또는 다음과 같은 온라인 튜토리얼: https://www.appcoda.com/stack-views-intro/

, ▁the▁are▁set합다니▁if▁must야설▁you▁then해tically▁ver▁placed▁your정▁buttons를 설정해야 합니다.height수평으로 에는 0으로 .width0으로 설정하거나 둘 다 0으로 설정할 수 있습니다.

OR

은 이 해 볼 수 .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];

}

https://github.com/tazihosniomar/LayoutManager

그게 당신에게 도움이 되길 바랍니다.

이 질문은 꽤 오래되었지만 제가 발견한 가장 중요한 것은 추가적인 제약 조건을 설정하는 것입니다(그러므로 "잃어버린" 보기 주변의 보기는 누락된 후에 무엇을 해야 하는지 알 수 있습니다).

A  which you want to be     A
|  after setting B to gone  |
B                           C
|                               
C                               
  1. C에서 A로 우선 순위가 낮은(750) 제약 조건을 설정합니다.
  2. 배열 NSLayoutConstraint 배열 NSLayoutConstraint(를 수평으로과 오른쪽)에B의 및 제약 합니다.bConstraints수행 방법:
    1. 제어 제약 조건에서 ViewController로 클릭 및 드래그
    2. 콘센트에서 콘센트 컬렉션으로 연결 변경
    3. 의 경우에는 입용력름이▁for용▁putbConstraints.
    4. 연결을 누릅니다.이렇게 하면 다음이 생성됩니다.@IBOutlet var bConstraints: [NSLayoutConstraint]!
    5. 추가 제약 조건 추가하기: Storyboard의 제약 조건에서 @IBOutlet 변수 이름으로 끌기
  3. 그럼 숨김 B

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

    B.hidden = false
    NSLayoutConstraint.activateConstraints(bConstraints)
    

각 보기에서 추가 제약 조건이 필요하기 때문에 보기가 점점 더 많아질수록 이는 더욱 복잡해집니다.

제가 조사한 바와 같이 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/Storyboard를 편집할 때마다 코드가 끊어집니다.viewDidLoad에서 설정한 field float _optional Height가 있으므로 항상 최신 상태입니다.

또한 페이지 또는 페이지의 특정 셀을 지우고 전체를 재정의할 수 있습니다.그것은 빠르고 잘 작동합니다.저는 코드를 작성하지 않았지만 제가 진행하고 있는 이 기존 프로젝트에서 코드를 찾았습니다.를 작성ManagementTableSection그리고.ManagementTableCell모든 것을 관리하는 클래스.더 잘 정의된 코드를 제공할 수 없습니다.

Deniz가 제공한 답변을 바탕으로 Swift의 제약 조건을 사용한 솔루션을 소개합니다.

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

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

setHidden:TRUE/FALSE는 Android View와 가장 유사합니다.사라짐/눈에 띕니다.

보기가 표시되지 않으면 보기에 공간이 필요하지 않습니다!

다른 보기 위에 ListView가 배치된 ComboBox-Alike를 만들었습니다.다음을 선택하는 동안에만 표시됩니다.

enter image description here

언급URL : https://stackoverflow.com/questions/17869268/ios-equivalent-for-android-view-gone-visibility-mode

반응형