2015-04-27 11 views
10

Wyłączono automatyczny układ widoku. Jednak to nie działa. Nie mam ograniczeń dotyczących wysokości. Tylko szerokość, która jest równa szerokości widoku rodzica.Zmiana wysokości UIView z wyłączonym autolayout

@IBOutlet weak var questionTextView: UITextView! 
override func viewDidLoad() { 
    var newFrame = CGRectMake(0, 0, 300, 202) 
    questionView.frame = newFrame 
} 
+0

dla mnie to działa! upewnij się, że podłączyłeś gniazdo i wywołasz 'super.viewDidLoad()' na początku twojej implementacji 'viewDidLoad'! –

Odpowiedz

29

Czy wyłączyłeś automatyczny układ całej stalówki w narzędziu do tworzenia interfejsów?

Nie można wyłączyć automatycznego układu dla określonych widoków podrzędnych w programie budującym interfejs - można to zrobić programowo w środowisku wykonawczym.

Na podstawie tego, co powiedziałeś, nadal masz aktywne ograniczenie. Jak masz ograniczenia po wyłączeniu automatycznego układu?

Jeśli masz aktywny układ automatyczny, ustawienie wysokości widoku przy użyciu ramki nie będzie działać, ponieważ będzie kolidować z regułami automatycznego układu.

Jeśli trzeba zmienić wysokość widoku z układem automatycznego aktywny, musisz utworzyć IBOutlet do ograniczenia wysokości i modyfikacji, które w czasie wykonywania, tj:

@IBOutlet weak var heightConstraint: NSLayoutConstraint! 

self.heightConstraint.constant = 200 
+0

Metoda ograniczenia działa świetnie. Dziękuję za wyjaśnienie układu automatycznego. – Philip

+0

Ładne rozwiązanie, na które zasługujesz. Próbowałem zmienić wysokość uiview w łatwy sposób, a nie jak tworzyć ramkę, a następnie przypisać ramkę, a twoje rozwiązanie dobrze pasowało do moich potrzeb. –

+0

To rozwiązanie działa jak urok w systemie iOS 8, Xcode 7.2. Korzystam z tej techniki, aby uwolnić nieruchomość zajętą ​​przez baner iad, gdy nie otrzymuje reklam. Robię to, zmieniając ograniczenie wysokości na 1. – Jervisbay

1

Spróbuj coś takiego :

var someView = UITextView(frame: CGRect(x: 0, y: 0, width: **view.bounds.size.width**, height: 123)) 
     someView.layer.backgroundColor = UIColor.orangeColor().CGColor 
     view.addSubview(someView) 

W twoim przypadku zmień widok z widokiem rodzica.

3

[edited]

PS. Zgodnie z zaakceptowaną odpowiedzią: If you have auto layout active, setting the height for your view by using the frame won't work since it'll conflict with auto layout rules. Ten spokój kodu zmienia ramkę, więc jeśli spróbujesz użyć tego kodu z Auto Layout, to nie zadziała.


[oryginalna odpowiedź]

Można również utworzyć UIView Rozszerzenie:

UIViewExtensions.swift:

import Foundation 
import UIKit 

extension UIView { 

    // MARK: - Frame 

    /** 
    Redefines the height of the view 

    :param: height The new value for the view's height 
    */ 
    func setHeight(height: CGFloat) { 

     var frame: CGRect = self.frame 
     frame.size.height = height 

     self.frame = frame 
    } 

    /** 
    Redefines the width of the view 

    :param: width The new value for the view's width 
    */ 
    func setWidth(width: CGFloat) { 

     var frame: CGRect = self.frame 
     frame.size.width = width 

     self.frame = frame 
    } 

    /** 
    Redefines X position of the view 

    :param: x The new x-coordinate of the view's origin point 
    */ 
    func setX(x: CGFloat) { 

     var frame: CGRect = self.frame 
     frame.origin.x = x 

     self.frame = frame 
    } 

    /** 
    Redefines Y position of the view 

    :param: y The new y-coordinate of the view's origin point 
    */ 
    func setY(y: CGFloat) { 

     var frame: CGRect = self.frame 
     frame.origin.y = y 

     self.frame = frame 
    } 
} 

Dodałem też metody ustawiania szerokości , X i Y. Możesz użyć tego rozszerzenia w dowolnym widoku, który chcesz:

yourView.setHeght(100) 
1

Wystarczy wdrożyć translatesAutoresizingMaskIntoConstraints i ustawiając ją na true, można napisać swoje ograniczenia poprzez kod bez konieczności robić inne rzeczy.

Przykład: view.translatesAutoresizingMaskIntoConstraints = true

// Ten kod będzie działać

view.frame = CGRect(x: self.playerChatBackground.frame.origin.x, y:          
self.playerChatBackground.frame.origin.y, width: 100.0, height: 36.0) 
Powiązane problemy