2017-04-02 2 views
0

맞춤 UI보기의 제약 조건을 업데이트하는 방법이 궁금합니다. 확실히 내 코드의 오류입니다. 나는 사전에 사과한다, 나는 Swift의 초보자에 불과하다.Swift Playgrounds 프로그램의 프로그래밍 제약 조건 문제

public class NoteCardView:UIView { 
@IBInspectable var contentView = UIButton(frame: .zero) 
@IBInspectable var delegate: MainViewController? 
var leftAnchor: NSLayoutXAxisAnchor 
var bottomAnchor: NSLayoutYAxisAnchor 

override public func updateConstraints() { 

    contentView.translatesAutoresizingMaskIntoConstraints = false 

    contentView.layer.masksToBounds = true 
    contentView.layer.cornerRadius = 6 
    contentView.widthAnchor.constraint(equalToConstant: 75).isActive = true 
    contentView.heightAnchor.constraint(equalToConstant: 100).isActive = true 
    leftAnchor = contentView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: positionX).isActive = true 
    bottomAnchor = contentView.bottomAnchor.constraint(equalTo: (delegate?.view.bottomAnchor)!, constant: positionY).isActive = true 
    titleLabel.textAlignment = .center 
    titleLabel.text = note 
    contentView.addSubview(titleLabel) 


    super.updateConstraints() 
} 

class MainViewController: UIViewController { 
override func viewDidLoad() { 
// Trying to implement updated constraints to the NoteCardView here. 
} 
} 

또한 TapGestureRecognizer와 관련없는이 문제가 있습니다. 나는이 개념에도 익숙하지 않다.

public class NoteCard:UIView { 
internal var titleLabelTapGestureRecognizer: UITapGestureRecognizer? 

internal func commonInit() { 
self.titleLabelTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTitleLabelTap(UITapGestureRecognizer))) 
} 

internal func handleTitleLabelTap(_ recognizer:UITapGestureRecognizer) { 
    self.delegate?.noteCardViewTitleLabelDidRecieveTap(self) 
} 
} 

도움을 주셔서 감사합니다.

+2

그 밖의 것이 없다면 왼쪽 앵커가 콘텐츠보기와 그 자체 사이에 있으며 이는 의미가 없습니다. 또한 일반적으로 제약 조건을 설정하기 전에 계층에보기를 추가해야합니다. 제약 조건 기반 오류 메시지가 표시되면 정확한 메시지를 공유하십시오 (앞서 언급 한 제약 조건을 수정 한 후). – Rob

답변

0

코드에서 문제가 몇 가지 있습니다 : 롭은 그의 주석에서 언급 무엇

  1. : contentView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: positionX) - 제약 두 개의 서로 다른 견해의 앵커 사이 여야으로이, 이해가되지 않습니다. 또한 계층 구조에 뷰를 추가 한 후에 제약 조건을 구성해야합니다.
  2. 또한 같은 줄로 : leftAnchor = contentView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: positionX).isActive = true. 이 행에는 실제로 두 개의 문제가 있습니다.

    2a. 이 복합 대입이로 평가

    contentView.leftAnchor.constraint(equalTo: contentView.leftAnchor, constant: positionX).isActive = true 
    leftAnchor = true 
    

    당신이 유형 NSLayoutXAxisAnchor의 변수에 true를 할당하려고 것을 의미합니다. 동일한 내용이 bottomAnchor

    2b에 적용됩니다. leftAnchor 유형의 경우 앵커에서 constraint을 호출하면 NSLayoutConstraint이 생성되므로 NSLayoutConstraint이어야합니다. 앵커에 대한 참조를 가져 오려면 leftAnchor = contentView.leftAnchor으로 전화하면됩니다.

  3. 제약 조건뿐만 아니라 전체보기가 덮어 쓰기 된 updateConstraints 방법으로 설정됩니다. 이것이 잘못된 것은 아니지만, 나는 그러한 간단한 견해에 반대하여 조언 할 것입니다. 차라리 public func setup() 메서드를 만들고 뷰 컨트롤러 viewDidLoad에서 호출하여 뷰와 해당 제약 조건을 설정합니다.

  4. 제스처 인식기는 뷰에 추가해야하므로 초기화하기에 충분하지 않습니다. 간단한 self.addGestureRecognizer(self.titleLabelGestureRecognizer) 트릭을해야합니다.

관련 문제