初学者在构建自己的应用程序时,最常遇到的问题之一就是在键盘弹出时提高UIView或其众多子类之一。 有数十个Stack Overflow帖子,每个帖子都有数百条评论,所有这些都试图回答这个简单的问题。 即使对于经验丰富的老手来说,这样做也有点麻木,尤其是对于初学者,可能很难筛选所有可能的答案并自己选择最佳的解决方案。 此外,即使有人选择了某个解决方案,他们也常常无法确切了解引擎盖下发生了什么,或者该解决方案的好坏。 这会阻止人们快速学习,并可能导致他们养成不良习惯。 在这里,我将尝试给出解决方案,其背后的思考过程,并深入解释为什么我要这样做。 让我们开始吧。 在开发您在iOS中不确定的东西时,您的第一反应应该是参考Apple文档。 通常,您会发现大量有用的信息(只要您仔细阅读!)。 我在浏览“ 与键盘相关的通知”部分下的UITextField文档时发现了一些花哨的地方: “因为系统响应响应者的更改来管理键盘的显示和隐藏,所以它会发布以下通知来跟踪与键盘相关的更改” 这些通知是: UIKeyboardWillShow UIKeyboardDidShow UIKeyboardWillHide UIKeyboardDidHide UIKeyboardWillChangeFrame UIKeyboardDidChangeFrame 好的,太好了-因此,这些通知会告诉您键盘何时开始执行操作。 但是我们如何收到这些通知? 在iOS中,我们使用NSNotificationCenter(如果您使用的是Swift,则使用NotificationCenter)在整个应用程序中发送或接收通知。 如果您不太了解iOS中的通知,请稍后再回来查看我的通知博客文章。 在开始研究方面,我们几乎有所需的东西! 我们希望收听这些通知的发布,并在收到通知时可以调整我们的UI,以使一切看起来都很好。 让我们编码。 创建一个新项目(命名为任何名称) 打开情节提要文件,并使用自动布局将UITextField固定到视图控制器的底部。 添加前导约束,以便我们定义x值 添加尾随约束,以便我们定义宽度 添加底部约束,以便我们定义ay值 如果我们现在运行该应用程序并按文本字段,则键盘将显示并覆盖文本字段。 现在让我们修复它。 3.在ViewController.swift中,将以下代码添加到viewDidLoad函数中: NotificationCenter.default.addObserver(自身,选择器:#selector(ViewController.keyboardWillShow),名称:NSNotification.Name.UIKeyboardWillShow,对象:nil)NotificationCenter.default.addObserver(自身,选择器:#selector(ViewController.keyboardWillHide),名称: NSNotification.Name.UIKeyboardWillHide,对象:无) 在这里,我们正在默认的通知中心注册我们的视图控制器,以便可以在显示或隐藏键盘时进行更新。 您会注意到,对于选择器,我使用了文件中尚不存在的函数-现在让我们将它们写出来。 4.将以下函数头添加到ViewController.swift: @objc func keyboardWillShow(通知:NSNotification){} @objc func keyboardWillHide(通知:NSNotification){} 5.现在,我们需要获取键盘更新后的大小信息。 可通过传入的NSNotification参数userInfo对象获得此信息。 userInfo对象是可选的,因此我们需要先对其进行拆包以验证其存在: 守护让userInfo = notification.userInfo else {return} 6.为了获得键盘的大小,我们需要使用键UIKeyboardFrameEndUserInfoKey访问userInfo字典。 […]
我有一个button,将视图的类更改为UIControl 我input了这行代码,但Xcode说这是一个错误 -(IBAction)button:(id)sender { self.view.class = [UIControl class]; } 所以,我的问题是如何以编程方式将我的视图的类更改为UIControl类
我试图做到这一点,使我的应用程序( UIButton , UISlider等)中的每个UIControl都具有特殊的额外属性,我添加到他们。 我试图通过创build一个UIControl类别并在需要的地方导入它来实现这一点,但我有问题。 这是我的代码。 我的setSpecialproperty方法被调用,但它似乎被调用在一个无限循环,直到应用程序崩溃。 你能告诉我什么我做错了或build议一个更聪明的方式来添加一个属性到我所有的UIControls ? @interface UIControl (MyControl) { } @property(nonatomic,strong) MySpecialProperty *specialproperty; -(void)setSpecialproperty:(MySpecialProperty*)param; @end //////// #import "UIControl+MyControl.h" @implementation UIControl (MyControl) -(void)setSpecialproperty:(MySpecialProperty*)param { self.specialproperty=param; } /////////////// #import "UIControl+MyControl.h" @implementation ViewController UIButton *abutton=[UIButton buttonWithType:UIButtonTypeCustom]; MySpecialProperty *prop=[MySpecialProperty alloc]init]; [abutton setSpecialproperty:prop];
我用cocoacontrols.com的BASequenceControl实现了UISegmentedControl 方向主题。 我已经添加了BASequenceControl.h和BASequenceControl.m类和GitHub所需的图像 大。 它的工作对我来说很好..但是我有一个关于最后一个细分市场小费的问题。 它显示最后一个段的垃圾空间。 原始屏幕截图 我需要这个 我已经实现的代码 #import "BASequenceControl.h" BASequenceControl *bASequenceControl = [[BASequenceControl alloc] init]; bASequenceControl.frame = CGRectMake(10, 10, 200, 44); [bASequenceControl addSegmentWithTitle:@"First" animated:NO]; [bASequenceControl addSegmentWithTitle:@"Second" animated:NO]; bASequenceControl.leftMargin = -22; bASequenceControl.rightMargin = 0; bASequenceControl.overlapWidth = 22; [self.view addSubview:bASequenceControl]; 任何帮助,这是表示赞赏。 谢谢。
我有一个UIControl类,需要根据UIImageView位置进行一些计算,这个位置可以通过touchesBegan和touchesMoved(这个类中的所有东西)来移动。 比我想显示它作为我已经编程创build的UILabel。 class control : UIControl{ … let leftControl: UIImageView = UIImageView(image: UIImage(named: "left-control")) … func leftValue() -> String{ var leftValue : String = "0.0" leftValue = "\(leftControl.center.x)" return leftValue } } 和我的ViewController.swift class ViewController:UIViewController { let ctrl : Control = Control() let leftLabel : UILabel = UILabel(frame: CGRect(x: 40, y: 300, width: 150, height: […]
嗨,我想改变我的button后,我按下button,即button不应该改回到以前的形象。 但是,我无法这样做。 我的代码如下。 任何人都可以build议我点击button后,如何将图像更改为“custom_button_highlight”? UIImage *buttonImageNormal = [UIImage imageNamed:@"custom_button"]; UIImage *stretchableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0]; UIImage *buttonImagePressed = [UIImage imageNamed:@"custom_button_highlight"]; UIImage *stretchableButtonImagePressed = [buttonImagePressed stretchableImageWithLeftCapWidth:12 topCapHeight:0]; button.titleLabel.font = [UIFont boldSystemFontOfSize:14]; [button setBackgroundImage:stretchableButtonImageNormal forState:UIControlStateNormal]; [button setBackgroundImage:stretchableButtonImagePressed forState:UIControlStateHighlighted]; [button setBackgroundImage:stretchableButtonImagePressed forState:UIControlStateSelected];
我已经通过下面的代码创build了一个名为ToggleImageControl的UIControl的子类(参考下面的在UITableViewCell中的checkbox图像切换 ) @interface ToggleImageControl : UIControl { BOOL photoIsStarred; UIImageView *imageView; UIImage *normalImage; UIImage *selectedImage; } @property (nonatomic, assign) BOOL photoIsStarred; @property (nonatomic, retain) UIImageView *imageView; @property (nonatomic, retain) UIImage *normalImage; @property (nonatomic, retain) UIImage *selectedImage; – (void) toggleImage; @end @implementation ToggleImageControl @synthesize photoIsStarred, imageView, normalImage,selectedImage; – (id)initWithFrame:(CGRect)frame { NSLog(@"in inti with frame method"); self.normalImage […]
我在我的TableViewCells中embedded了UIButtons。 为了跟踪button属于哪个单元格,我想添加一个NSIndexPath属性到UIButton。 我不想要一个UIButton的子类。 有没有办法可以做到这一点与类别? 编辑:我相信设置标签的想法将无法正常工作,如果我在表视图中有多个部分。 访问button的超级视图的超级视图来确定单元格的另一种方法似乎更像是一个黑客攻击。 寻找一个更干净的方式来做到这一点。
编辑 请参阅Nathan的评论部分了解最新的项目。 只剩下问题了:得到正确的button。 编辑 我想有一个用户可以旋转的UIView。 该UIView应该包含一些可以点击的UIButtons。 我有一个困难的时间,因为我使用UIControl子类来旋转视图,并在该子类中,我必须禁用UIControl中的子视图(使其旋转)的用户交互,这可能会导致UIButtons不可拔。 我怎样才能让UIView,用户可以旋转, 并包含可点击的UIButtons? 这是一个链接到我的项目,它给你一个开始:它包含UIButtons和一个可纺的UIView。 我可以不点击UIButtons。 老问题与更多的细节 我正在使用这个窗格: https : //github.com/joshdhenry/SpinWheelControl ,我想对button点击作出反应。 我可以添加button,但是我不能在button中接收点击事件。 我正在使用hitTests,但他们从来没有得到执行。 用户应该旋转轮子,并能够点击其中一个饼图的button。 在这里获取项目: https : //github.com/Jasperav/SpinningWheelWithTappableButtons 看到我在pod文件中添加的代码如下: 我在SpinWheelWedge.swift中添加了这个variables: let button = SpinWheelWedgeButton() 我添加了这个类: class SpinWheelWedgeButton: TornadoButton { public func configureWedgeButton(index: UInt, width: CGFloat, position: CGPoint, radiansPerWedge: Radians) { self.frame = CGRect(x: 0, y: 0, width: width, height: […]
我试图实现范围滑块和我使用自定义控件称为NMRangeSlider 。 但是当我使用它时,滑块完全不会出现。 难道这也是因为它都是用Objective-C编写的吗? 这是我目前实现它的方式: var rangeSlider = NMRangeSlider(frame: CGRectMake(16, 6, 275, 34)) rangeSlider.lowerValue = 0.54 rangeSlider.upperValue = 0.94 self.view.addSubview(rangeSlider)