iOS 自定义控件

Posted

技术标签:

【中文标题】iOS 自定义控件【英文标题】:iOS Custom Control 【发布时间】:2012-02-22 14:34:58 【问题描述】:

我正在构建一个自定义控件,如下图所示。

它基本上是一个带有滑块的菜单。箭头将允许我更改滑块轨道上的三天显示。根据我使用滑块选择的那一天,我想更改主屏幕上的一些视图(此菜单将在我的页面底部)。所以基本上这是我将在主控制器中“听”的唯一内容:如果选择了某一天。

我已经弄清楚了我必须编写的所有代码,但我不确定我应该继承 UIControl 还是 UIView。如果是这样,我应该在 UIControl (UIView) 中在哪里编写控制器的代码(更改日期、添加拖动效果等)?或者我应该继承 UIViewController,并在那里编写所有代码。 (但如果是这样,我为什么要以第一种方式继承 UIControl(UIView))。

所以基本上我想知道我需要创建哪些额外的文件,除了我的自定义控件的视图界面(我在 IB 中做的),我应该把代码放在哪里(IBOutlets,IBAction 方法)以及我应该怎么做与主视图控制器通信(我将主控制器设置为我的自定义控件的委托?)。

抱歉,帖子太长了。

谢谢

【问题讨论】:

【参考方案1】:

我建议继承UIControl。此控件的用户可以通过[yourControl addTarget:self action:@selector(someMethod:) forControlEvents:UIControlValueChanged]; 对更改的值做出反应。在您的控制下,当您确定选择了新的一天时,您拨打[self sendActionsForControlsEvents:UIControlValueChanged]; 瞧,所有感兴趣的课程都会收到通知。

尽可能保持该控件的独立性。这意味着,只给它尽可能多的逻辑,仅此而已。想想你如何使用 Apple 提供的 UI 元素:尽量让你的 UI 元素通用(如果可行;在这里使用常识)。简而言之:您应该努力使此控件足够通用,以便在其他项目或应用程序的其他地方对您有用。

【讨论】:

感谢您的回答。我还有一个问题,我应该在我的控件的哪个方法中添加我的初始化代码(例如,如果我想创建一个 UIGestureRecognizer)。 将其作为单独的问题发布会更成功。干杯。 @Cosmin:如果手势识别器对控件很重要(即控件需要它的功能),那么您将在控件的initWithFrame: 中对其进行初始化。或者,如果您有不同的指定初始化程序,您可以在那里初始化手势识别器。【参考方案2】:

简短的回答是你应该继承UIControl 并放置所有逻辑来绘制组件并在那里与组件交互。 UIControl 继承自 UIView 并添加目标/动作行为。这样您就可以在日期更改时使用sendAction:to:forEvents:UIControlEventValueChanged

您也可以在用户更改所选日期时实施委托协议。

例如:

@protocol DateSliderDelegate <NSObject>
  - (void)dateSlider:(id)slider dateDidChange:(NSDate *)date fromDate:(NSDate *)oldDate;
@end

您不想使用UIViewController,因为它的工作是管理更高级别的视图,例如您的小部件所在的屏幕。稍后您将在使用组件时使用视图控制器并执行诸如设置初始显示日期和侦听更改事件之类的操作。

【讨论】:

以上是关于iOS 自定义控件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中构建由现有控件组成的自定义控件?

ios16--自定义控件1

ios17--自定义控件2改进

[原创]自定义控件之AndroidSegmentControlView,仿IOS平台UISegmentControlView,继承自View

iOS - 如何以编程方式为控件设置自定义类

自定义UIPicker控件IOS