سؤال

لدي nsimage يجري رسمها على فرعية من NSView. في سؤال سابق، ساعدت في رسمها منتصبا في الزاوية اليسرى العليا. الآن، أريد أن أكون قادرا على تدوير الصورة. لدي زر يزيد من متغير الدوران٪ 4، ثم أضرب هذا من قبل -90 للعثور على زاوية الدوران. ثم استخدم NSAffinTransform لإدارة الصورة، وترجمته مرة أخرى على الشاشة. ومع ذلك، لا يبدو أنه يعمل بالطريقة التي أتوقعها. لدي اثنين من المشاكل.

1) عندما تقوم بتدويره، يتم رسم جزء من الصورة الموجود في مجال غير موجود في الإطار السابق بشكل صحيح. ومع ذلك، فإن الجرعة التي كانت في السابق لا تزال هناك صورة أصلية. هذا يعني أنه بعد عدة تناوب، هناك مربع من الصورة المستقيمة الأصلية ثم مستطيل أدناه أو إلى يسار صورة تدوير.

2) عندما أعيد حجم النافذة، إعادة رسم الصورة (كما ينبغي) في اتجاه تستقيم الأصلي (كما لا ينبغي).

في الأساس، أنا أتطلع إلى استنتاج أن NsaffinTransform لا يعمل بالطريقة التي أعتقد أنها تفعل ذلك. هل هناك طريقة أخرى لتدوير الصورة (وترجمتها)؟ شكرا

جزء كبير من الكود: (الرمز بين "Works" و "Working End Works" هو رمز العمل لرسم الصورة فقط. لقد جاء من سؤالي السابق).

رمز قديم محذوف، استبدال أقل مع رمز جديد

شكرا

تحرير: تجد البحث أكثر قليلا أنه بدلا من القيام nsaffinettransform يمكنني تدوير الرأي. يبدو أن هذا يعمل بشكل أفضل. ومع ذلك، لا أستطيع الحصول على الترجمة للعمل على حق تماما. رمز جديد أدناه (Code Original Deleted لتوفير مساحة)

- (void)drawRect:(NSRect)rect
{

//WORKS
    NSRect frame;
    frame.origin = NSZeroPoint;
    frame.size = [image size];
// end works

    float deltaX, deltaY, height, width;

// if the rotate button was just clicked, we need to rotate by 90 deg, otherwise not
    double rotateDeg = justRot ? -90.0 : 0;

    justRot = NO;

// rotate

    deltaX = 0;
    deltaY = 0;

// translate to account for rotation

    height = [image size].height;
    width = [image size].width;

    switch (rotation)
    {
        case 0:
            NSLog(@"No rotation ");
            break;
        case 1: 
            deltaX += width;
            break;
        case 2:
            deltaX += width;
            deltaY +=  height;  
            break;
        case 3:
            deltaY += height;
            break;
    }


    NSPoint orig;
    if (rotation != 0)
    {
        orig.x = -100;
        orig.y = -100;
    }
    [self rotateByAngle: rotateDeg];
    NSLog(@"orig %f %f", orig.x, orig.y);
//  WORKS
    [self setFrame: frame];
    [image drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
// end works
    [self translateOriginToPoint: orig];    
}
هل كانت مفيدة؟

المحلول

حسنا، للتاريخ، في حالة وجود أي شخص آخر لديه هذا السؤال هنا هو الحل الذي وصلت إليه مع:

يبقى دوران الإطار في السحب، كل شيء آخر يتحرك إلى طريقة التدوير:

-(void)rotate
{
    float deltaX, deltaY, height, width;

    rotation = (rotation +1) % 4 ;

    deltaX = 0;
    deltaY = 0;

// translate to account for rotation

    height = [image size].height;
    width = [image size].width;

    switch (rotation)
    {
        case 0:
            NSLog(@"No rotation ");
            deltaY -= width;
        break;
        case 1: 
            deltaY -= height;
            break;
        case 2:
            deltaX += height-width;
            deltaY -= height ;  
            break;
        case 3:
            deltaX += height-width;
            deltaY -= width;
            break;
    }

    NSPoint orig;
    orig.x = deltaX;
    orig.y = deltaY;

    [self rotateByAngle: 90.0];
    [self translateOriginToPoint: orig];

    [self setNeedsDisplay:YES];
}

نصائح أخرى

أعتقد أنك ترغب في تدوير الصورة عن مركزها. إذا كان الأمر كذلك، فأنت بحاجة إلى ترجمة أصل التحويل الفوضى إلى مركز الصورة، ثم قم بتدويره، ثم يترجم مرة أخرى. الآن إذا كان لديك قطعة أثرية من موقف الإبطار، فمن الأرجح لأنك لم تتصل - [NSView SetneedsDisplayInRect:] مع المستطيلات الصحيحة. تذكر أنك تحتاج إلى إبطال كل من الصور السابقة والجديدة.

تحديث: لاحظت فقط أنك تقوم بتغيير إطار الرأي من داخل الدرجة :. لقد فات الأوان لتغيير الإطار. بدلا من ذلك، ارسم الصورة في الموقع الصحيح دون تغيير إطار العرض.

إلقاء نظرة على نموذج عينة نموذجي المحول القديم في: http://developer.apple.com/mac/library/sampleecode/transformed_image/index.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top