Как изменить NSRect на CGRect? - PullRequest
3 голосов
/ 22 июня 2011
-(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, помогите!

пс.я уже знаю .. NSRect -> CGRect, NSZeroPoint -> CGRectZero

Ответы [ 3 ]

17 голосов
/ 23 июня 2011

Просто используйте эти 2 функции Какао (без iOS):

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

Загляните сюда, чтобы углубить тему: http://cocoadev.com/CGRect

5 голосов
/ 17 августа 2016

Если вы столкнулись с этим в iOS, например, с UIKeyboardFrameEndUserInfoKey, важно знать, что NSRect является подклассом NSValue.

if let rectValue = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue {
    let rect = rectValue.CGRectValue()
    // Use your CGRect
}
0 голосов
/ 18 декабря 2018

Если вы используете Apple Foundation, а не GNUStep или что-то еще странное ...


Objective-C

NSRect - это просто typedefCGRect (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

В Swift,NSRect - это всего лишь typealias из CGRect (NSGeometry.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...