2016-08-25 2 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)