Как я могу получить NSScrollView, чтобы соблюдать обтравочный контур - PullRequest
2 голосов
/ 11 марта 2011

Я пытаюсь создать NSScrollView с обрезанными углами, как в приложении Twitter:

enter image description here

У меня есть подкласс NSScrollView, в который я добавил следующий код:

- (void)drawRect:(NSRect)dirtyRect {
    NSBezierPath *pcath = [NSBezierPath bezierPathWithRoundedRect:[self bounds] xRadius:kDefaultCornerRadius yRadius:kDefaultCornerRadius];
    [path setClip];

    [super drawRect:dirtyRect];
}

Я ожидал, что содержимое NSScrollView будет иметь закругленные углы, но оно не учитывает обтравочный контур.Как я могу это сделать?

ОБНОВЛЕНИЕ И УТОЧНЕНИЕ Я знаю, как сделать кастом NSScroller, я знаю, как сделать его прозрачным наложением.Все, что я спрашиваю, это как заставить NSSCrollView обрезать его углы, включая все, что в нем содержится.NSScrollView находится внутри NSView, у которого есть фон, который может измениться, а это означает, что наложение вида для имитации закругленных углов не вариант.

Ответы [ 3 ]

6 голосов
/ 03 апреля 2012

После долгих потрясений я только что обнаружил, что NSScrollView можно сделать так, чтобы он имел закругленные углы, просто придав ему защитный слой и установив радиус угла этого слоя при условии , что вы также делаете свнутренний NSClipView.Требуются оба, что теперь имеет смысл, поскольку именно представление клипа фактически обеспечивает видимое окно в представлении документа NSScrollView.

NSScrollView * scrollView = ...;

// Give the NSScrollView a backing layer and set it's corner radius.
[scrollView setWantsLayer:YES];
[scrollView.layer setCornerRadius:10.0f];

// Give the NSScrollView's internal clip view a backing layer and set it's corner radius.
[scrollView.contentView setWantsLayer:YES];
[scrollView.contentView.layer setCornerRadius:10.0f];
4 голосов
/ 14 марта 2011

Вы можете применить маску к слою вида:

[myScrollView setWantsLayer: YES];
[myScrollView layer].mask = ...;

Маска другая CALayer. Таким образом, в этом случае вы создадите CALayer, установите его цвет фона на непрозрачный, установите его границы в соответствии с видом прокрутки и дадите ему cornerRadius, скажем, 8.0.

Результатом будет то, что представление прокрутки и все его содержимое будут казаться замаскированными в скругление с радиусом угла 8px.

3 голосов
/ 18 марта 2011

Вы пытались переопределить

- (BOOL)isOpaque {
  return NO;
}

И установить для вида прокрутки -setDrawsBackground: значение NO, просто оставить вид без обрезки и просто нарисовать углы с помощью [NSColor clearColor], поскольку это также очиститосновной цвет и имитировать эффект округления.

...