2015-03-13 6 views
26

Próbuję otworzyć MyCustomView z innej klasy, stosując następujący kod w ViewController.swift ..Jak utworzyć niestandardowy widok programowo w szybkich konieczności kontroli pole tekstowe, przycisk itp

var view = MyCustomView(frame: CGRectZero) 

.. w viewDidLoad metoda. Problem polega na tym, że widok nie zostaje zainicjowany w symulatorze.

Mam już ustawione klasy w storyboardie dla bieżącego ViewController.

class MyCustomView: UIView { 
    var label: UILabel = UILabel() 
    var myNames = ["dipen","laxu","anis","aakash","santosh","raaa","ggdds","house"] 

    override init(){ 
     super.init() 
    } 

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

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func addCustomView() { 
     label.frame = CGRectMake(50, 10, 200, 100) 
     label.backgroundColor=UIColor.whiteColor() 
     label.textAlignment = NSTextAlignment.Center 
     label.text = "test label" 
     label.hidden=true 
     self.addSubview(label) 

     var btn: UIButton = UIButton() 
     btn.frame=CGRectMake(50, 120, 200, 100) 
     btn.backgroundColor=UIColor.redColor() 
     btn.setTitle("button", forState: UIControlState.Normal) 
     btn.addTarget(self, action: "changeLabel", forControlEvents: UIControlEvents.TouchUpInside) 
     self.addSubview(btn) 

     var txtField : UITextField = UITextField() 
     txtField.frame = CGRectMake(50, 250, 100,50) 
     txtField.backgroundColor = UIColor.grayColor() 
     self.addSubview(txtField) 
    } 
+1

Nazywasz self.view.addSubview (myCustomView) kiedy go zainicjować? – IxPaka

Odpowiedz

29

jest równa prostokącie w pozycji (0,0) o zerowej szerokości i wysokości. To jest w porządku do użycia, a właściwie preferowane, jeśli używasz AutoLayout, ponieważ AutoLayout wtedy poprawnie umieści widok.

Ale oczekuję, że nie użyjesz AutoLayout. Więc najprostszym rozwiązaniem jest określenie rozmiaru widoku niestandardowego dostarczając ramkę wyraźnie:

customView = MyCustomView(frame: CGRect(x: 0, y: 0, width: 200, height: 50)) 
self.view.addSubview(customView) 

Należy pamiętać, że trzeba także używać addSubview inaczej twój widok nie jest dodawana do hierarchii widoku.

+0

dziękuje stefan ... ale mówienie CGRectZero i przekazywanie wartości robi wszystko. ? –

+0

ma sens, jeśli używasz automatycznego układu. Ponieważ w takim przypadku rzeczywiste położenie i rozmiar twojego widoku jest określony przez Auto Layout Constraints, a nie przez to, co przekazujesz do inicjalizatora 'init (frame:)'. –

+1

Czy ten wiersz powinien odczytywać "customView = MyCustomView (frame: CGRect (u góry: 0, lewy: 0, szerokość: 200, wysokość: 50))" zamiast "customView = MyCustomView (ramka: CGRectZero (u góry: 0, po lewej: 0 , szerokość: 200, wysokość: 50) ' – dumbledad

2
view = MyCustomView(frame: CGRectZero) 

W tej linii, którą próbujesz ustawić pusty rect do widoku niestandardowego. Dlatego nie możesz zobaczyć swojego widoku w symulatorze. Stała

+0

Próbowałem w ten sposób zbyt var view = MyCustomView (frame: CGRectMake (10, 40, 500, 500)) –

+0

i potrzebujesz metody addSubview metody połączenia z widoku kontrolera w viewDidLoad lub gdzieś. Na przykład. self.view.addSubview (yourView) –

+0

oh..yah masz rację !! Dzięki .... po prostu zapomniałem tego zrobić –

16

Swift 3/Swift 4 Aktualizacja:

let screenSize: CGRect = UIScreen.main.bounds 
let myView = UIView(frame: CGRect(x: 0, y: 0, width: screenSize.width - 10, height: 10)) 
self.view.addSubview(myView) 
3
var customView = UIView() 


@IBAction func drawView(_ sender: AnyObject) { 

    customView.frame = CGRect.init(x: 0, y: 0, width: 100, height: 200) 
    customView.backgroundColor = UIColor.black  //give color to the view 
    customView.center = self.view.center 
    self.view.addSubview(customView) 
     } 
+0

Dziękuję! zaoszczędziłem mój czas – Raja

+1

Cieszę się, że odpowiedź ci pomogła :) –

Powiązane problemy