使用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()
}
答案 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使用相同的方法,但是弄清楚它的语法现在仍然无法解决。