修改UIView的抗锯齿问题

时间:2011-09-10 09:11:22

标签: uiview resize core-animation calayer antialiasing

我的iPhone应用程序以纵向模式显示轮子:
enter image description here

当它旋转到横向模式时,它会放大此滚轮的顶部象限:
enter image description here

我这样做的方法是创建一个UIView(界限:768 x 768)来容纳方向盘,然后:

- (void) layoutSubviews
{
    UIDeviceOrientation O = [UIDevice currentDevice].orientation;
:
    [self repositionWheelTo: O];
}

- (void) repositionWheelTo: (UIDeviceOrientation) O
{    
    BOOL is_L = UIInterfaceOrientationIsLandscape( O );

    CGPoint centerPoint = CGPointFromPoint2D( centreOfRect( self.bounds ) );
    float sc = 320.0 / 768.0;

    if( ! isIPad() && is_L )
    {
        centerPoint.y += 200;
        sc *= 2.0;
    }

    if( isIPad() )
        sc = 1.0;

    wvContainer.center = centerPoint;
    wvContainer.transform = CGAffineTransformMakeScale( sc, sc ); 
}

这意味着它现在可以正确地绘制以适应iPad和iPhone纵向屏幕内的整个滚轮,并且在iPhone-landscape上它的尺寸增加了一倍。

因此,在iPhone肖像中,您可以想象一个768x768的方形,它围绕实际的设备屏幕延伸,并且设置了变换,以便按钮只被绘制到它的中间部分。

可以说是浪费了内存,但是现在我正在努力保持代码的可管理性,而且我看不到更好的方法,这让我可以在纵向和横向之间平滑过渡。

问题是,它在iPhone肖像上看起来真的很糟糕。抗锯齿只是不正常。你可以看到A中Am的清晰阶梯效果,当它旋转到风景时会消失。

如何在纵向模式下以可接受的质量渲染滚轮?

1 个答案:

答案 0 :(得分:2)

您遇到了另一个questions about filtering中遇到的问题,即bilinear filtering无法在不引入别名的情况下缩放小于50%的图像(请参阅“限制”部分)。在iPhone上的纵向情况下,您的比例因子sc为0.41666 ...,低于该阈值。

考虑在纵向(即更接近显示尺寸)时切换到车轮的低分辨率版本,可能是在重新定位车轮时。如果以编程方式绘制轮子,则可以通过在视图上设置bounds而不是transform并将视图的contentMode设置为{{1}来让UIKit为您触发重绘}}