Грязный текст при перетаскивании NSSegmentedControl

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

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

Первоначальный вид

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

Контроль с нечетким текстом

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

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

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

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

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

Изменить: вот код перетаскивания:

//
//  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.


person northernman    schedule 27.05.2020    source источник
comment
У вас есть какой-то код перетаскивания, верно? Хотите поделиться с нами? (Мне кажется, что вы могли бы даже опубликовать демонстрационный проект.)   -  person matt    schedule 27.05.2020
comment
Я отредактировал исходный пост, включив в него код перетаскивания.   -  person northernman    schedule 28.05.2020
comment
Мне любопытно, помогает ли вообще указание superview setNeedsDisplayInRect.   -  person matt    schedule 28.05.2020
comment
Также убедитесь, что вы заканчиваете на целой точке.   -  person matt    schedule 28.05.2020
comment
Почему setNeedsDisplayInRect имеет какой-либо эффект, и что бы я все равно установил для invalidRect? Насколько я могу судить, я выполняю абсолютно базовую операцию перетаскивания, с которой Cocoa должен справиться безупречно. Там вообще ничего необычного не происходит. Кроме того, почему меня должно волновать, закончу ли я целой точкой? Это проблема Cocoa - иметь дело с отображением для отображения координат, а не моя.   -  person northernman    schedule 28.05.2020
comment
Хорошо, так что нет желания даже попробовать предложение? Я имею в виду, что это всего лишь идея, она не взорвет компьютер.   -  person matt    schedule 28.05.2020
comment
Нет - полностью готов попробовать что-нибудь :-) Что я должен установить для invalidRect?   -  person northernman    schedule 28.05.2020
comment
Интересно, что если я закомментирую mouseDragged и просто немного сдвину окно всякий раз, когда происходит mouseDown, текст останется четким, даже если представление будет перемещено. Таким образом, это, по-видимому, связано с методом mouseDragged.   -  person northernman    schedule 28.05.2020


Ответы (1)


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

// 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;
}

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

person northernman    schedule 28.05.2020