2016-08-25 13 views
0

我一直在嘗試使用UISegmentedControl作爲多項選擇工具。我認爲,如果我可以將它旋轉90度(以及內部文本)並擴大單元格,它將是一個非常流暢的工具。然而,無論我嘗試什麼,它總是給我這種變化broken UISegmentedControl如何旋轉UISegmentedControl並增加大小以適合任意數量的文本

順便說一下,這是在UICollectionView。下面是我對UICollectionViewCell

class customCollectionCell: UICollectionViewCell { 
@IBOutlet weak var questionLabel: UILabel! 
@IBOutlet weak var questionDescriptionLabel: UILabel! 
@IBOutlet weak var viewForSegment: UIView! 
var segment: CustomSegmentedControl! 

func heightForView(text:String, width:CGFloat) -> CGFloat{ 
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max)) 
    label.numberOfLines = 0 
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping 
    label.text = text 

    label.sizeToFit() 
    return label.frame.height 
} 

func loadQuestions(choices: [String], pointIndex: [Int]) { 
    segment = CustomSegmentedControl(items: choices) 
    segment.transform = CGAffineTransformMakeRotation(CGFloat(M_PI/2.0)); 
    for view in segment.subviews { 
     for sv in view.subviews { 
      if sv.isKindOfClass(UILabel){ 
       let subview: UILabel = sv as! UILabel 
       subview.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI/2.0)) 
       subview.addConstraint(NSLayoutConstraint(item: subview, 
        attribute: NSLayoutAttribute.Height, 
        relatedBy: NSLayoutRelation.Equal, 
        toItem: nil, 
        attribute:NSLayoutAttribute.NotAnAttribute, 
        multiplier:1, 
        constant: heightForView(subview.text!, width: self.viewForSegment.frame.width))) 
       subview.addConstraint(NSLayoutConstraint(item: subview, 
        attribute: NSLayoutAttribute.Width, 
        relatedBy: NSLayoutRelation.Equal, 
        toItem: nil, 
        attribute:NSLayoutAttribute.NotAnAttribute, 
        multiplier:1, 
        constant: self.viewForSegment.frame.width)) 
      } 
     } 
    } 
    segment.pointIndex = pointIndex 
    /* 
    self.addConstraint(NSLayoutConstraint(item: segment, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.LeftMargin, multiplier: 1, constant: 0)) 
    self.addConstraint(NSLayoutConstraint(item: segment, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.BottomMargin, multiplier: 1, constant: 0)) 
    self.addConstraint(NSLayoutConstraint(item: segment, attribute: NSLayoutAttribute.Right, relatedBy: NSLayoutRelation.Equal, toItem: self, attribute: NSLayoutAttribute.RightMargin, multiplier: 1, constant: 0)) 
    self.addConstraint(NSLayoutConstraint(item: segment, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: questionDescriptionLabel, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 20)) 
    segment.frame = CGRect(origin: CGPoint(x: questionLabel.x, y:), size: segment.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize)) 
    */ 

    segment.bounds.size = segment.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize) 
    viewForSegment.addSubview(segment) 
    viewForSegment.frame.size = viewForSegment.systemLayoutSizeFittingSize(UILayoutFittingExpandedSize) 
} 

}

回答

0

代碼可以使用CGAffineTransformMakeRotation(M_PI_2)旋轉控制90度,
CGAffineTransformMakeRotation(-M_PI_2)每個段旋轉回來。
然後您需要計算結果的幀/邊界。

// rotate view 
self.transform = newValue ? CGAffineTransformMakeRotation(CGFloat(M_PI_2)) : CGAffineTransformIdentity 

let padding : CGFloat = 8 
let maxSize = CGSize(width: CGFloat.max, height: CGFloat.max) 
var size : CGSize 
var maxHeight : CGFloat = 0 
var totalWidth : CGFloat = 0 

// reverse rotate segment content 
for segment in subviews { 
    for contentView in segment.subviews { 
     size = contentView.sizeThatFits(maxSize) 
     maxHeight = max(maxHeight, newValue ? size.width : size.height) 
     totalWidth += (newValue ? size.height : size.width) + padding 
     contentView.transform = newValue ? CGAffineTransformMakeRotation(-CGFloat(M_PI_2)) : CGAffineTransformIdentity 
    } 
} 

// adjust size 
bounds = CGRect(x: 0, y: 0, width: totalWidth + padding, height: maxHeight + 2*padding) 

隨意使用我的UISegmentedControl.vertical擴展: https://gist.github.com/yonat/18261fd04cd11a3e9959835509b312c2

0

你可以做這樣的

segmentControl.transform = CGAffineTransform(rotationAngle: CGFloat.pi/2) 
實現
相關問題