2017-02-07 1 views
0

아이폰 OS 10.2 스위프트 스위프트 동일한 코드의 다른. 나는이 같은 코딩을 다시두 루틴 목적 C에 하나, 스위프트 3.0 목표 C에서이 코드를 변환하고 너무 잘 핵심 그래픽 라이브러리를 모르는 시도 3.0</p> <p>본질적으로 다른 결과

@interface SPGripViewBorderView : UIView 
@end 

@implementation SPGripViewBorderView 

- (id)initWithFrame:(CGRect)frame { 
if ((self = [super initWithFrame:frame])) { 
    // Clear background to ensure the content view shows through. 
    self.backgroundColor = [UIColor clearColor]; 
} 
return self; 
} 

- (void)drawRect:(CGRect)rect { 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(context); 

// (1) Draw the bounding box. 
CGContextSetLineWidth(context, 1.0); 
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor); 
CGContextAddRect(context, CGRectInset(self.bounds, kSPUserResizableViewInteractiveBorderSize/2, kSPUserResizableViewInteractiveBorderSize/2)); 
CGContextStrokePath(context); 

// (2) Calculate the bounding boxes for each of the anchor points. 
CGRect upperLeft = CGRectMake(0.0, 0.0, kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize); 
CGRect upperRight = CGRectMake(self.bounds.size.width - kSPUserResizableViewInteractiveBorderSize, 0.0, kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize); 
CGRect lowerRight = CGRectMake(self.bounds.size.width - kSPUserResizableViewInteractiveBorderSize, self.bounds.size.height - kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize); 
CGRect lowerLeft = CGRectMake(0.0, self.bounds.size.height - kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize); 
CGRect upperMiddle = CGRectMake((self.bounds.size.width - kSPUserResizableViewInteractiveBorderSize)/2, 0.0, kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize); 
CGRect lowerMiddle = CGRectMake((self.bounds.size.width - kSPUserResizableViewInteractiveBorderSize)/2, self.bounds.size.height - kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize); 
CGRect middleLeft = CGRectMake(0.0, (self.bounds.size.height - kSPUserResizableViewInteractiveBorderSize)/2, kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize); 
CGRect middleRight = CGRectMake(self.bounds.size.width - kSPUserResizableViewInteractiveBorderSize, (self.bounds.size.height - kSPUserResizableViewInteractiveBorderSize)/2, kSPUserResizableViewInteractiveBorderSize, kSPUserResizableViewInteractiveBorderSize); 

// (3) Create the gradient to paint the anchor points. 
CGFloat colors [] = { 
    0.4, 0.8, 1.0, 1.0, 
    0.0, 0.0, 1.0, 1.0 
}; 
CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB(); 
CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2); 
CGColorSpaceRelease(baseSpace), baseSpace = NULL; 

// (4) Set up the stroke for drawing the border of each of the anchor points. 
CGContextSetLineWidth(context, 1); 
CGContextSetShadow(context, CGSizeMake(0.5, 0.5), 1); 
CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); 

// (5) Fill each anchor point using the gradient, then stroke the border. 
CGRect allPoints[8] = { upperLeft, upperRight, lowerRight, lowerLeft, upperMiddle, lowerMiddle, middleLeft, middleRight }; 
for (NSInteger i = 0; i < 8; i++) { 
    CGRect currPoint = allPoints[i]; 
    CGContextSaveGState(context); 
    CGContextAddEllipseInRect(context, currPoint); 
    CGContextClip(context); 
    CGPoint startPoint = CGPointMake(CGRectGetMidX(currPoint), CGRectGetMinY(currPoint)); 
    CGPoint endPoint = CGPointMake(CGRectGetMidX(currPoint), CGRectGetMaxY(currPoint)); 
    CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0); 
    CGContextRestoreGState(context); 
    CGContextStrokeEllipseInRect(context, CGRectInset(currPoint, 1, 1)); 
} 
CGGradientRelease(gradient), gradient = NULL; 
CGContextRestoreGState(context); 
} 

@end 

...

수입 UIKit

class GripViewBorderView: UIView { 

    let kUserResizableViewInteractiveBorderSize:CGFloat = 10.0 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 


