0

我放弃。似乎无法使这个非常基本的事情起作用。请帮忙...

我正在尝试将图像从 URL 加载到可滚动的、捏合/缩放的屏幕上。

这是我的代码片段,它产生一个空白的白色屏幕。我选择将它放在 viewDidAppear 中:

@property (weak, nonatomic) UIScrollView *scrollView;
@property (weak, nonatomic) UIImageView *imageView;

...

- (void)viewDidAppear:(BOOL)animated {

    NSData *photoData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:urlForImage]];
    UIImage *photoImage = [[UIImage alloc] initWithData:photoData];

    self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
    [self.scrollView setContentSize:photoImage.size];
    [self.scrollView setMinimumZoomScale:1];
    [self.scrollView setMaximumZoomScale:5];
    [self.view addSubview:self.scrollView];

    self.imageView = [[UIImageView alloc] initWithImage:photoImage];
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
    [self.imageView setFrame:self.view.frame];
    [self.scrollView addSubview:self.imageView];

}

我还实现了 viewForZoomingInScrollView:

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{ 
    return self.imageView;
}

我得到一个白屏。我错过了什么?先感谢您。

4

1 回答 1

1

正如@jonkroll 建议的那样,问题在于您将保留对象分配给弱变量。它不像 IBOutlet,它通常应该是 weak。在这里,您肯定想将其更改为强,它应该可以解决您的问题。

为了演示当前的问题,例如,如果您在 alloc/init 语句之后为 scrollView 放置以下语句,您可能会惊讶地看到它是 nil,因为 ARC 已经为您发布了它,例如:

NSLog(@"scrollView = %p", scrollView);

让他们坚强,你就没事了。如果你只用 scrollView 和 imageView 替换你的 self.scrollView 和 self.imageView,你可能会看到编译器警告。

或者,如果您出于其他原因不需要这些变量,您也可以完全忘记将它们设置为属性,并将它们设置为 viewDidLoad 方法的本地变量(当您将它们添加为子视图时,视图本身将被保留......不除非出于某种原因在其他方法中需要 vars,否则有理由将它们设为属性或 ivars)。除非需要,否则我不喜欢添加属性或 ivars。如果您需要它们,很好,您需要它们,但如果您不需要,请将它们设为本地 viewDidLoad 变量。

于 2012-04-18T02:41:31.477 回答