如何使用代码动态的获取和设置imageview宽度自适应的宽度和高度

收藏,8k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
在自定义高度随着数据模型动态变化的tableViewCell的时候,你们一般是如何进行封装并且计算出cell高度的呢?
我的做法是:
一个控制器VC,一个cell,一个数据模型,一个装有cell所有子控件的frame的类。在VC获取到数据模型后,通过frame类计算好cell的子控件的frame和cell高度。然后在cell中根据数据模型和frame为子控件赋值和设置frame。
不知道各位大神是怎么做的?
还有,在自定义内容动态增减的cell,比如微博cell里面的图片,有时候没有图片,有时候有一张,有时候有多张。这种情况是怎么处理的?是先新建许多imageVeiw,然后根据数据动态隐藏显示,还是根据数据再来动态创建imageVeiw?
最好有个Demo,供小弟参考一下,感激不尽
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
建议使用AutoLayout,不建议在不了解原理的情况下使用第三方封装。
推荐几篇使用 autoLayout 来适配 tableView 动态高度的文:
高级点的例子:
使用 autoLayout 来实现 cell 的动态高度,是在
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
返回高度的时候依赖 cell 的约束来计算高度,这些约束描述了目标 cell 需要的高度。
(上面说了很多
当然你也可以选择不使用autoLayout,那么这时你的代码类似:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
Message *msgObj = _items[(NSUInteger) indexPath.row];
NSString *msg = msgObj.
CGFloat maxWidth = CGRectGetWidth(tableView.bounds);
CGFloat msgCellWidth = maxWidth - MessageCellAvatarPadding * 2 - AVATAR_HEIGHT - MessageCellPadding-20;
CGFloat height = [MsgCell heightForMessage:msg constrainedToWidth:msgCellWidth];
return height+20;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MsgCell *msgItemCell = [tableView dequeueReusableCellWithIdentifier:kMsgCellId forIndexPath:indexPath];
Message *msg = self.items[(NSUInteger) indexPath.row];
[msgItemCell setMessage:msg];
return msgItemC
就是自己来计算高度,原理就是这样啦
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
抱歉不是大神。
题主的问题1:动态cell的高度如何计算?
MexiQQ的回答是对的,但过于简略了,我用的是,除了使用systemLayoutSizeFittingSize:外,还支持高度的缓存等vip功能。对于复杂的动态cell,性能提升比较明显。该库仅支持iOS7.x、8.x,慎入。
题主的问题2:cell中数量不确定的多张imageView该如何处理?
最近刚做过一个让我想把PM脑袋拧下来的项目,就遇到了这个问题。我个人的实践体验是,在使用autolayout的情况下,当图片数量比较多时,隐藏/显示imageView比动态增删imageView性能要好得多。假如把hidden = YES视为某个方向上的size constraint.constant = 0,则符合apple官方文档中“修改constraint要好于移除并重新添加constraint”的说明。
补充:“当图片数量比较多时”是一个很模糊的说法,具体还要看每张图片的size,总之拿一台iPhone 4跑一跑,不卡就好。
此外,iPhone 4务必升到iOS7,iOS6的autolayout性能惨不忍睹,如无必要请勿自虐=。=
同步到新浪微博
分享到微博?
与我们一起探索更多的未知
专业的开发者技术社区,为用户提供多样化的线上知识交流,丰富的线下活动及给力的工作机会
加入只需一步
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要举报该,理由是:
扫扫下载 App
SegmentFault
一起探索更多未知在JAVA文件中动态的设置ImageView的宽度和高度,并使图片自适应
package com.
import android.app.A
import android.os.B
import android.util.L
import android.view.ViewGroup.LayoutP
import android.widget.ImageV
public class PicTest extends Activity {
private final String TAG = "Pictrue Test!!!";
private ImageV
private int height = 0;
private int width = 0;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
image = (ImageView)findViewById(R.id.ImageView01);
//height = image.getHeight();
//width = image.getWidth();
//Log.d(TAG, "height: " + height);
//Log.d(TAG, "width: " + width);
para = image.getLayoutParams();
Log.d(TAG, "layout height0: " + para.height);
Log.d(TAG, "layout width0: " + para.width);
para.height = 300;
para.width = 300;
image.setLayoutParams(para);
Log.d(TAG, "layout height: " + para.height);
Log.d(TAG, "layout width: " + para.width);
ImageView 的属性android:scaleType,即 ImageView.setScaleType(ImageView.ScaleType)。android:scaleType是控制图片如何 resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:
CENTER /center
按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP / centerCrop
按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
CENTER_INSIDE / centerInside
将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER / fitCenter
把图片按比例扩大/缩小到View的宽度,居中显示
FIT_END / fitEnd
把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
FIT_START / fitStart
把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
FIT_XY / fitXY
把图片 不按比例trackbacks-0
最近碰到一个需求,要求是在不知道图片宽度和高度的情况下,让图片在指定宽度内充满,同时高度自适应,在网络上查找了一下,也有很多解决方法,后来针对自己的应用,选择了一个修改较小的方案,最后证明效果还是蛮不错的,记录在这里,希望能帮助到有同样需求的人。
好了,言归正传
首先,需要给你的ImageView布局加上android:adjustViewBounds="true"
&ImageView android:id="@+id/test_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:adjustViewBounds="true"
android:layout_gravity="center"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_launcher" /&
然后,在代码里设置ImageView.最大宽度和最大高度,因为adjustViewBounds属性只有在设置了最大高度和最大宽度后才会起作用
int screenWidth = getScreenWidth(this);
ViewGroup.LayoutParams lp = testImage.getLayoutParams();
lp.width = screenW
lp.height = LayoutParams.WRAP_CONTENT;testImage.setLayoutParams(lp);
testImage.setMaxWidth(screenWidth);testImage.setMaxHeight(screenWidth * 5); 这里其实可以根据需求而定,我这里测试为最大宽度的5倍
ok,接下来,再按照常规方法加载图片就会得倒预期的效果了,需要的同学可以试试,good luck.
下面是我的应用效果,有想看的可以自己去找下/myapp/detail.htm?apkName=com.puerlink.igo
阅读(...) 评论() &5339人阅读
初级android(31)
1、如何在代码中获取控件在布局文件中宽、高的值,
2、并修改其大小即修改控件的显示比例?
下面用Imageview控件举例来实现此过程。
代码如下:
public class GetWidgetSize extends Activity
int imageOriginalHeight = 0;
int imageOriginalWidth = 0;
boolean firstFlag =
ImageView image =
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
image = (ImageView) findViewById(R.id.image);
* 通过setLayoutParams(new LinearLayout.LayoutParams())来还原布局中设置的高度,宽度
Button getBtn = (Button) findViewById(R.id.button1);
getBtn.setOnClickListener(new OnClickListener()
public void onClick(View arg0)
image.setLayoutParams(new LinearLayout.LayoutParams(
imageOriginalWidth, imageOriginalHeight));
* 通过setLayoutParams(new LinearLayout.LayoutParams())来设置控件显示的大小
Button setBtn = (Button) findViewById(R.id.button2);
setBtn.setOnClickListener(new OnClickListener()
public void onClick(View arg0)
image.setLayoutParams(new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
* 通过这种方法获取image控件在手机里面显示出来的高度和宽度
ViewTreeObserver vto = image.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
public void onGlobalLayout()
if (firstFlag == true)
firstFlag =
imageOriginalHeight = image.getMeasuredHeight();
imageOriginalWidth = image.getMeasuredWidth();
System.out.println(&imageHeight=& + imageOriginalHeight
imageWidth==& + imageOriginalWidth);
* 重写菜单键,退出程序
public boolean onCreateOptionsMenu(Menu menu)
super.onCreateOptionsMenu(menu);
MenuItem item = menu.add(Menu.NONE, Menu.NONE, Menu.NONE, &Exit&);
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()
public boolean onMenuItemClick(MenuItem item)
System.exit(0);
首先应明确一点,竟然我们可以在代码中进行布局,我们就应该有办法对布局中的控件进行大小修改。就如在代码中配置文件中可以设置Acitivity横竖屏自感应,同样可以在代码中实现。
在Acitivity中我们常通过Display来获取屏幕高度和宽度,实现代码如:
Display display = getWindowManager().getDefaultDisplay();
int height = display.getHeight();
int width = display.getWidth();但若获取某个控件的高度和宽度,尝试过的哥们都知道,在Acitivity的oncreate()和onPostResume()里都不能获取到控件的大小,通过控件.getHeight()方法得到的都是0,想想原因,在执行onresume后,控件才显示出来,于是oncreate里面获取到0值就可以理解了,至于onPostResume()里面还是0值,还只是想当然,若确定原因,还望指点。了解这些,我们就是通过button点击事件可以获取某个控件的高宽度。
2、在代码中想改变某个控件的大小,得通过setLayoutParams()来实现,暂还没看到其他方法,若有知道的请指点。
注:参考网站
附:demo在资源里面
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:560375次
积分:5714
积分:5714
排名:第2362名
原创:105篇
评论:91条
(1)(1)(1)(1)(5)(4)(4)(2)(4)(4)(4)(2)(2)(7)(6)(6)(11)(9)(10)(8)(8)(9)查看: 2294|回复: 7
主题精华0帖子在线时间21 小时UID231971技术分35 资源分1 激情45 积分115分享博客好友记录相册注册时间最后登录
正八品, 积分 115, 距离下一级还需 85 积分
UID231971技术分35 资源分1 激情45 博客记录相册
最近项目中使用了sdwebimage,我通过sdwebimage下载了图片,添加到单元格中,我需要根据图片的大小,动态的调整单元格的高度,目前做的有问题,滑动table的话数据会乱,请问大家有没有什么好的方法,如果有demo就更好了。这个问题困扰我好几天了,盼复!!!
我不知道你是不是要做成想微博那样的东西,其实在很多列表中,图片的大小在列表中都是固定的,如果非要显示与图片的大小一样,那你还是获取图片之后刷新列表,可以设置动态设置列表的高度。
主题精华0帖子在线时间146 小时UID16技术分26580 资源分1119 激情3539 积分41819分享博客好友记录相册注册时间最后登录
UID16技术分26580 资源分1119 激情3539 博客记录相册
我不知道你是不是要做成想微博那样的东西,其实在很多列表中,图片的大小在列表中都是固定的,如果非要显示与图片的大小一样,那你还是获取图片之后刷新列表,可以设置动态设置列表的高度。
主题精华0帖子在线时间21 小时UID231971技术分35 资源分1 激情45 积分115分享博客好友记录相册注册时间最后登录
正八品, 积分 115, 距离下一级还需 85 积分
UID231971技术分35 资源分1 激情45 博客记录相册
自己顶一下
主题精华0帖子在线时间76 小时UID40406技术分840 资源分11 激情141 积分1313分享博客好友记录相册注册时间最后登录
从六品, 积分 1313, 距离下一级还需 1187 积分
UID40406技术分840 资源分11 激情141 博客记录相册
微博 列表是不是单独刷新一个cell的高度 ,还是整个列表都刷新
为了增加吸引力 我换了图片!希望有人关注我的问题
主题精华0帖子在线时间21 小时UID231971技术分35 资源分1 激情45 积分115分享博客好友记录相册注册时间最后登录
正八品, 积分 115, 距离下一级还需 85 积分
UID231971技术分35 资源分1 激情45 博客记录相册
symbian_love 发表于
我不知道你是不是要做成想微博那样的东西,其实在很多列表中,图片的大小在列表中都是固定的,如果非要显示 ...
多谢回复,我的项目中数据源图片尺寸都不是一样的,所以我必须根据不同的图片大小动态设置不同的高度(imageview宽度设置一致),现在遇到问题是用的是老版sdwebimage没法使用block,新版的出现下面问题 “-[UIImageView setImageWithURL:placeholderImage:completed:]: unrecognized selector sent to。。。”但是明明有这个方法啊
主题精华0帖子在线时间21 小时UID231971技术分35 资源分1 激情45 积分115分享博客好友记录相册注册时间最后登录
正八品, 积分 115, 距离下一级还需 85 积分
UID231971技术分35 资源分1 激情45 博客记录相册
已经解决了,把sdwebimage block的问题解决了就好了,根据图片下载后的状态动态更新height和cell即可。
主题精华0帖子在线时间5 小时UID319516技术分20 资源分1 激情0 积分32分享博客好友记录相册注册时间最后登录
正八品, 积分 32, 距离下一级还需 168 积分
UID319516技术分20 资源分1 激情0 博客记录相册
敢问楼主怎样& &根据图片下载后的状态动态更新height和cell的??
主题精华0帖子在线时间5 小时UID319516技术分20 资源分1 激情0 积分32分享博客好友记录相册注册时间最后登录
正八品, 积分 32, 距离下一级还需 168 积分
UID319516技术分20 资源分1 激情0 博客记录相册
yyzz0920 发表于
已经解决了,把sdwebimage block的问题解决了就好了,根据图片下载后的状态动态更新height和cell即可。
敢问楼主怎样& &根据图片下载后的状态动态更新height和cell的??
及时将最新信息发给我
通过Email及时将最新的模板和服务发给我。
及时了解我们最新动态。关注我们的微博
官方微博: &&&
Powered by}

我要回帖

更多关于 imageview设置宽度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信