尽管调用了方法" setNeedDisplay" UIVcrollView内的UIView没有刷新自己。

时间:2013-12-12 11:16:09

标签: ios iphone objective-c uiview uiscrollview

我的内部有UIScrollView,有些视图是从xib文件加载的。

UIScrollView仅加载三个Views。当前,左边和右边。

例如,我在左边有一个视图,在当前View右边有一个视图。如果我向右滚动,UIScrollView将删除左侧的视图,向右滚动到新的当前View并将新视图加载到新当前{{1}的右侧}。

另外,我在View之外有一个按钮。单击它时,它会更改UIScrollView上显示的当前视图的背景颜色。

它运作良好但有时候,我不知道为什么,当我点击按钮更改视图的背景颜色很好的改变,但视图没有刷新所以用户无法看到更改背景颜色。

UIScrollView:

UIScrollView

点击按钮更改当前视图的背景颜色时的方法调用

container = [[UIScrollView alloc] initWithFrame:frame];
[container setBackgroundColor:[UIColor clearColor]];
[container setCanCancelContentTouches:NO];
[container setClipsToBounds:NO];
[container setShowsHorizontalScrollIndicator:NO];
[container setPagingEnabled:YES];

因此,正如您在方法结束时所看到的那样,我尝试在从- (void)menuColor:(MenuPickerViewController *)controller didPickOption:(UIView *)button { // Get the object containing the data of the product linked with the view. MyProduct *product = (MyProduct *)[MyProduct getProduct:[_slider getCurrentContentDisplayed]]; // Get the the superview of the button sender to have an access for the attributes of this button (color selected, ...) ColorButtonMenu *colorView = (ColorButtonMenu *)[button superview]; // Get the current UIView displayed in the UIScrollView MyView *myView = (MyView *)[self sliderGetViewWithID:[_slider getCurrentContentDisplayed] FromSlider:_slider]; // I check with debugger, the color is well setted product.color = colorView.color; // "border" is a view in my xib that I want change its background color. IFPrint(@"myView.border backgorund color before: %@\n", myView.border.backgroundColor.description); [myView.border setBackgroundColor:[Utilities colorFromHexString:colorView.color]]; [myView.border setNeedsDisplay]; IFPrint(@"myView.border backgorund color after: %@\n", myView.border.backgroundColor.description); IFPrint(@"=== DEBUG ===\n"); IFPrint(@"isMainThread ? : %i\n", [NSThread isMainThread]); // Always return YES IFPrint(@"myView: %@\n", myView); // Always return the address of a valid pointer IFPrint(@"myView border: %@\n", myView.border); // Always return the address of a valid pointer IFPrint(@"=============\n\n"); } 加载的视图上调用方法setNeedsDisplay,在“边框”内调用另一个视图但是没有效果。 而且,我的方法总是在主线程上调用。

任何假设?

谢谢!

修改:

显然,我已经测试过sliderGetViewWithID返回的视图是否是正确的视图。所有属性都设置得很好。在我看来,这确实是一个刷新问题。

2 个答案:

答案 0 :(得分:0)

你确定你试图设置背景颜色的视图实际上是可见的吗?我猜它可能是屏幕外的,所以你什么也没看到。

您可能希望通过查找scrollview的边界和myView的框架之间的交集来捕获该事件。如果没有交集,那意味着myView实际上不可见。

所以代码是:

BOOL intersects = CGRectIntersectsRect(scrollview.bounds, myView.frame);
if(intersects == NO)
{
    NSLog(@"myView is offscreen");
}

答案 1 :(得分:0)

问题解决了:

设置视图的背景颜色后。我从UIScrollView中删除视图,然后在UIScrollView中添加它。这有点棘手,但效果很好!

[myView removeFromSuperView];
[myScrollView addSubview:myView];