2017-02-06 2 views
-1

iOS 10.20 사용 & Swift 3.0 Swift 3.0에서 Stephen Poletto가 작성한 훌륭한 코드를 사용하고 싶습니다.SPUserResizableView [Objective C]를 Swift 3.0으로 변환 setFrame setContentView

https://github.com/spoletto/SPUserResizableView

거의 다하지만 지금 붙어있다. 내 코드가 충돌하여 setContentView 또는 setFrame을 실행하지 못하고 Stephan의 코드가이 코드를 호출하는 방식을 이해하지 못합니다. 코드 중 해당 메소드에 대한 참조가 없습니다. 아마도 프레임이나 뷰를 설정할 때 호출할까요? 신속한 동등한 무엇입니까? 나는 그 방법들을 기록했지만, 그것들은 실행되지 않았다. ...

- (void)setContentView:(UIView *)newContentView { 
    [contentView removeFromSuperview]; 
    contentView = newContentView; 
    contentView.frame = CGRectInset(self.bounds, kSPUserResizableViewGlobalInset + kSPUserResizableViewInteractiveBorderSize/2, kSPUserResizableViewGlobalInset + kSPUserResizableViewInteractiveBorderSize/2); 
    [self addSubview:contentView]; 

    // Ensure the border view is always on top by removing it and adding it to the end of the subview list. 
    [borderView removeFromSuperview]; 
    [self addSubview:borderView]; 
} 

- (void)setFrame:(CGRect)newFrame { 
    [super setFrame:newFrame]; 
    contentView.frame = CGRectInset(self.bounds, kSPUserResizableViewGlobalInset + kSPUserResizableViewInteractiveBorderSize/2, kSPUserResizableViewGlobalInset + kSPUserResizableViewInteractiveBorderSize/2); 
    borderView.frame = CGRectInset(self.bounds, kSPUserResizableViewGlobalInset, kSPUserResizableViewGlobalInset); 
    [borderView setNeedsDisplay]; 
} 

My Swift 3.0 코드는 다음과 같습니까? 좋아

func setContentView(newContentView: UIView) { 
    contentView.removeFromSuperview() 
    contentView = newContentView 
    contentView.frame = self.bounds.insetBy(dx: CGFloat(kUserResizableViewGlobalInset) + kUserResizableViewInteractiveBorderSize/2.0, dy: CGFloat(kUserResizableViewGlobalInset) + kUserResizableViewInteractiveBorderSize/2.0) 
    self.addSubview(contentView) 

    // Ensure the border view is always on top by removing it and adding it to the end of the subview list. 
    borderView.removeFromSuperview() 
    self.addSubview(borderView) 
    } 

    func setFrame(newFrame: CGRect) { 
     contentView.frame = self.bounds.insetBy(dx: CGFloat(kUserResizableViewGlobalInset) + kUserResizableViewInteractiveBorderSize/2.0, dy: CGFloat(kUserResizableViewGlobalInset) + kUserResizableViewInteractiveBorderSize/2.0) 
     borderView.frame = self.bounds.insetBy(dx: CGFloat(kUserResizableViewGlobalInset), dy: CGFloat(kUserResizableViewGlobalInset)); 
     borderView.setNeedsDisplay() 
    } 

답변

0

, 여기

부분적인 대답은, 이것은 당신이 스위프트의 setFrame 보인다을 무시하는 방법입니다; reddit에서 대답을 찾았습니다.

override var frame: CGRect { 
    get { 
     return super.frame 
    } 
    set (newFrame) { 
     super.frame = newFrame 
     contentView.frame = self.bounds.insetBy(dx: CGFloat(kUserResizableViewGlobalInset) + kUserResizableViewInteractiveBorderSize/2.0, dy: CGFloat(kUserResizableViewGlobalInset) + kUserResizableViewInteractiveBorderSize/2.0) 
     borderView.frame = self.bounds.insetBy(dx: CGFloat(kUserResizableViewGlobalInset), dy: CGFloat(kUserResizableViewGlobalInset)); 
     borderView.setNeedsDisplay() 
    } 
} 

적어도 부분적으로 작동합니다. 나는 더 가까이 다가왔다! setContentView에 대해 같은 방법을 사용 하겠지만 그 구문을 알아내는 것은 지금 당장 나에게 아직 없다.

관련 문제