2016-10-12 2 views
2

stackView 조회수 사라지는 :스위프트 : 내 메인 스토리 보드에 비교적 간단한 세트를 가지고

  • 세보기
  • 첫번째 관점은 고정 된 높이를 가진다 포함 세그먼트 제어부를 포함하는 스택보기
  • 다른 두 개의 뷰는 생각은 한 번에 하나만 활성화 될 따라서 사용할 수있는 공간

내가 변화보기 행위를 처리하는 코드를 채울 것 인, 제한이 없습니다 다음과 같은 의견을 필자 : '먼저'라는 탭을 선택하면

import Foundation 
import UIKit 
class ViewController : UIViewController { 
    @IBOutlet weak var stackView: UIStackView! 
    @IBOutlet weak var segmentController: UISegmentedControl! 
    @IBAction func SegmentClicked(_ sender: AnyObject) { 
     updateView(segment: sender.titleForSegment(at: sender.selectedSegmentIndex)!) 
    } 
    override func viewDidLoad() { 
     updateView(segment: "First") 
    } 
    func updateView(segment: String) { 
     UIView.animate(withDuration: 1) { 
      if(segment == "First") { 
       self.stackView.arrangedSubviews[1].isHidden = false 
       self.stackView.arrangedSubviews[2].isHidden = true 
      } else { 
       self.stackView.arrangedSubviews[1].isHidden = true 
       self.stackView.arrangedSubviews[2].isHidden = false 

      } 
      print("Updating views") 
      print("View 1 is \(self.stackView.arrangedSubviews[1].isHidden ? "hidden" : "visible")") 
      print("View 2 is \(self.stackView.arrangedSubviews[2].isHidden ? "hidden" : "visible")") 
     } 
    } 
} 

당신이 볼 수 있듯이이, 인덱스 1의 서브 뷰가 표시해야합니다 (2)가 숨겨져 동안, 그리고 무엇을 선택하면 하위 뷰에서 인덱스 2가 표시되고 1은 숨겨집니다.

천천히보기를 변경하면 처음에는 효과가있는 것처럼 보입니다.하지만 조금 더 빠르게 가면 색인 1의보기가 몇 번의 클릭 후 영구히 숨겨져 색인 0의보기가 전체 화면. 아래에 스토리 보드의 문제와 스크린 샷을 보여주는 애니메이션을 배치했습니다. 결과는 문제가 발생하면 첫 번째 세그먼트를 클릭 할 때 두보기가 모두 표시되지 않는다는 것을 나타냅니다.

아무도 왜 이것이 일어나고 있는지 말해 줄 수 있습니까? 이 버그입니까, 아니면 내가해야 할 일을하지 않습니까?

미리 감사드립니다.

Animation showing issue

Image of stack view in storyboard

업데이트 : 나는 확실하게 그 순서> 첫 번째 두 번째> 세 번째> 두 번째> 첫 세그먼트로 이동하여 문제를 재현 할 수있을 것 같다.

+0

을 제약 조건을 설정해야합니다. 그런 다음보기에 표시되지 않도록하려면 숨겨 지도록하십시오. 스택 뷰가있는 멋진 점은 스택 뷰가 숨겨 지도록 말하면 스택 뷰가 나머지 뷰에 맞게 조정됩니다. – zsteed

+0

텍스트 "First"는 실제로 애니메이션의 맨 아래에 표시되므로 숨겨지지 않습니다. 세그먼트 컨트롤에 고정 높이 제약 조건을 설정 했습니까? – Felix

+0

@ phix23 고정 높이는 세그먼트 컨트롤이 포함 된 스택 뷰의 첫 번째 하위 뷰에 있습니다. 높이 = 32로 설정되어 있습니다. 어쨌든 스택보기에서도 시도해 보았습니다. 그래서 그렇게 생각하지 않습니다. 또한 'print'에서 숨겨진 것으로보고되므로 명확히 숨겨져 있다고 생각합니다 (확인 전에 애니메이션이 끝날 때까지 기다릴 필요가없는 경우). – Ben

답변

2

결국 모든 제안을 시도한 후에도 나는 왜 이런 식으로 행동했는지 알 수 없으므로 버그 신고를 요청한 Apple과 연락을 취했습니다. 그러나 나는 내 문제를 해결 처음 두보기를 숨김 해제함으로써, 주변의 일을 찾았어요 :

func updateView(segment: String) { 
    UIView.animate(withDuration: 1) { 
     self.stackView.arrangedSubviews[1].isHidden = false 
     self.stackView.arrangedSubviews[2].isHidden = false 
     if(segment == "First") { 
      self.stackView.arrangedSubviews[2].isHidden = true 
     } else { 
      self.stackView.arrangedSubviews[1].isHidden = true 
     } 
    } 
} 
+2

