如何将NSRect更改为CGRect?

时间:2011-06-22 12:52:51

标签: cocoa macos

-(void)drawRect : (NSRect)rect 
{    
        imgRect.orgin = NSZeroPoint;

        imgRect.size = [appleImage size];

        drawRect = [self bounds];

        [appleRect drawInRect:appleRect     
                     fromRect:imgRect     
                     operation:NSCompositeSourceOver     
                     fraction:1.0];
        ...     
}

我正在尝试这一点,但这并不容易让我发疯。

如何将NSRect类型代码更改为CGRect类型代码?

PLZ帮忙!

PS。我已经知道.. NSRect - > CGRect,NSZeroPoint - > CGRectZero

4 个答案:

答案 0 :(得分:17)

只需使用这两个Cocoa(无iOS)功能:

CGRect NSRectToCGRect(NSRect nsrect);
NSRect NSRectFromCGRect(CGRect cgrect);

请看这里加深主题:http://cocoadev.com/CGRect

答案 1 :(得分:5)

如果您在iOS中遇到此问题,例如UIKeyboardFrameEndUserInfoKey,则必须知道NSRectNSValue的子类。

if let rectValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue {
    let rect = rectValue.CGRectValue()
    // Use your CGRect
}

答案 2 :(得分:0)

假设您使用的是Apple的Foundation,而不是GNUStep或其他奇怪的东西...


Objective-C

NSRect is just a typedef of CGRect(第NSGeometry.h行第30行),因此您可以在任何地方简单地使用其中一个来代替另一个。

void takeCgRect(CGRect rect) {
    NSLog(@"A core graphics rectangle at %@ with size %@", NSStringFromCGPoint(rect.origin), NSStringFromCGSize(rect.size))
}


void takeNsRect(NSRect rect) {
    NSLog(@"A NeXTStep rectangle at %@ with size %@", NSStringFromPoint(rect.origin), NSStringFromSize(rect.size))
}


// ELSEWHERE:



NSRect nsTest1 = NSRectMake(1, 2, 3, 4)
CGRect cgTest1 = CGRectMake(1, 2, 3, 4)
CGRect cgTest2 = CGRectMake(100, 200, 300, 400)

NSLog(@"%@", @(nsTest1 == cgTest1)) // 1


takeCgRect(nsTest1) // A core graphics rectangle at {1.0, 2.0} with size {3.0, 4.0}
takeNsRect(cgTest2) // A NeXTStep rectangle at {100.0, 200.0} with size {300.0, 400.0}

迅速

在Swift中,NSRect is just a typealias of CGRectNSGeometry.swift第435行),因此您可以在任何地方简单地使用另一个。

let nsTest1 = NSRect(x: 1, y: 2, width: 3, height: 4)
let cgTest1 = CGRect(x: 1, y: 2, width: 3, height: 4)
let cgTest2 = CGRect(x: 100, y: 200, width: 300, height: 400)

print(nsTest1 == cgTest1) // true


func takeCgRect(_ rect: CGRect) {
    print("A core graphics rectangle at \(rect.origin) with size \(rect.size)")
}


func takeNsRect(_ rect: NSRect) {
    print("A NeXTStep rectangle at \(rect.origin) with size \(rect.size)")
}


takeCgRect(nsTest1) // A core graphics rectangle at (1.0, 2.0) with size (3.0, 4.0)
takeNsRect(cgTest2) // A NeXTStep rectangle at (100.0, 200.0) with size (300.0, 400.0)

答案 3 :(得分:0)

SWIFT 5

它对我有用。在 let 之前使用 'if'。

            let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
            print("\(String(describing: keyboardFrame?.height))")