- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试开发一个库,它获取一组图像并返回一个并排显示图像的 ScrollView 。
但是,当我添加这个 scrollView 时,我要返回到我的主视图,它不会添加图像。图片正确。
我的想法是使用一个 ScrollView ,每个图像并排显示,并使用滚动条像幻灯片一样显示。首先,这个概念可以吗?
其次,我不明白为什么在模拟器中运行应用程序时不显示图像。
如需更多详细信息,请询问。
代码如下。我的头文件:
#import <UIKit/UIKit.h>
@interface HCIImageSlideShowView : UIScrollView
-(void) setImages:(NSArray*) imagesArray;
-(void) setBounds:(CGRect)bounds;
-(void) setCaptions:(NSArray*) imageCaptionsArray;
-(void) isEditable:(BOOL)edit;
-(void) setSlideTime:(int) milliSeconds;
-(void) startSlideShow;
- (id) initWithImages:(NSArray*)imagesArray captionsArray:(NSArray*) captionArray
bounds:(CGRect)bounds slideTime:(int)milliSeconds;
@end
我的实现文件:
#import "HCIImageSlideShowView.h"
#import "HCIResultListViewController.h"
@interface HCIImageSlideShowView ()
@property (strong,nonatomic) NSMutableArray *imagesArray;
@property BOOL editable;
@property (nonatomic) int slideTime;
@property (strong,nonatomic) NSMutableArray *imageCaptionsArray;
@property CGFloat width;
@end
@implementation HCIImageSlideShowView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (id) initWithImages:(NSArray*)imagesArray captionsArray:(NSArray*) captionArray
bounds:(CGRect)bounds slideTime:(int)milliSeconds
{
NSLog([NSString stringWithFormat:@"%f,%f", bounds.size.width , bounds.size.height]);
CGFloat width_t = bounds.size.width;
bounds.size.width = [imagesArray count] * bounds.size.width;
self = [[HCIImageSlideShowView alloc] initWithFrame:bounds];
_width = width_t;
[self setBackgroundColor:[[UIColor alloc] initWithRed:0.2 green:0.1 blue:0.3 alpha:0.4]];
if (self) {
[self setImages:imagesArray];
[self setSlideTime:milliSeconds];
[self setCaptions:captionArray];
[self defaultLoad];
}
self.scrollEnabled = YES;
return self;
}
-(void) defaultLoad
{
NSLog([NSString stringWithFormat:@"%f,%f,%f",_width,self.bounds.size.height,self.bounds.size.width]);
for (int i = 0; i < [_imagesArray count]; i++) {
CGRect imageBounds = CGRectMake(i * _width, self.bounds.size.height, _width, self.bounds.size.height);
UIImageView *imageView = [[UIImageView alloc] initWithFrame:imageBounds];
[imageView setImage:[HCIResultListViewController resizeImage:_imagesArray[i] withWidth:_width withHeight:self.bounds.size.height]];
NSLog([NSString stringWithFormat:@"%f,%f",imageView.bounds.size.height,imageView.bounds.size.width]);
[self addSubview:imageView];
}
}
-(void) setBounds:(CGRect)bounds
{
self.bounds = bounds;
}
-(void) setImages:(NSArray *)imagesArray
{
_imagesArray = [[NSMutableArray alloc] initWithArray:imagesArray];
}
-(void) setSlideTime:(int)milliSeconds
{
_slideTime = milliSeconds;
}
-(void) startSlideShow
{
}
-(void) isEditable:(BOOL)edit
{
_editable = edit;
}
-(void) setCaptions:(NSArray *)imageCaptionsArray {
_imageCaptionsArray = [[NSMutableArray alloc] initWithArray:imageCaptionsArray];
}
@end
最佳答案
您的代码似乎有很多错误 - 特别是您的初始化程序。这是注释版本
@interface HCIImageSlideShowView : UIScrollView
-(void) startSlideShow;
- (id) initWithImages:(NSArray*)imagesArray captionsArray:(NSArray*) captionArray
bounds:(CGRect)bounds slideTime:(int)milliSeconds;
/*
remove this custom initialiser as it is quite wrong.
Use the default initialiser (don't override)
then set the properties after you have created the object.
*/
/* Remove all of your custom setters.
If any of these properties need setting outside of the class,
move the property declarations to the .h file.
*/
-(void) setImages:(NSArray*) imagesArray;
-(void) setBounds:(CGRect)bounds;
-(void) setCaptions:(NSArray*) imageCaptionsArray;
-(void) isEditable:(BOOL)edit;
-(void) setSlideTime:(int) milliSeconds;
@end
#import "HCIImageSlideShowView.h"
#import "HCIResultListViewController.h"
@interface HCIImageSlideShowView()
/*
make these properties public by moving them to your .h file
so that you can set them from the calling object
*/
@property (strong,nonatomic) NSMutableArray *imagesArray;
@property BOOL editable;
@property (nonatomic) int slideTime;
@property (strong,nonatomic) NSMutableArray *imageCaptionsArray;
@property CGFloat width;
@end
@implementation HCIImageSlideShowView
- (id) initWithImages:(NSArray*)imagesArray captionsArray:(NSArray*) captionArray
bounds:(CGRect)bounds slideTime:(int)milliSeconds
/*
You seem to be getting confused with init,
so I suggest you do not make a custom init method at all.
Initialise your object with the default initWithFrame,
then have the caller set properties on your newly
made object after initiliasation.
*/
{
NSLog([NSString stringWithFormat:@"%f,%f", bounds.size.width , bounds.size.height]);
/*
This is the way to use NSLog...
NSLog(@"%f,%f", bounds.size.width , bounds.size.height);
*/
CGFloat width_t = bounds.size.width;
/*
double assignment: two lines further down you assign
width_t to _width. You can do that here in one step
*/
bounds.size.width = [imagesArray count] * bounds.size.width;
self = [[HCIImageSlideShowView alloc] initWithFrame:bounds];
/*
This is wrong. Although as Hermann says it may be _legal_, don't do it!
-Never alloc an object inside it's own initialiser.
The memory will already have been alloc'd by the caller.
- Never assign to self anything but the return value from super's init.
*/
_width = width_t;
/*
please be consistent with your iVar/property naming.
Here you are addressing the ivar _width, 2 lines up
you are using the property accessor syntax self.bounds.
In you case I would recommend ALWAYS using self.varName
except inside a custom setter or getter.
*/
[self setBackgroundColor:[[UIColor alloc] initWithRed:0.2 green:0.1 blue:0.3 alpha:0.4]];
if (self) {
//[self setImages:imagesArray];
self.imagesArray = [imagesArray mutableCopy];
//[self setSlideTime:milliSeconds];
self.slideTime = milliSeconds;
//[self setCaptions:captionArray];
self.imageCaptionsArray = [captionArray mutableCopy];
/*
As my comment above - use property syntax and try to
avoid writing your own setters and getters
unless you have a very good reason.
*/
[self defaultLoad];
}
self.scrollEnabled = YES;
return self;
}
由于您的初始化代码需要一些重新安排,我没有仔细查看 defaultLoad
- 但是我确实有一些观察结果......
(1)
CGRect imageBounds = CGRectMake(i * _width, self.bounds.size.height, _width, self.bounds.size.height);
应该是
CGRect imageBounds = CGRectMake(i * _width,0, _width, self.bounds.size.height);
否则,您的图片将全部放置在 ScrollView 高度下方的屏幕外。
(2)
你需要设置一个contentSize,这样scrollView才能滚动
[scrollView setContentSize:(CGSize){self.width*[imageArray count],self.bounds.size.height}];
另一个更笼统的评论是,这对于一些图像来说是可以的,但是你不希望制作一个带有大量屏幕外 ImageView 的 ScrollView ,因为你会耗尽内存。您实际上只需要三个,用于当前屏幕上的图像,以及左右两侧的上一张和下一张图像。这个想法是仅在您可能需要时加载您的图像,并像 tableView 的工作方式一样回收您的 imageView。
你应该看看Apple's Photoscroller sample app以及随附的 WWDC 2010/11 视频和 slides
不要担心有关平铺和缩放的所有细节,最好了解将对象创建保持在最低限度并在可行的情况下回收/重用对象的一般原则。
顺便说一句,您可能根本不需要自定义 scrollView 对象:您可以从调用 viewController 对象的几行代码中实现大部分您想要的。例如……
- (void) viewDidLoad {
[super viewDidLoad];
UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
[scrollView setBackgroundColor:[UIColor redColor]];
NSArray* imageArray = @[[UIImage imageNamed:@"image1.png"]
,[UIImage imageNamed:@"image2.png"]
,[UIImage imageNamed:@"image3.png"]
];
CGFloat width = scrollView.bounds.size.width;
CGFloat height = scrollView.bounds.size.height;
for (int i = 0; i < [imageArray count]; i++) {
CGRect imageFrame = CGRectMake(i * width, 0, width, height);
UIImageView *imageView = [[UIImageView alloc] initWithFrame:imageFrame];
[imageView setImage:imageArray[i]];
[scrollView addSubview:imageView];
}
[scrollView setContentSize:(CGSize){width*[imageArray count],height}];
[self.view addSubview:scrollView];
}
关于ios - UIImageView 未添加到 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15478155/
我一直在尝试实现这一点,但找不到任何可以在删除它们时像 iPhone 应用程序抖动一样抖动它的代码! CABasicAnimation *animation =
我有一个代码在 UIImageView.isAnimating 为 false 之后执行一些操作 但有趣的是它永远不会出错,它总是处于 YES 状态。 "isAnimating return is f
我的 UIViewController 中有一个 UIImageView。我在上面设置了一个图像。我做了如下旋转。 - (void) runSpinAnimationOnView:(UIImageVi
我有一个带有图像的 UIImageView。我在显示之前旋转了图像,方法是将 UIImageView 的变换属性设置为 CGAffineTransformMakeRotation(angle),其中角
如果有解决我的问题的答案,请给我一个链接。否则这是我的问题: 我目前正在运行 Swift 2.0 (Xcode 7) Sprite Kit Game,想知道 UIImageView 是否可以跟随另一个
我不知道我的想法是否正确,但我的问题是我在 UITableView 中有自定义单元格(看起来像汽车),每个单元格包含 2 个 UIImageViews(车轮图像),我需要旋转当 UITableView
我想知道是否有办法使用透明的 UIImageView(框 C)来剪辑移动到其上方的某些图像。 在我的示例中,我将均为 UIImageView 的框 A 和 B 移向透明的框 C。一旦盒子发生碰撞,我只
我有一个带有固定图像的 UIImageView。我想在顶部添加第二个 UIImageView,我打算旋转它。我需要在运行时创建顶部图像。我找不到在哪里处理透明度。它在 UIImage 中还是在 UII
我有一个要求,我有一个 UIImageView 在另一个之上。当用户在其上“绘制”时,我需要使顶部透明。实际上,不是绘制用户将要做的事情,而是“删除”顶 View ,让下面的 View 显示出来。 我
您好,我有一个 UIImageView,它部分在屏幕上,部分在屏幕外。 我想围绕屏幕外的一个点( View 的中心)旋转 View 。 我该怎么做? fullRotationAnimation
我有两张图片。一个图像是矩形第二个是三角形我想使用一根手指或触摸事件从矩形图像的中心点旋转三角形图像。 最佳答案 好吧,如果您希望图像围绕矩形中心点以任意大小的圆旋转,那么数学会变得相当复杂,但是一个
我想知道是否可以将更多的 UIImageView 分组到一个 ImageView 中。例如,如果我有 4 个 imageView,并且我想以完全相同的方式为它们制作动画,我可以将它们组合成一个,然后为
我正在代码中创建多个 UIImageView,并且想要移动和删除我选择的任何 UIImageView。现在,我只能移动使用 UIPanGestureRecognizer 创建的最后一个 UIImage
现在,我已经让它能够在我的应用程序上移动图像、缩放图像、捏合图像……应有尽有。但我的问题是,当一个 UIImageView 位于另一个 UIImageView 时,我如何才能让应用程序注册? 最佳答案
我有一个 UIImageView 应该从 size (0,0) --> (93,75) 开始动画 我有以下内容 [UIView animateWithDuration:0.5 delay:0 op
我这里的问题应该是一个相当简单的问题。基本上,我试图将一个对象 (UIImageView) 从 A 点(它在 Storyboard中设置的位置)移动到我以编程方式定义的 B 点。 我第一次通过这个导致
我有一个带有包含图像的单元格的 UITableView。我想从服务器下载一个大图像并将其插入到我的单元格中。 我的 UITableViewCell 有一个固定的高度并且填满了屏幕的整个宽度。最好的解决
当用户选择新的图像过滤器时,我尝试对图像进行交叉淡入淡出。 所以我在第一个ImageView之上创建了第二个ImageView,并对顶部 View 的alpha进行动画处理以显示或隐藏底部 View
我有一个 UIScrollView,其中包含 n 个占位符 UIImageView。下面我有一个 StackView,其中包含 10 个图像,用户可以从中选择并将图像拖动到上面的特定占位符 Image
尝试设置“选定框”图形的边界的多种组合,该图形仅显示用户在 UIImageView 中触摸的位置。它仍然继续坚持 super View 坐标系 class ViewController: UIView
我是一名优秀的程序员,十分优秀!