我为按钮创建了一个类和函数:
class FloatingActionButton: UIButtonX {
override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
UIView.animate(withDuration: 0.3, animations: {
if self.mapTypeButton.transform == .identity {
self.mapTypeButton.transform = CGAffineTransform(rotationAngle: 45 * (.pi / 180)) .
} else {
self.mapTypeButton.transform = .identity
return super.beginTracking(touch, with: event)}
现在我在另一个类ViewController中,我想调用我的函数(请参阅更新以了解我为什么要调用我的函数)
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
self.closeMapType()
FloatingActionButton().beginTracking(touch: UITouch, with: UIEvent?)
return true
}
但我被告知beginTracking不是可以调用的函数类型。
更新:
我在故事板上设置了按钮并将其连接到指针。现在,按钮位于this(照片1),(我很抱歉,我没有足够的声望点来发布照片)。当我在模拟器中点击它时,它会变为this(照片2),当我再次点击它时,它会变回默认状态。所有这些功能都在FloatingActionButton class
中设置。
它可以将UIView.animate(etc.)
置于func searchBarShouldBeginEditing
内,但我想知道是否可以调用UIView.animate(etc.)
来减少冗余。
我现在要做的是,当我点击searchBar时,如果按钮处于旋转状态(照片2),它将旋转回原始状态(照片1)。我创造了:
@IBOutlet weak var mapTypeButton: FloatingActionButton!
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
UIView.animate(withDuration: 0.3, animations: {
if self.mapTypeButton.transform == .identity {
return
} else {
self.mapTypeButton.transform = .identity
})
return true
}
它正是我正在寻找的。我只是将函数动作添加到新函数中,而不是调用函数。感谢所有帮助
答案 0 :(得分:1)
听起来你并不真正理解面向对象的编程。
按钮对象不应存在于真空中。按钮是一个用户界面元素,它在某个地方属于屏幕。
此代码:
FloatingActionButton().beginTracking(touch: UITouch, with: UIEvent?)
创建一个全新的FloatingActionButton
,告诉它开始跟踪触摸,然后忘记它。它从来没有任何关系。没有人拥有它,所以当searchBarShouldBeginEditing函数返回时,按钮对象被取消分配。
这个按钮应该在某个地方显示在屏幕上,并跟踪触摸?如果是这样,您需要确定应该托管它的视图,并将其添加到该视图中。您还需要设置AutoLayout约束,以便将其置于其父视图中。
通常,在Storyboards中创建用户界面更容易(通常更好),并将它们放在视图层次结构中。但是,为了帮助您,您需要解释此按钮如何适合您的用户界面。
根据您的更新,您希望更改故事板中按钮的设置。 (请注意,您尝试对该按钮进行的调用很可能是错误的,但是我会告诉您如何获得指针(IBOutlet
)到按钮或其他视图的方式所以你可以配置它。)
您这样做的方法是在主编辑器窗口中设置故事板,然后打开包含"助理编辑器中按钮的视图控制器的源文件。"我建议在底部选择"助理编辑器"选项。
现在按住控制键,按下按钮,然后从按钮控制拖动到视图控制器类的内部,在顶部靠近其他变量。 Xcode将为您的按钮创建一个IBOutlet。在结果对话框中,更改" sender"的类型。到你的按钮类型(" FloatingActionButton"。)如果Xcode不允许你这样做,看看你是否可以选择" UIButton"代替。给它一个像" myFloatingButton"。
这样的名字现在从
更改您的代码FloatingActionButton().beginTracking(touch: UITouch, with: UIEvent?)
到
myFloatingButton.beginTracking(touch: UITouch, with: UIEvent?)
您所做的是在视图控制器中创建实例变量myFloatingButton
。当操作系统加载视图控制器的视图时,它将在该实例变量中保存指向浮动按钮的指针。加载视图后(调用viewDidLoad()
方法后),您可以假设变量myFloatingButton
指向您的按钮,然后可以调用您的方法进行配置。
正如Hasan在他的回答中指出的那样,在你的按钮上拨打beginTracking(_:with:)
是没有意义的。这是UIButton
(实际上是按钮的祖先类UIControl
)的方法,当用户触摸按钮时系统会在内部调用该方法。
您必须解释您尝试做的事情,以便我们能够帮助您做到这一点。
答案 1 :(得分:1)
我会详细说明@Duncan的回答。
重写的beginTracking
函数不是代码调用的函数类型。它在事件发生时被调用。
显然你想使用FloatingActionButton
类型的按钮。您需要做的是使用故事板将UIButton拖放到UIViewController。选择该按钮并将其类型更改为FloatingActionButton
,方法是转到右侧窗格中的身份检查器,并将“类”字段中的值更改为FloatingActionButton
。
逻辑上,beginTracking
将在事件发生时自动调用。除非,需要在FloatingActionButton
。