2016-11-16 6 views
2

스택보기를 사용하여 일종의 테이블 UI를 만들었습니다. Stackview 0,2,4에서 6 개의보기가 표시되고 1,3,5 숨겨져 있습니다. 보이는보기 중 하나를 탭하면 숨겨진보기 중 하나를 "열"려고합니다.iOS 9에서 숨겨진 속성을 변경할 때 UIStackView의 애니메이션이 적용되지 않습니다.

나는 아이폰 OS 10 그러나 나는 내가 열려있는 모든 뷰를로드하는 경우, 가까운 애니메이션이 작동합니다 9.

참고 iOS에서 잘 작동하지 않습니다 이해할 수없는 몇 가지 이유에서 좋은 작품이 코드를 hidden 속성을 false로 설정하면 열리지 않습니다.

편집 디버깅 뷰의 높이 제한과 같은 것입니다이나 숨어에서 회복, 그리고 프레임은 여전히 ​​높이 후 0

import UIKit 

class DeckView: UIView { 

} 

class ViewController: UIViewController { 

var scrollView: UIScrollView! 
var stackView: UIStackView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    scrollView = UIScrollView() 
    scrollView.translatesAutoresizingMaskIntoConstraints = false 
    view.addSubview(scrollView) 

    view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: .alignAllCenterX, metrics: nil, views: ["scrollView": scrollView])) 
    view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[scrollView]|", options: .alignAllCenterX, metrics: nil, views: ["scrollView": scrollView])) 


    stackView = UIStackView() 
    stackView.translatesAutoresizingMaskIntoConstraints = false 
    stackView.spacing = 0 
    stackView.alignment = .center 
    stackView.distribution = .fillProportionally 
    stackView.axis = .vertical 
    scrollView.addSubview(stackView) 

    scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView])) 
    scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView])) 


    for i in 0 ..< 8 { 
     let view = DeckView() 
     view.tag = i 
     view.translatesAutoresizingMaskIntoConstraints = false 
     view.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width).isActive = true 
     view.isUserInteractionEnabled = true 

     if i%2 == 0 { 
      view.backgroundColor = UIColor.magenta 
      let constriant = view.heightAnchor.constraint(equalToConstant:160) 
      constriant.priority = 999 
      view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.openDeck(_:)))) 
      view.addConstraint(constriant) 

     } else { 
      view.backgroundColor = UIColor.red 
      let constriant = view.heightAnchor.constraint(equalToConstant:160) 
      constriant.priority = 999 
      view.addConstraint(constriant) 
      view.isHidden = false 
     } 

     stackView.addArrangedSubview(view) 
    } 
} 

func openDeck(_ sender:UIGestureRecognizer) { 
    if let view = sender.view as? DeckView, 
    let childView = stackView.viewWithTag(view.tag + 1) { 
      UIView.animate(withDuration: 0.4, animations: { 
       childView.isHidden = !childView.isHidden 
      }) 
    } 
} 
} 

답변

2

경우 - 여기

내 코드입니다 어떤이 문제에 비틀 거림. 이런 일이하지만 자동 레이아웃이의 일정으로 'UISV 필 - 비례'라는 이름의 높이 제약 조건을 추가 발견 이유는 확실하지 않다

stackView.distribution = .fillProportionally 

-

가 나는를 제거하여이 문제를 해결할 수 있었다 0 이상 내 우선 순위 제약. fill을 제거하면 문제가 비례 적으로 해결되었습니다.

+0

쿨 들으 당신이 내 라이브 저장 – blackjacx

19
  1. 보기의 높이 우선 순위를 1000보다 낮게 유지하십시오 (999로 이동). 이미 숨겨져있는 경우 setHidden:true을 설정하지 마십시오
  2. 는 (이 UIStackView의 버그)
+0

Baaaam :-) 많이! 이 버그는 어디에 문서화되어 있습니까? 여기에 링크를 게시 할 수 있습니까? 이 코드를 문서화해야합니다. 내 코드 ... – blackjacx

+0

레이더 또는 버그 ID를 게시 할 수 있다면 – blackjacx

+4

나는 이것을 충분히 감사 할 수 없습니다. 2015 년 ** 문제 ** (UIStackView : UIStackView : 숨겨진 모드에서 숨겨진 애니메이션으로 전환) (http://www.openradar.me/22819594) 및 [setHidden 호출 : UIStackView의 하위 뷰에서 NO는 @blackjacx에서 요청한대로 항상 표시하십시오] (http://www.openradar.me/25087688) 및 2 단계의 ** solution **은 2017 년 8 월에도 계속 유효합니다. 휴대 할 필요가 없음을 언급해야합니다 out 단계 1 (그리고'distribution = .fill'은 저에게 좋았습니다). 이 버그는'isHidden'을 즉시 토글했을 때 나타나지 않았기 때문에 분명히 애니메이션과 연결되어 있습니다. –