UITableViewCell에서 UIStackView와 동일한 문제가 발생했습니다.셀이 재사용되기 때문에 테이블을 빠르게 스크롤 할 때 스택 뷰에 숨겨진 구성 요소가 빠르게 연속적으로 숨겨져있을 수 있습니다. 내 솔루션은 UITableViewCell의'prepareForReuse' 메서드를 숨기고 필요한 경우 숨길뿐입니다. 이것은 작동하는 것 같습니다. 다른 사람을 도울 수 있습니다 :) – StijnSpijker

1

내가 볼 수있는 것을 바탕으로,이 이상한 행동은 애니메이션 기간 때문에 발생합니다. 보시다시피, 애니메이션이 완료 되려면 1 초가 걸리지 만, segmentControl을 그보다 빠르게 전환하기 시작하면,이 동작을 일으키는 원인이 무엇인지 논쟁하겠습니다.

메소드 호출시 사용자 대화 형 작업을 비활성화 한 다음 애니메이션이 완료되면 다시 활성화해야합니다.

은 다음과 비슷한 모습이 될 것입니다

func updateView(segment: String) { 

    segmentControl.userInteractionEnabled = false 
    UIView.animateWithDuration(1.0, animations: { 
     if(segment == "First") { 
      self.stackView.arrangedSubviews[1].isHidden = false 
      self.stackView.arrangedSubviews[2].isHidden = true 
     } else { 
      self.stackView.arrangedSubviews[1].isHidden = true 
      self.stackView.arrangedSubviews[2].isHidden = false 

     } 
     print("Updating views") 
     print("View 1 is \(self.stackView.arrangedSubviews[1].isHidden ? "hidden" : "visible")") 
     print("View 2 is \(self.stackView.arrangedSubviews[2].isHidden ? "hidden" : "visible")") 
    }, completion: {(finished: Bool) in 
     segmentControl.userInteractionEnabled = true 
    } 
} 

를이 (당신이 단점으로 볼 수 있습니다) 빠른 스위칭에서 방지 할 수 있지만, 단지 다른 방법을 내가 그이은을 제거하는 것입니다 해결의 알고 모두 애니메이션.

+0

죄송합니다. Benjamin, 여전히 문제를 해결하지 못한 것 같습니다. 시도해 주셔서 감사합니다! – Ben

+0

@Ben 허, 그 이상 하네. 나는 두 번째를 보겠습니다. –

+0

고맙습니다. 첫 번째> 두 번째> 세 번째> 두 번째> 첫 번째 세그먼트로 이동하면 재현 할 수 있다고 말한 것입니다. – Ben

0

스택 뷰와 하위 뷰, 특히 세그먼트 컨트롤에서 구성 및 자동 레이아웃 제약 조건을 확인하십시오.

분할 된 컨트롤은 스택보기의 설정을 복잡하게하므로 스택보기에서 분할 된 컨트롤을 제거하고 기본보기를 기준으로 제약 조건을 설정합니다.

스택보기에서 세그먼트 화 된 컨트롤을 사용하면 코드가 올바르게 작동 할 수 있도록 스택보기를 설정하는 것이 상대적으로 간단합니다.

스택보기의 구속 조건을 세그먼트 화 된 컨트롤 아래에 배치하고 나머지 수퍼 뷰를 덮도록 구속 조건을 재설정합니다. Attributes Inspector에서 Alignment to Fill, Distribution to Fill Equal, Content Mode를 Scale to Fill로 설정하십시오.

하위 뷰의 제약 조건을 제거하고 컨텐츠 모드를 채우기로 설정하십시오.

코드에서 arrangedSubviews에 대한 색인을 조정하면 자동으로 작동합니다.

+0

운이 없다 - 첫 번째> 두 번째> 세 번째> 두 번째> 첫 번째로 이동 한 후에도 첫 번째보기를 숨길 수 없습니다. – Ben

8

버그는 스택보기에서 해당 숨어과 도시 한 도면 누적입니다. 이상한 애플 버그. 스택보기에서보기를 두 번 숨기려면 다시보기 위해 두 번 표시해야합니다. 세 번 표시하면 실제로 숨기기 위해 세 번 숨길 필요가 있습니다 (숨겨져 있다고 가정).

이것은 애니메이션 사용과 독립적입니다.

그래서 당신은 당신의 코드에서 같은 것을 할 경우에만 표시의 경우보기를 숨기고,이 문제를 피할 수 있습니다 : 당신은 당신이 다른 사람들이 "제한"당신이없는 볼 말했다

if myView.isHidden == false { 
    myView.isHidden = true 
} 
+1

그건 사실이고 어디에도 문서화되어 있지 않습니다. 왜 내 견해가 스택 뷰에 표시되지 않는지 디버깅하는 것이 미쳐 버렸습니다. 단어는이 구현이 얼마나 어리 석 었는지 알 수 없습니다! 고마워, 데이브! – codingFriend1

관련 문제