2017-01-17 2 views
1

내보기 컨트롤러는 3 개의 버튼이있는 스택보기를 가지고 있습니다. 하나는 고정 너비로 ​​고정되고 stackview는 다른 두 버튼이 대칭이되도록 비례 적으로 채워집니다.Swift 3 - 사용자 정의 UIButton 반지름이 구속 조건을 삭제합니까?

그러나 단추의 모서리 반경을 사용자 지정하고 응용 프로그램이 단추를로드하는 즉시 원하지 않는 방식으로 크기가 조정됩니다.

Ive는 수많은 스택 뷰 배포 및 채우기 설정을 시도했습니다. stackview에서 버튼을 제거하고 정상적인 UIView에서 가장자리에 제약을 가하는 것을 시도하지만, 제약 조건이 삭제되면 확실하지는 않지만 불확실합니다.

시각적으로 버튼은 화면의 오른쪽 하단 모서리에 가장자리와 버튼 사이에 0 칸씩 배치됩니다. 현재는 여러 장치에서 보이는 큰 제약에 제약이없는 방식으로 배치되어 더 큰 디스플레이에 공간을두고 시뮬레이터 내의 작은 디스플레이에서 화면을 종료합니다.

원하는 모서리를 둥글게하기위한 노력 코딩 시도 :

@IBOutlet fileprivate weak var button: UIButton! { didSet { 
    button.round(corners: [.topRight, .bottomLeft], radius: 50 , borderColor: UIColor.blue, borderWidth: 5.0) 
    button.setNeedsUpdateConstraints() 
    button.setNeedsLayout() 
} } 

override func viewDidLayoutSubviews() { 
    button.layoutIfNeeded() 
} 

ovverride func updateViewContraints() { 
    button.updateConstraintsIfNeeded() 
    super.updateViewConstraints() 
} 

여기에서 찾을 수 있습니다 사용되는 UIView의 확장 : https://stackoverflow.com/a/35621736/5434541

수 있습니다 어떤 솔루션이 제대로 버튼의 모서리 반경을 조정하기를 ' 제약 조건으로 버튼을 업데이트해야합니다.

+0

두 방법 모두 동일한 문제가 발생합니까? – Ben

+0

@ 벤 예, 나는 시도한 모든 방법으로 같은 행동을 보입니다. 현재 시뮬레이터에서 발생하고 있으며 iPhone 5에서 테스트 해 보았습니다. 원하는대로 작동하는 것처럼 보이지만 예상치 못한 동작으로 인해 다른 기기에서 발생할 수 있는지를 알지 못하는 걱정이됩니다. 또한 이러한 메소드를 구현하자마자 애플리케이션은 현재 많은 어려움을 겪고 있습니다! 특정 질문에 관련이 없다는 것을 알고 있지만 viewDidlayout 하위 뷰를 다른 스레드에서 실행해야하는지 궁금합니다. 감사! – lifewithelliott

답변

0

전체 코드를 보지 않고도 테두리가있는 여러 레이어가 그려져 있고 절대로 제거하지 않았기 때문에이 코드가 표시되는 것으로 판단됩니다. 단추의 크기가 조정되면 오래된 레이어가 그대로 유지됩니다. 다음은 다시 그리기 할 때 사용할 수 있어야하는 이전 레이어를 제거하는 기능입니다. 나는 스택보기 내에서이 테스트를, 또한 회전에서 제대로 동작 : 당신은 또한 응용 프로그램의 지연에 대한 의견에서 언급

class RoundedCorner: UIButton { 

    var lastBorderLayer:CAShapeLayer? 
    override func layoutSubviews() { setup() } 

    func setup() { 
     let r = self.bounds.size.height/2 
     let path = UIBezierPath(roundedRect: self.bounds, 
           byRoundingCorners: [.topLeft, .bottomRight], 
           cornerRadii: CGSize(width: r, height: r)) 
     let mask = CAShapeLayer() 
     mask.path = path.cgPath 
     addBorder(mask: mask, borderColor: UIColor.blue, borderWidth: 5) 
     self.layer.mask = mask 
    } 

    func addBorder(mask: CAShapeLayer, borderColor: UIColor, borderWidth: CGFloat) { 
     let borderLayer = CAShapeLayer() 
     borderLayer.path = mask.path 
     borderLayer.fillColor = UIColor.clear.cgColor 
     borderLayer.strokeColor = borderColor.cgColor 
     borderLayer.lineWidth = borderWidth 
     borderLayer.frame = bounds 
     if let last = self.lastBorderLayer, let index = layer.sublayers?.index(of: last) { 
      layer.sublayers?.remove(at: index) 
     } 
     layer.addSublayer(borderLayer) 
     self.lastBorderLayer = borderLayer 
    } 
} 

. 레이아웃이 업데이트마다 여러 번 호출 될 수 있고 매번 새로운 레이어를 생성하기 때문에 놀랍지 않습니다. botton 프레임의 마지막 크기를 저장하고 비교하여이 문제를 피할 수 있습니다. 동일한 경우 레이어를 다시 만들지 마십시오.

+0

그래서 RoundedCorner 클래스를 구현하려고했지만 원래 질문에서 내 끝 부분에 뭔가 잘못하고 있다는 코드를 읽은 후에 느꼈습니다. 그래서 좀 더 연구하려고 시도하고 위의 질문을 수정하여 결과를 업데이트했습니다. 나는 당신의 대답이 나를 올바른 방향으로 인도하고 있기 때문에 도움을 크게 주셔서 감사합니다. – lifewithelliott

+0

편집 한 내용이 확실하지 않은 경우 버튼 클래스 전체를 공유 할 수 있습니까? – Ben

+0

버튼은보기 컨트롤러에 연결된 스토리 보드 버튼 일뿐입니다. 사용자 정의 서브 클래 싱 된 단추가 없습니다. 응용 프로그램이 실행되고 버튼이 설정되면 마침내 didSet은 round() 메소드를 호출하게되고'setNeeds()'메소드는'viewDidUpdateLayoutSubviews()'가 호출 될 때 컨트롤러에게 레이아웃을 업데이트하도록 지시합니다. 나는 그것이 어떻게 진행되는지 믿습니다. – lifewithelliott