我是swift和编程的新手。我正在一个项目中工作,我必须处理从Landscape到Protrait的方向变化,反之亦然。每次方向改变时我都要改变不同变量的值,比如NSLayoutconstraint,字体大小......我在函数中写了这个改变
func updateValuesForAppropriateOrientations ()
{
if ipadPortrait()
{
//update variables for ipad portrait
}
else if ipadLandscape()
{
//update variables for ipad landscape
}
{
一切正常,但我在很多不同的ViewControllers中使用这个函数,我每次都在重写它。这是正确的方法,还是我应该使用继承?但是每个ViewController中的变量都不同,所以我不知道继承如何帮助。什么是最佳实践,如何使我的代码更清洁是我的问题。
答案 0 :(得分:1)
我认为现在鼓励我们这样做的方法是使用viewWillTransitionToSize:withTransitionCoordinator:方法。这是所有UIViewControllers都遵守的UIContentContainer协议的一部分。不要考虑屏幕方向,而是应该指示视图控制器在根视图大小设置为更改时采取操作。至于你必须为项目中的每个视图控制器重写函数,这对于需求是多余的,因为viewWillTransitionToSize会自动调用可能与viewController有关的任何更改。希望有所帮助。
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIContentContainer_Ref/
的详细信息答案 1 :(得分:0)
如果使所有变量具有相同的名称,则可以通过默认协议实现注入通用功能。
一个例子:
protocol Rotatable {
var height: Int { get set }
var width: Int { get set }
mutating func rotate()
}
extension Rotatable {
mutating func rotate() {
let temp = height
height = width
width = temp
}
}
class Foo {
var height = 1
var width = 2
}
struct Bar {
var height = 10
var width = 20
}
extension Foo: Rotatable { }
extension Bar: Rotatable { }
var foo = Foo()
var bar = Bar()
print("Foo is \(foo.height)x\(foo.width)") // Foo is 1x2
print("Bar is \(bar.height)x\(bar.width)") // Bar is 10x20
foo.rotate()
bar.rotate()
print("Foo is \(foo.height)x\(foo.width)") // Foo is 2x1
print("Bar is \(bar.height)x\(bar.width)") // Bar is 20x10