Ios 在类中对变量进行子类化
我试图更改类中变量的行为 更准确地说,我有一个“UIWebView”,它有一个“scrollview”属性 我需要覆盖这个scrollview的“setContentInset”,但是我不知道如何做 文档显示UIWebView具有以下功能:Ios 在类中对变量进行子类化,ios,swift,Ios,Swift,我试图更改类中变量的行为 更准确地说,我有一个“UIWebView”,它有一个“scrollview”属性 我需要覆盖这个scrollview的“setContentInset”,但是我不知道如何做 文档显示UIWebView具有以下功能: var scrollView: UIScrollView { get } 因此,我不能简单地创建自己的并将其设置在那里 我的问题是,如何从UIWebView的scrollview覆盖“setContentInset” 编辑: 2澄清 我知道UIWebVie
var scrollView: UIScrollView { get }
因此,我不能简单地创建自己的并将其设置在那里
我的问题是,如何从UIWebView的scrollview覆盖“setContentInset”
编辑:
2澄清
我知道UIWebView不应该是子类的,按照文档的说明
我的目标是修复我已经在我的应用程序的其他ScrollView上实现的“下拉刷新”跳跃行为。当一个内置接口类“有”另一个内置接口类时,你不能对内部类进行子类化或重写任何相关内容 因此,尽管可以将UIWebView子类化,但无法以某种方式将UIWebView的滚动视图子类化
另一个熟悉的例子是UIButton。每个人都知道UIButton包含一个UILabel和一个UIImageView。您可以对UIButton进行子类化,但不能对其UILabel或UIImageView进行子类化。当一个内置接口类“有”另一个内置接口类时,您不能对内部类进行子类化或重写其任何内容 因此,尽管可以将UIWebView子类化,但无法以某种方式将UIWebView的滚动视图子类化
另一个熟悉的例子是UIButton。每个人都知道UIButton包含一个UILabel和一个UIImageView。您可以将UIButton子类化,但不能将其UILabel或UIImageView子类化。我将从一个直接的方法开始,看看是否有任何细微的问题
class MyScrollView: UIScrollView {
private lazy var my_contentInset: UIEdgeInsets = UIEdgeInsets()
override var contentInset: UIEdgeInsets {
get { return my_contentInset }
set {
// Your willSet code
my_contentInset = newValue
// Your didSet code
}
}
}
class MyWebView: UIWebView {
private lazy var my_scrollView: MyScrollView = MyScrollView()
override var scrollView: UIScrollView {
get { return my_scrollView }
}
}
这有点过于简单,因此您可能会遇到问题,具体取决于运行时如何设置scrollView
。如果运行时需要为scrollView
设置一个setter,那么您需要更深入
这里我为我的滚动视图创建了一个初始值设定项,它克隆了一个UIScrollView
,并在MyWebView
的scrollView
的setter中使用它
extension MyScrollView {
convenience init(scrollView: UIScrollView) {
let data = NSKeyedArchiver.archivedData(withRootObject: scrollView)
let coder = NSKeyedUnarchiver(forReadingWith: data)
self.init(coder: coder)! // Intentionally failing hard on decode failure.
// Additional configuration not captured in the encode/decode
// process might be needed.
}
}
class MyWebView: UIWebView {
private lazy var my_scrollView: MyScrollView = MyScrollView()
override var scrollView: UIScrollView {
get { return my_scrollView }
set { my_scrollView = MyScrollView(scrollView: newValue) }
}
}
即使这样也可能不够。在处理内部对象时,运行时可以通过多种方式进行欺骗。这应该足够让你开始了。我会从一个直截了当的方法开始,看看是否有任何微妙的问题
class MyScrollView: UIScrollView {
private lazy var my_contentInset: UIEdgeInsets = UIEdgeInsets()
override var contentInset: UIEdgeInsets {
get { return my_contentInset }
set {
// Your willSet code
my_contentInset = newValue
// Your didSet code
}
}
}
class MyWebView: UIWebView {
private lazy var my_scrollView: MyScrollView = MyScrollView()
override var scrollView: UIScrollView {
get { return my_scrollView }
}
}
这有点过于简单,因此您可能会遇到问题,具体取决于运行时如何设置scrollView
。如果运行时需要为scrollView
设置一个setter,那么您需要更深入
这里我为我的滚动视图创建了一个初始值设定项,它克隆了一个UIScrollView
,并在MyWebView
的scrollView
的setter中使用它
extension MyScrollView {
convenience init(scrollView: UIScrollView) {
let data = NSKeyedArchiver.archivedData(withRootObject: scrollView)
let coder = NSKeyedUnarchiver(forReadingWith: data)
self.init(coder: coder)! // Intentionally failing hard on decode failure.
// Additional configuration not captured in the encode/decode
// process might be needed.
}
}
class MyWebView: UIWebView {
private lazy var my_scrollView: MyScrollView = MyScrollView()
override var scrollView: UIScrollView {
get { return my_scrollView }
set { my_scrollView = MyScrollView(scrollView: newValue) }
}
}
即使这样也可能不够。在处理内部对象时,运行时可以通过多种方式进行欺骗。我不知道您是否可以实现您想要的,但是作为一个解决方案,考虑扩展<代码> UISCRoopVIEW委托> <代码>协议,以添加委托方法<代码> ScRabVIEWDIDSET CSENTROSENSET(UISCRelVIEW)< /C>然后扩展<代码> UISCRelVIEW 每当代码< > CordNoSt/<代码>被设置。我不知道您是否可以实现您想要的,但是作为一种解决方案,考虑扩展<代码> UISCRoopVIEW委托/<代码>协议,以添加委托方法<代码> ScReVIEWDIDSET CSENTROSENSET(UISCRelVIEW)< /代码>,然后扩展
UIScrollView
以在设置contentInset
时调用它。覆盖UIButton
的titleLabel
和imageView
,这是很困难的,但这是因为按钮状态不同。我已经成功地覆盖了UITableViewCell
子类中的textlab
和imageView
。覆盖滚动视图
时会出现什么问题?覆盖ui按钮
的标题标签
和图像视图
会很棘手,但这是因为按钮状态不同。我已经成功地覆盖了UITableViewCell
子类中的textlab
和imageView
。覆盖scrollView
时会出现什么问题?