如何ios uiviewcontrollerr代码中设置自定义UIView的宽度或高度

android 用java代码设置布局、视图View的宽度/高度或自适应
在achat项目中,对话内容的长宽设置为自适应,但是如果文本内容太多,则宽度差不多布满,若自己说的和对方说的都很多内容,则满屏都是文字,则不容易分辨出是来自别人说的还是自己说的。那么需要对本身具有自适应的布局再来个宽度限制。
首先,在xml里面定义layout的layout_width/layout_height都要设置为wrap_content,然后在getView方法里面,一开始就让这个布局wrap_content(为什么xml里面设置了wrap_content,这里还要再设置一遍呢?因为布局的重用,不多说了),WidgetController.setLayoutWidth(holder.lay_content, MarginLayoutParams.WRAP_CONTENT);
然后,在填充完布局后,再来一段,让这个布局不能超过屏幕宽的50%,若超过则以这个为最大宽度:
int w=(int)(DensityUtil.getScreenWidth()*0.5);
if (WidgetController.getWidth(holder.lay_content)>w){
WidgetController.setLayoutWidth(holder.lay_content,w);
下面是setLayoutWidth方法的代码,相当好用:
* O置View的度(像素),若O置自mt魅MarginLayoutParams.WRAP_CONTENT
* @param view
* @param width
public static void setLayoutWidth(View view,int width)
/* MarginLayoutParams margin=new MarginLayoutParams(view.getLayoutParams());
margin.setMargins(margin.leftMargin,y, margin.rightMargin, y+margin.height);
//RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(margin);
//view.setLayoutParams(layoutParams);
ViewGroup.MarginLayoutParams
layoutParams =newLayParms(view, margin);
//RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(margin);
view.setLayoutParams(layoutParams);
view.requestLayout();*/
if (view.getParent() instanceof FrameLayout){
FrameLayout.LayoutParams lp=(FrameLayout.LayoutParams) view.getLayoutParams();
view.setLayoutParams(lp);
//view.setX(x);
view.requestLayout();
else if (view.getParent() instanceof RelativeLayout){
RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)view.getLayoutParams();
view.setLayoutParams(lp);
//view.setX(x);
view.requestLayout();
else if (view.getParent() instanceof LinearLayout){
LinearLayout.LayoutParams lp=(LinearLayout.LayoutParams)view.getLayoutParams();
view.setLayoutParams(lp);
//view.setX(x);
view.requestLayout();
转载请注明出处: http://blog.csdn.net/rocklee
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'关于通过ViewController控制内部View的问题
搞不定这问题,再次厚脸皮来伸手要答案。
应用场景:
手里有一个ViewController,向这个ViewController的self.view添加多个subview构造界面。多个subview在self.view内部设置位置和大小,比如一个subview
A紧靠self.view的左侧,宽度为self.view的30%,还有个subview B紧随subview
A向右排,起始的x坐标设置为subview A的宽度。
ViewController初始化之后并没有其内部self.view的frame信息,subview无法设置大小和位置。
尝试的办法:
1、把设置subview
frame的代码写在loadView或者viewDidLoad里,然后在外部设置self.view.frame。这种方案会在frame设置完成之前触发loadView以及viewDidLoad的调用,而此时self.view还是默认的屏幕高度和宽度。即使设置了subview的autoresizingMask属性,subview
B的起始位置也是错误的。
2、在viewWillAppear里设置。这样仍然不行,我测试看到的现象是,只有把ViewController的view添加到window的时候才会调用viewWillAppear,添加到其他的View时不会调用。
目前想到的可行方法:
1、用Interface
Builder设计好每个界面,然后初始化ViewController的时候加载xib确定位置。惭愧,写了几个月没怎么用过Interface
Builder,不知道是不是确定可行?
2、重写每个需要添加subview的ViewController里的self.view,在自定义的UIView子类里重写setFrame方法,在这个方法内调整subview的位置和大小。因为有这种需求的ViewController比较多,这么干就要添加很多UIView子类。
说了这么多,不知道各位能不能看懂。想请各位前辈指点一下,对于这种情况,还有没有别的办法实现,比如纯粹通过代码设置位置和大小?如果可以,那么我应该重写UIViewController的哪个方法?如果不能通过代码设置,或者设置起来不方便,那么,用Interface
Builder设计界面之后再加载xib确定位置的办法可行吗?
如果我说的不明白,请指出,我继续描述。谢谢各位耐心看完,有任何建议请不吝赐教,万分感谢!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。使用代码自定义UIView注意一二三 - 简书
下载简书移动应用
写了28901字,被871人关注,获得了600个喜欢
使用代码自定义UIView注意一二三
当一撮样式一样的视图在工程中被多次使用的时候,为了方便使用,我们会想把他们抽成一个单独的类,进行视图的自定义.
比如我们要做一个这样的东西:
beauty.png
这一块由两个东西组成:一个imageView和一个label。首先我们新建一个继承自UIView的类MyView.
在MyView的.m文件里,你可以根据自己的意愿将两个子控件设置成MyView的属性或者成员变量,这里我们设置为属性。
@property (nonatomic, strong) UIImageView *imageV
@property (nonatomic, strong) UILabel *
那接下来,就是要向自定义的view里面添加控件咯。通常的思路是重写UIView的构造方法。那么这里要说第一个注意了:
1.要重写UIView的initWithFrame:方法而不是init方法
为什么呢?因为当外部调用init的方法的时候,其内部也会默默地调用initWithFrame:方法,你不能保证别的同事在调用你的类的时候不会直接调用initWithFrame:方法,这时如果你仅重写了init方法,那么两个子控件便无从创建.
于是我们写成这样:
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
/* 添加子控件的代码*/
接下开始添加子控件,不知道还会不会有小伙伴是这样写的:
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.imageView = [[UIImageView alloc]init];
self.imageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.width);
[self addSubview:self.imageView];
这样有什么问题吗?如果全部写好运行起来,能看到imageView吗?答案是不确定的.问题出现在给imageView的frame赋值那里.imageView的宽和高直接用self.frame.size.width,但这个时候self.frame可能是没有值的.
上面我们说过,如果外部调用了MyView的init方法,也会执行到这里,这时候frame还没有赋值.
所以第二个注意:
2.不要在构造方法里面直接取自身(self,或者说本视图)的宽高,这时候取到的宽高是不准的.
我想初学自定义tableViewCell的小伙伴都遇到过类似这样的问题:重写cell的初始化方法向cell内添加子控件时(假设cell的高度设为100,想要添加一个label在cell的底部),
于是这样写:label.frame = CGRectMake(0,self.frame.size.height - 20, 100, 20),
运行出来却发现添加的label并不在我们期望的位置(底部),而是在cell比较偏上的位置(实际y的值是44-20而不是100-20).
然后在debug的时候发现:虽然cell的高度已经设定成为100,但在初始化方法里面取到的cell的高度仍然是默认的44.
这其实也是刚才说的原因导致的:我们不能在控件的构造方法里面取其frame或者bounds,这时候取值是不准确的.
所以在重新构造方法的时候,我们只需要把控件放进去,暂时先不用考虑他们在什么位置:
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.imageView = [[UIImageView alloc]init];
[self addSubview:self.imageView];
self.label = [[UILabel alloc]init];
self.label.textAlignment = NSTextAlignmentC
[self addSubview:self.label];
那么在什么时候设置子控件的frame呢?
第三个注意:
3.在layoutSubViews方法里面布局子控件
- (void)layoutSubviews {
// 一定要调用super的方法
[super layoutSubviews];
// 确定子控件的frame(这里得到的self的frame/bounds才是准确的)
CGFloat width = self.bounds.size.
CGFloat height = self.bounds.size.
self.imageView.frame = CGRectMake(0, 0, width, width);
self.label.frame = CGRectMake(0, width, width, height - width);
这里要注意的就是需要在布局之前一定要先调用父类的layoutSubviews方法.
由于在这个方法里可以获取MyView准确的宽和高,我们直接取它的宽高来设置imageView和label的宽高就可以
当然,子控件的创建不一定要写在MyView的构造方法里面,既然声明成为属性,使用懒加载(重写属性的get方法)也是一个不错的选择.
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
· 154人关注
只要用心去做!哪怕只是一点,依然很精彩!
· 22人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:如何viewcontroller代码中设置自定义UIView的宽度或高度_百度知道
如何viewcontroller代码中设置自定义UIView的宽度或高度
提问者采纳
 在viewController里 增加一个IBOutlet 链接哗袱糕惶蕹耗革同宫括到你的自定义的view。   获取一下它的frame属性就知道它的高宽了。   setFrame来设置它的高宽
其他类似问题
为您推荐:
uiview的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 uiviewcontroller 的文章

 

随机推荐