23698


自作viewをStoryBoard上でカスタムクラスに設定して、viewController側でframe設定用のメソッドを呼び出しています。

出来れば子view側で自動でframeを取得してsubviewのframeを設定できるようにしたいです。

子view側でAutoLayout後のframeを検知して取得するような方法は存在するでしょうか?

* * *

## コード - 自作view

[code]

    import UIKit
    
    final class SLSegmentedView: UIView {
    
        var segmentedControl: CommonSegmentedControl?
        var contentsDivieder: ContentsDivider?
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            commonInit()
            setSubviewsFrame(frame)
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            commonInit()
        }
    
        private func commonInit(){
            segmentedControl = CommonSegmentedControl(sectionTitles: sectionTitles)
            segmentedControl!.addTarget(MasterViewController(),
                                        action: #selector(MasterViewController.segmentedControlChangedValue(_:)),
                                        forControlEvents: .ValueChanged)
            contentsDivieder = ContentsDivider()
            self.addSubview(segmentedControl!)
            self.addSubview(contentsDivieder!)
    
        }
    
        func reloadTitles(){
            segmentedControl?.sectionTitles = self.sectionTitles
            segmentedControl?.layoutIfNeeded()
        }
    
        func setSubviewsFrame(frame: CGRect){
            segmentedControl?.frame = frame
            contentsDivieder?.containerFrame = frame
        }
    
        var sectionTitles: [String]{
            let df = NSDateFormatter()
            let userDefaults = NSUserDefaults.standardUserDefaults()
            let saturday = userDefaults.valueForKey("Saturday") as! Bool
    
            var aSectionTitles: [String]
            if saturday == true{
                aSectionTitles = [NSLocalizedString("All", comment: ""),
                                 df.shortWeekdaySymbols[1],
                                 df.shortWeekdaySymbols[2],
                                 df.shortWeekdaySymbols[3],
                                 df.shortWeekdaySymbols[4],
                                 df.shortWeekdaySymbols[5],
                                 df.shortWeekdaySymbols[6]]
            }else{
                aSectionTitles = [NSLocalizedString("All", comment: ""),
                                 df.shortWeekdaySymbols[1],
                                 df.shortWeekdaySymbols[2],
                                 df.shortWeekdaySymbols[3],
                                 df.shortWeekdaySymbols[4],
                                 df.shortWeekdaySymbols[5]]
            }
            return aSectionTitles
        }
    
    }
    
[/code]

* * *

## コード - view controller

[code]

    @IBOutlet weak var controlView: SLSegmentedView!
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        controlView.setSubviewsFrame(controlView.bounds)
    }
    
[/code]

* * *

上手くいきましたので当該コードを載せておきます

[code]

    override func layoutSubviews() {
        super.layoutSubviews()
        segmentedControl?.frame = self.bounds
        contentsDivieder?.containerFrame = self.bounds
    }
    
[/code]


CC BY-SA 3.0
2016-04-01T07:41:45.470
23663
2016-04-05T13:03:06.867
2016-04-05T13:03:06.867
8320
8320
question
ios autolayout
Auto layout、子view側でのframe取得方法


カスタムビューでlayoutSubviews()やboundsのset()をオーバーライドして、そこでsuperviewの値を読むのはどうでしょうか?
(superviewの値を読まなくても子のビューは配置できるとは思いますが)


CC BY-SA 3.0
2016-04-03T09:08:03.423
23698
2016-04-03T09:17:39.743
2016-04-03T09:17:39.743
7283
7283
23663
answer