2013-02-11 13 views
6

Powiedzmy, że mam UIImageView z ramką (0,0,100,30) ., Że obraz został przypisany obrazowi.Jak ukryć podramkę UIView?

jaki jest najprostszy sposób wyświetlenia tylko części obrazu?

na przykład: tylko to, co pojawia się w punktach 30-60 (szerokość) i 0-30 (wysokość). oznacza to, że lewa i prawa krawędź obrazu powinna być ukryta.

tylko po to, aby wyjaśnić, nie chcę przenosić widoku ani zmieniać jego rozmiaru, chcę tylko ukryć podrys jego ramki.

Odpowiedz

3

Zawsze można ustawić maskę.

CALayer *maskLayer = [CALayer layer]; 
maskLayer.backgroundColor = [UIColor blackColor].CGColor; 
maskLayer.frame = CGRectmake(30.0, 0.0, 30.0, 30.0); 

view.layer.mask = maskLayer; 

Maski mogą być dowolnego typu warstwy, więc można nawet użyć CAShapeLayer złożonych masek i zrobić kilka naprawdę fajnych rzeczy.

+0

Property fillColor nie znaleziono obiektu typu 'CALayer *'. czy brakuje mi importu? –

+0

, więc ustawienie koloru tła na CGColor (nie fillColor) zmyśliło. @Ryan Poolos, edytuj swoją odpowiedź, a ja ją zaakceptuję. –

+0

Och, przepraszam. 'fillColor' jest właściwością' CAShapeLayer' i zazwyczaj używam warstwy kształtów dla moich masek. Stworzenie przyzwyczajenia. : p –

0

Uważam, że maskowanie obrazu jest najlepszą opcją. Jeśli jednak chcesz obrócić, przekształcić, animować lub chcesz uzyskać wyraźne tło, możesz zrobić coś takiego:

Utwórz widok podrzędny, który jest wielkością obrazu, który chcesz wyświetlić. Upewnij się, że ma on wartość clipsToBounds jako true i umieść odpowiednio obraz.

UIView *mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 30)]; 

//this is the part of the image you wish to see 
UIView *imageWindow = [[UIView alloc] initWithFrame:CGRectMake(30, 0, 30, 30)]; 
imageWindow.clipsToBounds = YES; 

//your image view is the height and width of mainView and x and y is imageWindow - mainView. You can do this manually or put in calculations. 
UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(imageWindow.frame.origin.x - mainView.frame.origin.x, imageWindow.frame.origin.y - mainView.frame.origin.y, mainView.frame.size.width, mainView.frame.size.height)]; 
myImage.image = [UIImage imageNamed:@"1024x1024.png"]; 

[imageWindow addSubview:myImage]; 
[mainView addSubview:imageWindow]; 
[self.view addSubview:mainView]; 

Patrząc na mojego kodu, nie sądzę mainView jest konieczne i można dodać imageWindow do self.view bezpośrednio.

0

Znalazłem ten roztwór działa na mnie, https://stackoverflow.com/a/39917334/3192115

func mask(withRect rect: CGRect, inverse: Bool = false) { 
    let path = UIBezierPath(rect: rect) 
    let maskLayer = CAShapeLayer() 

    if inverse { 
     path.append(UIBezierPath(rect: self.view.bounds)) 
     maskLayer.fillRule = kCAFillRuleEvenOdd 
    } 

    maskLayer.path = path.cgPath 
    imageView?.layer.mask = maskLayer 
}