- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我制作了一个 UIViewController
,它符合 UITableViewDataSource
和 UITableViewDelegate
协议(protocol),并且有一个 UITableView
subview 。
我已将表格的 backgroundView
属性设置为 UIImageView
,以便将图像显示为表格的背景。
为了自定义单元格之间的间距,我将行高设置得比我想要的大,并将单元格的 contentView 自定义为我想要的大小,使其看起来像是有额外的空间 ( Following this SO answer )。
我想为单元格添加模糊,使背景模糊,我通过 Brad Larson's GPUImage framework 做到了这一点.然而,这工作正常,因为我希望背景模糊在滚动时更新,滚动变得非常滞后。
我的代码是:
//Gets called from the -scrollViewDidScroll:(UIScrollView *)scrollView method
- (void)updateViewBG
{
UIImage *superviewImage = [self snapshotOfSuperview:self.tableView];
UIImage* newBG = [self applyTint:self.tintColour image:[filter imageByFilteringImage:superviewImage]];
self.layer.contents = (id)newBG.CGImage;
self.layer.contentsScale = newBG.scale;
}
//Code to create an image from the area behind the 'blurred cell'
- (UIImage *)snapshotOfSuperview:(UIView *)superview
{
CGFloat scale = 0.5;
if (([UIScreen mainScreen].scale > 1 || self.contentMode == UIViewContentModeScaleAspectFill)) {
CGFloat blockSize = 12.0f/5;
scale = blockSize/MAX(blockSize * 2, floor(self.blurRadius));
}
UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, scale);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, -self.frame.origin.x, -self.frame.origin.y);
NSArray *hiddenViews = [self prepareSuperviewForSnapshot:superview];
[superview.layer renderInContext:context];
[self restoreSuperviewAfterSnapshot:hiddenViews];
UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return snapshot;
}
-(UIImage*)applyTint:(UIColor*)colour image:(UIImage*)inImage{
UIImage *newImage;
if (colour) {
UIGraphicsBeginImageContext(inImage.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect area = CGRectMake(0, 0, inImage.size.width, inImage.size.height);
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -area.size.height);
CGContextSaveGState(ctx);
CGContextClipToMask(ctx, area, inImage.CGImage);
[[colour colorWithAlphaComponent:0.8] set];
CGContextFillRect(ctx, area);
CGContextRestoreGState(ctx);
CGContextSetBlendMode(ctx, kCGBlendModeLighten);
CGContextDrawImage(ctx, area, inImage.CGImage);
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
} else {
newImage = inImage;
}
return newImage;
}
现在开始提问:
有没有更好的方法来添加模糊?也许这样就不必在每次移动时都渲染图层? iOS7的控制中心/通知中心似乎可以做到这一点,没有任何滞后。
也许使用 GPUImageUIElement
类?如果是这样,我该如何使用它?我查看的另一种方法是最初在背景图像上创建模糊,然后只裁剪我需要使用的区域,但是我无法让它工作,因为图像可能与或可能不相同屏幕,因此缩放是一个问题(使用 CGImageCreateWithImageInRect()
并且矩形是单元格在表格中的位置)。
我还发现我必须将模糊添加到表格 View 本身,框架是单元格的框架,并且单元格具有清晰的颜色。
提前致谢
编辑根据要求,这是我之前尝试过的图像裁剪代码:
- (void)updateViewBG
{
//self.bgImg is the pre-blurred image, -getContentViewFromCellFrame: is a convenience method to get just the content area from the whole cell (since the contentarea is smaller than the cell)
UIImage* bg = [self cropImage:self.bgImg
toRect:[LATableBlur getContentViewFromCellFrame:[self.tableView rectForRowAtIndexPath:self.cellIndexPath]]];
bg = [self applyTint:self.tintColour image:bg];
self.layer.contents = (id)bg.CGImage;
self.layer.contentsScale = bg.scale;
}
- (UIImage*)cropImage:(UIImage*)image toRect:(CGRect)frame
{
CGSize imgSize = [image size];
double heightRatio = imgSize.height/self.tableView.frame.size.height;
double widthRatio = imgSize.width/self.tableView.frame.size.width;
UIImage* cropped = [UIImage imageWithCGImage:CGImageCreateWithImageInRect(image.CGImage,
CGRectMake(frame.origin.x*widthRatio,
frame.origin.y*heightRatio,
frame.size.width*widthRatio,
frame.size.height*heightRatio))];
return cropped;
}
最佳答案
我设法用一开始我认为行不通的解决方案解决了这个问题。
生成多个模糊图像肯定不是解决方案,因为它的成本很高。我只使用了一张模糊图像并将其缓存。
所以我将 UITableViewCell
子类化:
@interface BlurredCell : UITableViewCell
@end
我实现了两个类方法来访问缓存图像(模糊图像和普通图像)
+(UIImage *)normalImage
{
static dispatch_once_t onceToken;
static UIImage *_normalImage;
dispatch_once(&onceToken, ^{
_normalImage = [UIImage imageNamed:@"bg.png"];
});
return _normalImage;
}
我用了REFrostedViewController用于生成模糊图像的 UIImage 类别
+(UIImage *)blurredImage
{
static dispatch_once_t onceToken;
static UIImage *_blurredImage;
dispatch_once(&onceToken, ^{
_blurredImage = [[UIImage imageNamed:@"bg.png"] re_applyBlurWithRadius:BlurredCellBlurRadius
tintColor:[UIColorcolorWithWhite:1.0f
alpha:0.4f]
saturationDeltaFactor:1.8f
maskImage:nil];
});
return _blurredImage;
}
为了在单元格内产生模糊帧的效果,但仍能看到侧面的非模糊图像,我曾经 ScrollView 。
一个是正常图像的 ImageView ,另一个是模糊图像的 ImageView 。我将内容大小设置为图像的大小,contentOffset
将通过界面设置。
所以表格 View 最终每个单元格都包含整个背景图像,但以一定的偏移量裁剪它并仍然显示整个图像
@implementation BlurredCell
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
[self.contentView addSubview:self.normalScrollView];
[self.contentView addSubview:self.blurredScrollView];
}
return self;
}
-(UIScrollView *)normalScrollView
{
if (!_normalScrollView) {
_normalScrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
_normalScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_normalScrollView.scrollEnabled = NO;
UIImageView *imageView =[[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
imageView.contentMode = UIViewContentModeScaleToFill;
imageView.image = [BlurredCell normalImage];
_normalScrollView.contentSize = imageView.frame.size;
[_normalScrollView addSubview:imageView];
}
return _normalScrollView;
}
-(UIScrollView *)blurredScrollView
{
if (!_blurredScrollView) {
_blurredScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(BlurredCellPadding, BlurredCellPadding,
self.bounds.size.width - 2.0f * BlurredCellPadding,
self.bounds.size.height - 2.0f * BlurredCellPadding)];
_blurredScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_blurredScrollView.scrollEnabled = NO;
_blurredScrollView.contentOffset = CGPointMake(BlurredCellPadding, BlurredCellPadding);
UIImageView *imageView =[[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
imageView.contentMode = UIViewContentModeScaleToFill;
imageView.image = [BlurredCell blurredImage];
_blurredScrollView.contentSize = imageView.frame.size;
[_blurredScrollView addSubview:imageView];
}
return _blurredScrollView;
}
-(void)setBlurredContentOffset:(CGFloat)offset
{
self.normalScrollView.contentOffset = CGPointMake(self.normalScrollView.contentOffset.x, offset);
self.blurredScrollView.contentOffset = CGPointMake(self.blurredScrollView.contentOffset.x, offset + BlurredCellPadding);
}
@end
setBlurredContentOffset:
每次 TableView 的内容偏移量更改时都应调用。
所以在 TableView 委托(delegate)的实现( View Controller )中,我们用这两种方法来实现:
// For the first rows
-(void)tableView:(UITableView *)tableView willDisplayCell:(BlurredCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setBlurredContentOffset:cell.frame.origin.y];
}
// Each time the table view is scrolled
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
for (BlurredCell *cell in [self.tableView visibleCells]) {
[cell setBlurredContentOffset:cell.frame.origin.y - scrollView.contentOffset.y];
}
}
关于ios - 快速模糊 UITableViewCell contentView 背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19366834/
当我将 UIView 放入 Storyboard中的 UITableViewCell 的 contentView 时,无法使它们具有相同的宽度。为什么是这样?我怎样才能使它们具有相同的宽度? subv
我正在创建一个使用 SAML 和 OAUTH2 的登录名。要获取登录 token ,我需要打开一个 Web View ,用户可以在其中输入他的登录凭据并推送登录。当他完成此操作后,它会重定向到带有 S
我正面临 contentView 高度限制的问题。所有标签都有动态高度,即没有固定高度。我在某处读过设置高度等于 ScrollView 高度。 当前 ViewController 的高度为 870px
A(当新创建单元格时): - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexP
我目前正在编写一个包含按钮和绘图的应用程序。我想做的是将两者合并到一个屏幕上。 setContentView(R.layout.activity_login_page); setContentView
使用卡片创建自定义内容 View 的最佳方式是什么?现在我这样做: fileprivate var contentView: View! fileprivate func prepar
我已经对 UITableViewCell 进行了子类化显示UIImage和两个UILabel subview 。在 TableView 的 View Controller 中,在方法 cellForR
我想禁用 Activity 中的用户交互,以便用户无法触摸 Activity 内容 View 内的 View / subview 。有什么办法可以实现吗? 最佳答案 您可以像这样在 Activity
我是 SwiftUI 的新手。试图推进我的计时器应用程序,我被卡住了。 在我的 ContentView 中,我有两个 ObservedObject,一个是管理计时器功能的 Timer 对象,另一个是存
在我正在开发的应用程序中,有一个多步骤注册,4 个步骤: 为了完成它,我想有一个页面来托管注册步骤的内容 View ,当它通过验证要求时,我将其删除并注入(inject)下一个内容 View 。 这是
我想为 contentView 设置填充从自定义内部 UICollectionViewCell所以它比细胞本身小。 我尝试通过为 contentView 设置 anchor 来做到这一点但这个 Vie
我有一个android项目作为库,这个库包含一个主屏幕。新应用程序需要这个主屏幕(以及库中的其他所有内容),但还需要对所有图形进行更改,并添加一些新按钮,我该怎么做? 我不想编辑库。我可以让新应用程序
我单独创建了一个 contentview,这样我就可以在不同的 ContentPage 中重用它。 这是我的 ContentView.XAML
我有一个 ScrollView,在其中更改其 contentSize (具体高度)。当我这样做时,附加到 ScrollView 的 ContentView 的大小不会相应改变。 ContentView
我有一个简单的 Nativescript 应用程序 - 只有 1 个组件显示标签“Hello World”。在安卓模拟器上运行良好。但是当我尝试在 IOS 设备上预览它时,它给了我这个错误 - 由于未
我正在使用 Grouped UITableView 并添加 UITableViewCells 两个 UILabel,并将它们添加到单元格的 contentView。我还在我的应用程序中在此 UITab
当我在表格 View 上选择一个单元格时,默认情况下它会将其 ContentView 背景颜色更改为浅灰色,我试图覆盖它。 我正在使用以下代码从选区中删除此灰色。但它正在删除该单元格内所有内容(UIV
我有一个带有背景图像的 ViewController,它作为 TableVC 作为它的 subview 。我希望 TableView 是透明的并且已经实现了,tableviewcell 也是透明的。但
我正在尝试以编程方式创建约束,以将这个粉红色的 UIView 置于 UITableViewCell 的中心。但是,当我添加约束时,它们不适用,并且我在控制台中收到一条消息,指出某些 NSAutores
我正在创建 ContentView 的子类 UserPostView 以用作 ListView 中的数据模板。我通过创建 UserPostView 的新实例将项目动态添加到 ListView 的 It
我是一名优秀的程序员,十分优秀!