2014-12-02 6 views
9

저는 프로그램을 신속하게 작성하고 있었는데 지금은 CGSize 너비와 높이를 사용하지 않고 CGRect 프레임의 너비와 높이 속성에 직접 액세스 할 수 있다는 것을 알았습니다. 이제는 이와 같은 코드를 작성할 수 있습니다. 나도 같은 코드를 작성하려고 할 때 목표 C에서 frame.size.width와 frame.width의 차이점

@IBOutlet var myView: UIView! 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    var height = myView.frame.height 
    var height1 = myView.frame.size.height 
} 

는 라인 height = view.frame.height 오류를 던지고있다. 누구든지이 두 줄의 코드에서 차이점이 있다면 말해 줄 수 있습니까?

답변

20

난 그냥 CGRect 구조 참조를 들여다 보았습니다. Swift에는 멤버가 heightwidth 인 확장이 정의되어 있습니다. 당신이 직접 CGRect에서 heightwidth 값을 가져 오기 할 수 있도록

struct CGRect { 
var origin: CGPoint 
var size: CGSize 
} 

extension CGRect { 
    ... 
    var width: CGFloat { get } 
    var height: CGFloat { get } 
    ... 
} 

아래의 코드에서 참조하시기 바랍니다. 당신이이 만 getters 있습니다 볼 수 있습니다, 그래서 당신은 view.frame.height = someValue

+0

감사합니다. 이 참조를 찾을 수있는 링크를 제공 해줄 수 있습니까? 나는 문서를 확인했지만 어디에도이 확장을 보지 못했습니다 :/ –

+0

'Command' 키를 ​​누르고 'Class/Variable'을 가리킨 다음 클릭하십시오. –

1

frame 사용하여이 값을 설정하려고하면 오류가 발생하는 것으로 떨어져 그 widthheightgetters을 가지고 CGRect 구조, 그들은 단지 긍정적이 될 수. 문서에서 :

높이가 CGRect 데이터 구조에 양수 또는 음수로 저장되어 있는지 여부에 관계없이이 함수는 사각형이 표준화 된 것처럼 높이를 반환합니다. 즉, 결과는 결코 음수가 아닙니다.

그러나 size이 문서에서 CGSize 구조이다

CGSize 구조체 때로는 오히려 실제 크기보다는 거리 벡터를 나타내는 데 사용된다. 벡터의 값은 음수이 될 수 있습니다. CGRect 구조를 크기를 양수 값으로 나타내도록 정규화하려면 표준화 함수를 호출하십시오.

그래서 차이점은 분명합니다.

1

목표 코드에서 동일한 코드를 작성하려고 시도했을 때 height = view.frame.height 행에 오류가 발생했습니다. 누구든지이 두 줄의 코드에서 차이점이 있다면 말해 줄 수 있습니까?

CGGeometry.h는 두 가지 유형을 정의합니다. 그 중 C struct CGRect입니다. 이 구조체에는 origin과 size라는 두 개의 멤버가 있습니다.

도트 표기법을 사용하여 C (및 Objective-C)로 모두 액세스 할 수 있습니다. C 나 Objective-C는 구조체의 확장을 제공하지 않습니다.

Swift는 형식을 Swift 구조체로 가져옵니다. 차이점은 Swift 이 구조체의 확장을 허용한다는 것입니다.그래서 확장으로 몇 가지 무료 C의 기능을 표시합니다 :

CGRectGetMinX() — CGRect.minX 
CGRectGetMidX() — CGRect.midX 
CGRectGetMaxX() — CGRect.maxX 
CGRectGetWidth() — CGRect.width 
[... same for y] 

이 C의 기능은 나이가-그들은 단지있는 CoreGraphics의 먼지가 구석에가 살고 있기 때문에입니다.

매우 유용하지만 의미를 알아야합니다 (표준 접근 자와 약간 다릅니다). 치수를 표준화합니다.

이것은 음의 너비 또는 높이를 갖는 rect를 양의 크기와 오프셋 된 원점을 가진 동일한 영역을 포함하는 rect로 변환한다는 것을 의미합니다.

let rect = CGRect(x: 0, y: 0, width: 10, height: -10) 
assert(rect.width == rect.size.width) // OK 
assert(rect.height == rect.size.height) // boom