将SPUserResizableView [Objective C]转换为Swift 3.0 setFrame setContentView

时间:2017-02-06 18:08:33

标签: objective-c swift translation

使用iOS 10.20& Swift 3.0想要在我的代码中使用Stephen Poletto编写的这段优秀代码,但是在Swift 3.0中真的需要它。

https://github.com/spoletto/SPUserResizableView

几乎在那里,但我现在被卡住了。我的代码崩溃导致它没有执行setContentView或setFrame,我也不理解Stephan的代码如何调用它。我看到他的代码中没有任何方法参考?当他设置一个框架或视图时,他们会打电话吗?什么是Swift等价?我重新编写了这些方法,但它们没有被执行......

- (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];
} 

我的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()
    }

1 个答案:

答案 0 :(得分:0)

好的,

这是一个部分答案,这是你在Swift中覆盖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使用相同的方法,但是弄清楚它的语法现在仍然无法解决。