大致看了下源码,如果需要圆角的imageView,会重绘image吗?那样就入侵性太强了,做缩放的imageview有问题
kevintodo opened this issue · 5 comments
每次触发image的setter,会按需截取掉图片的圆角,再做一次setImage。朋友说的重绘是指?
重绘就是重画image,比如我原始图片1000_1000,重绘变成100_100了。那样就不能做高清图的缩放查看了,我觉得重绘应该是按需要,image的setter里没有设置圆角的不重绘,其他的可以加个可选参数,是否重绘图片大小。
@kevintodo
是的,会按照容器imageView的尺寸进行重画,处理后大图的尺寸的确会变小。
但是目前只能通过重画去切掉所需的圆角度,当然可以按照image的size而非imageView的size去重画,但是这样的话,只能将image再次set进imageView而非现在的[imageView.layer renderInContext:currentContext],这也是以前的做法,那样的话imageView的contentMode特性将无法保留作用。
不知朋友的需求是否是为可缩放高清图切圆角?但是可缩放高清图的需求我想一屏内的数量应该不多,也许没必要用到避免离屏框架?目前不使用该框架设置圆角的imageView是不会触发上述重绘的。
哦,你这样做是对的,是我没仔细看。我需要的是image的setter里没有设置圆角的不重绘就行了。
我运行了代码,发现- (void)validateFrame {
if (self.frame.size.width == 0) {
[self.class swizzleLayoutSubviews];
}
}
是一个神奇的方法。
我在demo里加了
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[imageView setFrame:CGRectMake(130, 80, 200, 200)];
[imageViewSecond setFrame:CGRectMake(130, 280, 200, 200)];
[imageViewThird setFrame:CGRectMake(130, 480, 200, 200)];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"%@",NSStringFromCGSize(imageView.image.size));
NSLog(@"%@",NSStringFromCGSize(imageViewSecond.image.size));
NSLog(@"%@",NSStringFromCGSize(imageViewThird.image.size));
});
}
image的size,居然靠if (self.frame.size.width == 0),魔法变化。这样使用者,会比较迷茫。
@kevintodo
-validateFrame的存在其实只是针对Masonry,并不是主要的功能流程,因为Masonry布局属性要比传统IB布局(sb,xib)的时机晚,在setImage的时候经常存在未布局容器imageView的可能,所以-validateFrame将切角处理推迟到-layoutSubviews了。-validateFrame的生效条件当然也是使用者为容器设置了圆角属性,所以它只是一个容错措施,并不是主要功能实现流程。
还有朋友加的那段打印image size的代码是有什么问题?