iOS: 让自定义控件适应Autolayout注意的问题

第一个是initWithCoder方法:因为开发者多在Storyboard中使用Autolayout,而Storyboard中的View初始化不是使用常见的initWithFrame方法的,而是使用initWithCoder方法来初始化View。因此自定义控件有初始化逻辑的话(如设置变量默认值什么的),注意不要只写在initWithFrame方法里。

第二个是UIViewtranslatesAutoresizingMaskIntoConstraints属性,如果使用Autolayout,则不需要将古老的AutoresizingMask转换成Autolayout的Constraint。这个属性默认是YES,不过貌似Storyboard创建时调用initWithCoder方法时控件的translatesAutoresizingMaskIntoConstraints已经是NO了。

第三个是UIViewcontentMode属性,如果在Autolayout改变控件尺寸后需要刷新drawRect,则需要设置contentMode属性为UIViewContentModeRedraw。而另一个常见的自定义控件依赖的方法:layoutSubviews,则会被自动调用,这里不需要担心。

那么,自定义控件的初始化可以这样写:

//UIView构造方法
- (id)initWithFrame:(CGRect)aRect
{
    if ((self = [super initWithFrame:aRect])) {
        [self commonInit];
    }
    return self;
}

//Storyboard用
- (id)initWithCoder:(NSCoder*)coder
{
    if ((self = [super initWithCoder:coder])) {
        [self commonInit];
    }
    return self;
}

- (void)commonInit
{
    /* 这里开始初始化 */

    //如果需要重新调用drawRect则设置contentMode为UIViewContentModeRedraw
    self.contentMode = UIViewContentModeRedraw;
    //不允许从Autoresizing转换Autolayout的Constraints
    //貌似Storyboard创建时调用initWithCoder方法时translatesAutoresizingMaskIntoConstraints已经是NO了
    self.translatesAutoresizingMaskIntoConstraints = NO;
}
时间: 2024-10-10 21:33:48

iOS: 让自定义控件适应Autolayout注意的问题的相关文章

iOS: How To Make AutoLayout Work On A ScrollView

iOS: How To Make AutoLayout Work On A ScrollView Posted on June 11th, 2014 Ok, I’ll admit. I’ve been seriously struggling with AutoLayout ever since it’s been introduced. I understand the concept, and I LOVE the idea of it, but when I actually do it,

iOS Scrollview中的AutoLayout(纯IB)

原创Blog,转载请注明出处 blog.csnd.net/hello_hwc 欢迎关注我的iOS SDK专栏 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 前言:随着XCode的越来越完善,用IB来创建一些界面是必然的潮流.优点很明显,简单直观,能预览,效率高,好debug,尤其是对一些view中有复杂的控件,比如我今天写的就差不多要有10个textfield,15个label,以及其他的10多个view.如果用代码A

【iOS】自定义控件入门:可拖动的环形进度

有时候UIKit的标准控件并不能满足我们的需求,因此我们可以通过自定义控件得到满足我们需求的控件,例如这篇文章将教你如何自定义一个圆形的进度条,并且用户可以通过拖动进度条上的手柄来改变进度值.主要参考了这篇文章:HOW TO BUILD A CUSTOM CONTROL IN IOS.广告时间:我的一个免费APP:午睡闹钟 使用了这个控件,欢迎大家在AppStore搜索午睡闹钟进行下载使用. 我们的自定义控件继承自UIControl类,它是UIView的子类,是所有UIKit控件(UIButto

iOS 屏幕适配:autoResizing autoLayout和sizeClass

1. autoResizing autoresizing是苹果早期的ui布局适配的解决办法,iOS6之前完全可以胜任了,因为苹果手机只有3.5寸的屏幕,在加上手机app很少支持横屏,所以iOS开发者基本不用怎么适配布局,所有的ui控件只要相对父控件布局就可以了,没错autoResizing就是一个相对于父控件的布局解决方法:注意:它只能相对父控件布局:***在xcode中可以通过可视化的界面调整也可以通过代码去控制 在用autoResizing的时候需要关闭autoLayout和sizeclas

iOS 8 Tableview根据AutoLayout自动调整高度

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 前言:在iOS 8之前,如果要让Tableview根据内容自动调整大小的话,需要动态的去计算每个cell的高度.太尼玛操蛋了.iOS 8之后,可以根据AutoLayout来自动调整高度了,原理很简单. DataSource中选择让iOS自动计算 在Cell中,设定能够让iOS计算出高度的AutoLayout,注意,这里一定要是能够计算出高度的AutoLayout,这和传统的不一样. 效果 完整过程 新建一个基于sing

iOS开发-UI篇-AutoLayout

1.概述:随着iOS设备的更新迭代,屏幕适配问题也变得愈发重要,应运而生了Autolayout.在Xcode4.1和OS X10.7之后才起效. 2.简介:Apple提供了2种方式布局Autolayout,用xib来布局;另一种利用代码进行布局,在Apple的sdk中提供了2个类库:NSLayoutManager和NSLayoutConstraint.NSLayoutManager类主要是配合NSTextStorage,NSTextContainer实现NSCoding协议用来布局text视图,

iOS UITableView+FDTemplateLayoutCell 配合AutoLayout分分钟教你实现动态高度自适应

UITableView里面的Cell固定高度那是基本不可能了,很多功能和界面都会涉及到高度自适应,而且电商类的尤其普遍,之前都是自己算啊算,代码写的非常多,逻辑还没写,光这布局UI和高度计算都能接近1000了,写完之后关键出点Bug整个人都不好了 当时的是这样的: 突然在github上看到UITableView+FDTemplateLayoutCell这个库 传送门:点击打开链接 刚看到的时候是这样的: 能  用   么 ??? 真  的  这  么 叼 ??? 第一次用的时候是这样的: 哥们,

iOS开发——使用基于Autolayout的ScrollView

问题描述: 在使用Autolayout布局方式对ScrollView进行布局时,如果你想做一个可以垂直方向滚动的九宫格类似这样:   拿一行来说,一定不要想当然的尝试去给一行图标进行均匀排列的操作(指定padding,图片尺寸自适应),你的针对ScrollView右边和下边的约束是无效的.约束了结果也是没用的,然后图片的内在尺寸约束会占据主导,把ScrollView水平方向也顶出屏幕,使得ScrollView水平方向变得也可以滚动.   解决方法: 解决办法是不能在ScrollView中使用Au

iOS开发-自定义控件的方式及注意

使用纯代码的方式 一般来说我们的自定义类继承自UIView,首先在initWithFrame:方法中将需要的子控件加入view中.注意,这里只是加入到view中,并没有设置各个子控件的尺寸. 为什么要在initWithFrame:方法而不是在init方法? 因为使用纯代码的方式创建自定义类,在以后使用的时候可能使用init方法创建,也有可能使用initWithFrame:方法创建,但是无论哪种方式,最后都会调用到initWithFrame:方法.在这个方法中创建子控件,可以保证无论哪种方式都可以