2017-11-29 3 views
0

Ich versuche, ein komponentenbasiertes System auf iOS zu erstellen, und ich möchte folgendes tun:Verschachtelte @ IBDesignables mit Xibs?

  1. erstellen „PaddedView“ Komponente, die 8px Platz um zugesetzter Kind Komponenten hat, wie eine containerartige Komponente.

  2. Fügen Sie in diesem PaddedView auf einem Storyboard eine weitere IBDesignable-Ansicht hinzu, und sehen Sie beide Render.

Ist das möglich?

Gerade jetzt, ich bin mit der folgenden übergeordneten Klasse für alle IBDesignable Komponenten ihre Ansichten von xibs zu laden:

import Foundation 
import UIKit 

@IBDesignable 
class SKDesignableView: UIView { 
    var view: UIView? 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     self.loadXib() 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     self.loadXib() 
    } 

    func loadXib() { 
     self.view = self.viewFromXib() 
     self.view!.frame = self.bounds 
     self.view!.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight] 
     self.addSubview(self.view!) 
    } 

    func viewFromXib() -> UIView { 
     let bundle = UINib(nibName: String(describing: self.getType()), bundle: Bundle(for: self.getType())) 
     let views = bundle.instantiate(withOwner: self, options: nil) 
     return views.first as! UIView 
    } 

    func getType() -> AnyClass { 
     fatalError() 
    } 
} 

Wie kann ich Platzhalter für andere IBDesignables erstellen?

Antwort

0

Die Ansicht enthält zunächst die untergeordneten Elemente. Fügen Sie daher einer beliebigen Komponente, die untergeordnete Elemente benötigt, eine Containeransicht als Unteransicht hinzu.

func loadXib() { 
     var subview: UIView? = nil 
     if self.subviews.count > 0 { 
      subview = self.subviews[0] 
     } 
     subview?.removeFromSuperview() 

     self.view = self.viewFromXib() 
     self.view!.frame = self.bounds 
     self.view!.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight] 

     if let subview = subview { 
      let lConstraint = NSLayoutConstraint(item: subview, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, 
        toItem: self.view!, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 8) 
      let rConstraint = NSLayoutConstraint(item: subview, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, 
        toItem: self.view!, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: -8) 
      let tConstraint = NSLayoutConstraint(item: subview, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, 
        toItem: self.view!, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 8) 
      let bConstraint = NSLayoutConstraint(item: subview, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, 
        toItem: self.view!, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: -8) 
      self.view!.addSubview(subview) 
      self.view!.addConstraints([lConstraint, rConstraint, tConstraint, bConstraint]) 
     } 
     self.addSubview(self.view!) 
    } 

Dieser Ansatz kann mit Tags usw. verallgemeinert werden, um mehrere Teilansichten hinzuzufügen.

Verwandte Themen