Нечеткий текст при перетаскивании NSSegmentedControl - PullRequest
0 голосов
/ 27 мая 2020

У меня есть NSSegmentedControl в перетаскиваемом представлении (это значительно упрощенный тестовый пример, демонстрирующий проблему).

При первом создании все выглядит нормально, как на этом изображении:

Initial View

Вид со светло-зеленым фоном можно перетаскивать. Если я слегка перетащу его, текст в нижнем элементе NSSegmentedControl станет «грязным», как на этом изображении:

Control with muddy text

Кроме того, пока отображается представление при перетаскивании текст в NSSegmentedControl мерцает.

Все представления и элементы управления создаются в виде пера, и нет необычного кода. Для свойства WishLayer представления установлено значение YES, чтобы можно было отобразить цвет границы и фона. Это сделано для того, чтобы упростить выявление проблемы, но проблема возникает, даже если для параметра wantLayer установлено значение NO.

Проблема возникает только при перетаскивании представления. Перетаскивание главного окна приложения не вызывает этого эффекта.

Это на MacOS High Sierra 10.13.6, XCode 10.1

Это сводит меня с ума, поэтому любая помощь приветствуется!

Edit: Вот код перетаскивания:

//
//  DraggableView.h
//

#import <Cocoa/Cocoa.h>

@interface DraggableView : NSView

@property(assign,nonatomic) NSPoint dragStart;
@property(assign,nonatomic) NSPoint startOrigin;

@end



//
//  DraggableView.m
//

#import "DraggableView.h"

@implementation DraggableView

// mouseDown - start dragging

- (void) mouseDown:(NSEvent *)theEvent {

    _dragStart = [[self superview] convertPoint:[theEvent locationInWindow] fromView:nil];
    _startOrigin = [self frame].origin;
}

// mouseDragged - move the view

- (void) mouseDragged:(NSEvent *)theEvent {

    CGPoint currentDrag = [[self superview] convertPoint:[theEvent locationInWindow] fromView:nil];

    CGPoint newOrigin = self.startOrigin;
    newOrigin.x += (currentDrag.x - _dragStart.x);
    newOrigin.y += (currentDrag.y - _dragStart.y);

    [self setFrameOrigin:newOrigin];
}

@end

Весь другой код является стандартным шаблоном Cocoa для приложения на основе документа.

Файл пера определяет перетаскиваемое представление как экземпляр класс DraggableView.

1 Ответ

0 голосов
/ 28 мая 2020

Я решил эту проблему, изменив свой код перетаскивания следующим образом:

// mouseDragged - move the view

- (void) mouseDragged:(NSEvent *)theEvent {

    CGPoint newOrigin = self.startOrigin;
    newOrigin.x += theEvent.deltaX;
    newOrigin.y -= theEvent.deltaY;

    [self setFrameOrigin:newOrigin];

    _startOrigin = newOrigin;
}

Основная причина этой проблемы заключалась в том, что исходная точка перетаскиваемого представления имела нецелочисленные координаты. Спасибо Мэтту за то, что указал мне в правильном направлении.

...