환불이 보장되고 강화 된 콘크리트 견고한 방법으로 뷰를 동 기적으로 (호출 코드로 돌아 가기 전에) 그리 도록 강제하는 방법 은 CALayer
의 UIView
하위 클래스 와의 상호 작용 을 구성하는 것 입니다.
UIView 하위 클래스 displayNow()
에서 레이어에“ set course for display ”다음“ make it so ” 를 지시 하는 메서드를 만듭니다 .
빠른
/// Redraws the view's contents immediately.
/// Serves the same purpose as the display method in GLKView.
public func displayNow()
{
let layer = self.layer
layer.setNeedsDisplay()
layer.displayIfNeeded()
}
목표 -C
/// Redraws the view's contents immediately.
/// Serves the same purpose as the display method in GLKView.
- (void)displayNow
{
CALayer *layer = self.layer;
[layer setNeedsDisplay];
[layer displayIfNeeded];
}
또한 draw(_: CALayer, in: CGContext)
개인 / 내부 드로잉 메서드를 호출 할 메서드를 구현합니다 (every UIView
이 a 이므로 작동 함 CALayerDelegate
) .
빠른
/// Called by our CALayer when it wants us to draw
/// (in compliance with the CALayerDelegate protocol).
override func draw(_ layer: CALayer, in context: CGContext)
{
UIGraphicsPushContext(context)
internalDraw(self.bounds)
UIGraphicsPopContext()
}
목표 -C
/// Called by our CALayer when it wants us to draw
/// (in compliance with the CALayerDelegate protocol).
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
UIGraphicsPushContext(context);
[self internalDrawWithRect:self.bounds];
UIGraphicsPopContext();
}
그리고 internalDraw(_: CGRect)
안전 장치와 함께 사용자 지정 방법을 만듭니다 draw(_: CGRect)
.
빠른
/// Internal drawing method; naming's up to you.
func internalDraw(_ rect: CGRect)
{
// @FILLIN: Custom drawing code goes here.
// (Use `UIGraphicsGetCurrentContext()` where necessary.)
}
/// For compatibility, if something besides our display method asks for draw.
override func draw(_ rect: CGRect) {
internalDraw(rect)
}
목표 -C
/// Internal drawing method; naming's up to you.
- (void)internalDrawWithRect:(CGRect)rect
{
// @FILLIN: Custom drawing code goes here.
// (Use `UIGraphicsGetCurrentContext()` where necessary.)
}
/// For compatibility, if something besides our display method asks for draw.
- (void)drawRect:(CGRect)rect {
[self internalDrawWithRect:rect];
}
그리고 이제 myView.displayNow()
그릴 때 정말로 필요할 때마다 호출하십시오 (예 : CADisplayLink
콜백에서) . 우리의 displayNow()
메서드는 CALayer
to 에게 알려줄 displayIfNeeded()
것입니다. 그러면 동기식으로 다시 호출 draw(_:,in:)
하여에서 그리기를 수행하여 internalDraw(_:)
계속 진행하기 전에 컨텍스트에 그려진 내용으로 시각적 개체를 업데이트합니다.
이 접근 방식은 위의 @RobNapier와 유사하지만 displayIfNeeded()
을 추가로 호출 하여 setNeedsDisplay()
동기식으로 만드는 이점이 있습니다.
이것은 s가하는 CALayer
것보다 더 많은 그리기 기능을 노출 하기 때문에 가능합니다. UIView
레이어는 뷰보다 낮은 수준이고 레이아웃 내에서 고도로 구성 가능한 그리기를 위해 명시 적으로 설계되었으며 (Cocoa의 많은 것들과 마찬가지로) 유연하게 사용되도록 설계되었습니다. 부모 클래스, 위임자 또는 다른 드로잉 시스템에 대한 브리지 또는 자체적으로). CALayerDelegate
프로토콜 의 적절한 사용은 이 모든 것을 가능하게합니다.
의 구성 가능성에 대한 자세한 내용은 Core Animation Programming GuideCALayer
의 Setting Up Layer Objects 섹션 에서 찾을 수 있습니다 .