    override func draw(_ rect:CGRect) { 
     let context = UIGraphicsGetCurrentContext(); 
     context!.saveGState(); 

     // (1) Draw the bounding box. 
     context!.setLineWidth(1.0); 
     context!.setStrokeColor(UIColor.blue.cgColor) 
     //CGContextAddRect(context!, CGRectInset(self.bounds, (kSPUserResizableViewInteractiveBorderSize/2.0), (kSPUserResizableViewInteractiveBorderSize/2.0))); 
     context!.addRect(self.bounds.insetBy(dx: (kUserResizableViewInteractiveBorderSize/2.0), dy: (kUserResizableViewInteractiveBorderSize/2.0))) 
     context!.strokePath(); 

     // (2) Calculate the bounding boxes for each of the anchor points. 
     let upperLeft = CGRect(x: 0.0, y: 0.0, width: kUserResizableViewInteractiveBorderSize, height: kUserResizableViewInteractiveBorderSize) 
     let upperRight = CGRect(x: self.bounds.size.width - kUserResizableViewInteractiveBorderSize, y: 0.0, width: kUserResizableViewInteractiveBorderSize, height: kUserResizableViewInteractiveBorderSize); 
     let lowerRight = CGRect(x: self.bounds.size.width - kUserResizableViewInteractiveBorderSize, y: self.bounds.size.height - kUserResizableViewInteractiveBorderSize, width: kUserResizableViewInteractiveBorderSize, height: kUserResizableViewInteractiveBorderSize); 
     let lowerLeft = CGRect(x: 0.0, y: self.bounds.size.height - kUserResizableViewInteractiveBorderSize, width: kUserResizableViewInteractiveBorderSize, height: kUserResizableViewInteractiveBorderSize); 
     let upperMiddle = CGRect(x: (self.bounds.size.width - kUserResizableViewInteractiveBorderSize)/2, y: 0.0, width: kUserResizableViewInteractiveBorderSize, height: kUserResizableViewInteractiveBorderSize); 
     let lowerMiddle = CGRect(x: (self.bounds.size.width - kUserResizableViewInteractiveBorderSize)/2, y: self.bounds.size.height - kUserResizableViewInteractiveBorderSize, width: kUserResizableViewInteractiveBorderSize, height: kUserResizableViewInteractiveBorderSize); 
     let middleLeft = CGRect(x: 0.0, y: (self.bounds.size.height - kUserResizableViewInteractiveBorderSize)/2, width: kUserResizableViewInteractiveBorderSize, height: kUserResizableViewInteractiveBorderSize); 
     let middleRight = CGRect(x: self.bounds.size.width - kUserResizableViewInteractiveBorderSize, y: (self.bounds.size.height - kUserResizableViewInteractiveBorderSize)/2, width: kUserResizableViewInteractiveBorderSize, height: kUserResizableViewInteractiveBorderSize); 

     // (3) Create the gradient to paint the anchor points. 
     let baseSpace = CGColorSpaceCreateDeviceRGB() 
     //let gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2) 
     let colors = [UIColor.red.cgColor, 
        UIColor.yellow.cgColor] 

     let gradient = CGGradient(colorsSpace: baseSpace, colors: colors as CFArray, locations: nil) 

     // (4) Set up the stroke for drawing the border of each of the anchor points. 
     context!.setLineWidth(1) 
     context!.setShadow(offset: CGSize(width: 0.5, height: 0.5), blur: 1) 
     context!.setStrokeColor(UIColor.white.cgColor) 

     // (5) Fill each anchor point using the gradient, then stroke the border. 
     let allPoints:[CGRect] = [ upperLeft, upperRight, lowerRight, lowerLeft, upperMiddle, lowerMiddle, middleLeft, middleRight ]; 
     for i in 0 ... 7 { 
      let currPoint = allPoints[i] 
      context!.saveGState() 
      context!.addEllipse(in: currPoint) 
      context!.clip() 
      let startPoint = CGPoint(x: currPoint.midX, y: currPoint.minY); 
      let endPoint = CGPoint(x: currPoint.midX, y: currPoint.maxY); 
      context!.drawLinearGradient(gradient!, start: startPoint, end: endPoint, options: .init(rawValue: 0)) 
      context!.saveGState() 
      context!.strokeEllipse(in: currPoint.insetBy(dx: 1, dy: 1)) 
     } 
     context!.restoreGState() 
    } 


} 

하지만 뭔가가 OOC가 오른쪽에 나의 새로운 스위프트 왼쪽에 원인이 놓쳤다. 나는 OOC 버전이 8 개의 도트를 정확하게 그린 점만 볼 수 있습니다.

enter image description here

+0

감사합니다 grimxn, 나는 나무에 대한 나무를 볼 수 없었다! – user3069232

답변

1

당신은 GSTATE (컨텍스트)을 복원 CGContext 대신에 for 루프의 끝에서 context!.saveGState()를 작성했습니다. 물론 context!.restoreGState()이어야합니다. 간단한 오타!

또한 모든 세미콜론을 제거하고 guard let context = UIGraphicsGetCurrentContext() else { return }을 사용하여 모든 강제 unwrapping을 제거하십시오!

관련 문제