2016-08-21 3 views
0

Ich lerne gerade, wie man benutzerdefinierte UIViews erstellt. Diese spezielle Ansicht, die ich mache, enthält ein paar Knöpfe. Ich bemerkte, wenn ich die Eigenschaft frame/height innerhalb des Lazy-Instantiierungsblocks aufruft, erhalte ich den Wert 128, aber wenn ich die Eigenschaft height für das Argument rect in der Funktion drawRect zusammen mit den Grenzen anrufe, erhalte ich den Wert 94.UIView Grenzen/Rahmen passt nicht zu drawRect

Ich verstehe nicht, warum die Eigenschaften bounds/frame width/height, die von der drawRect-Funktion aufgerufen werden, nicht mit der im Initialisierer verwendeten Rahmen-/Begrenzungshöhe und -breite übereinstimmen. Kann jemand das erklären?

@IBDesignable 
class GroupingMetaDataView: UIView { 

    @IBInspectable var strokeColor: UIColor = 
     UIColor.blackColor().colorWithAlphaComponent(0.4) 

    @IBInspectable var strokeWidth: CGFloat = 2.0 


    lazy var subButton: AddButton! = { 
     print("frame height: \(self.frame.height)") 
     print("bounds height: \(self.bounds.height)") 
     let width = self.frame.width * 0.087 
     let size = CGSize(width: width, height: width) 
     let frame = CGRect(origin: CGPoint(x: self.frame.width * 0.055, 
              y: self.frame.height * 0.5), size: size) 
     let button = AddButton(frame: frame, isAddButton: false) 

     return button 
    }() 

    lazy var addButton: AddButton! = { 
     let width = self.frame.width * 0.087 
     let size = CGSize(width: width, height: width) 
     let frame = CGRect(origin: CGPoint(x: self.frame.width * 0.857, 
              y: self.frame.height), size: size) 
     let button = AddButton(frame: frame, isAddButton: true) 

     return button 
    }() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     self.setupUI() 

    } 

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

    // Only override drawRect: if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func drawRect(rect: CGRect) { 
     // Drawing code 
     print("rect height: \(rect.height)") 
     print("boundsheight: \(bounds.height)") 

     let context = UIGraphicsGetCurrentContext() 
     CGContextSetLineWidth(context, strokeWidth) 
     strokeColor.setStroke() 

     let topBarPath = UIBezierPath() 
     topBarPath.moveToPoint(CGPoint(x: 0.0, y: 2.0)) 
     topBarPath.addLineToPoint(CGPoint(x: rect.width, y: 2.0)) 

     topBarPath.lineWidth = strokeWidth 
     topBarPath.stroke() 

     let bottomBarPath = UIBezierPath() 
     bottomBarPath.moveToPoint(CGPoint(x: 0.0, y: rect.height-2.0)) 
     bottomBarPath.addLineToPoint(CGPoint(x: rect.width, y: rect.height-2.0)) 

     bottomBarPath.lineWidth = strokeWidth 
     bottomBarPath.stroke() 
    } 

    // MARK: Setup 

    func setupUI() { 
     self.backgroundColor = UIColor.yellowColor() 
     addSubview(subButton) 
     addSubview(addButton) 
    } 
} 

Edit:

ich die GroupingMetaDataView aus den Viewcontroller erstellen. YardageMetaDataView ist eine Unterklasse von GroupingMetaDataView. Die YardageMetaDataView führt keine benutzerdefinierten Zeichnungen aus.

bemerkte ich die Dokumentation für den drawRect Parameter besagt, dass

Der Anteil der Grenzen der Ansicht, die aktualisiert werden muss. Die erste Zeit, die Ihre Ansicht gezeichnet wird, ist dieses Rechteck normalerweise die gesamten sichtbaren Grenzen Ihrer Ansicht. Während der nachfolgenden Zeichenoperationen kann das Rechteck jedoch nur einen Teil Ihrer Ansicht angeben.

Wann und warum würde der Parameter rect nur einen Teil der Ansicht angeben? Der drawRect wird beim nächsten Zeichenzyklus aufgerufen, nachdem setNeedsDisplay ausgelöst wurde. SetNeedsDisplay nimmt keine Parameter an, also nehme ich an, dass der Parameter die gesamte Ansicht darstellt?

ViewController.swift

class ViewController: UIViewController { 

// MARK: - Properties 

    lazy var yMetaDataView: YardageMetaDataView! = { 
     let view = YardageMetaDataView(frame: CGRect(origin: CGPoint(x: 50, y: 100), 
            size: CGSize(width: self.view.bounds.width * 0.75, 
               height: self.view.bounds.height * 0.102))) 
     view.translatesAutoresizingMaskIntoConstraints = false 
     return view 
    }() 
} 
+0

Wo ist der Code, wo Sie es zu einer übergeordneten Ansicht hinzufügen? – nhgrif

+0

@nhgrif Ich habe gerade die Codes hinzugefügt, die die Ansicht instanziiert. – gofly

Antwort

0

es eine andere Methode, um setNeedsDisplay ähnlich ist genannt setNeedsDisplay (_ :). Wenn letzterer aufgerufen wird, ist der an übergebene Parameter drawRect (_ :) derjenige, den Sie in diesem Aufruf übergeben haben. Dieser rechteckige Bereich wird als ungültig markiert und muss neu gezeichnet werden.

Ich weiß nicht, ob Sie setNeedsDisplay (_ :) oder nicht aufgerufen haben. Es ist deine Aufgabe, es herauszufinden. Viel Glück. :)

Verwandte Themen